在我的Mac上使用Kubernetes启动多个nginx实例

为了确认 Kubernetes 的运行情况,我们将在本地的 Mac 上启动多个 nginx 实例来尝试。

在Mac上启用Kubernetes的Docker功能

    • Docker アイコン > Preferences > Kubernetes > Enable Kubernetes > ラジオボタンを Kubernetes にする

 

    • Apply

 

    Install

使用此命令,将安装Kubernetes 的命令行工具 kubectl。

要了解Kubernetes的状态,可以使用kubectl get命令,但如果不知道有哪些资源的话就无法使用。安装Kubernetes Dashboard可以在浏览器中查看信息,非常方便。

$ kubectl version 
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:05:37Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

$ kubectl get pods --all-namespaces -l k8s-app=kubernetes-dashboard
NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
kube-system   kubernetes-dashboard-7b9c7bc8c9-9nhlp   1/1       Running   0          4m

$ kubectl proxy
    • ブラウザで http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ を開く

 

    • Kubernetes Dashboard で Skip を選択

 

    Kubernetes Dashboard が表示される。

上述命令的含义:

kubectl apply

指定されたファイルを元にリソースを設定する。

kubectl get

指定されたリソースの情報を表示する。

pods はリソースの種類
-l (–selector) でフィルタをかけることが出来る。

自动完成设置

在zsh的情况下:

echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc # add autocomplete permanently to your zsh shell

语言备忘录

    • Kubernetes とは、Resource を組み合わせるもの。

 

    • Resource とは、Docker container を組み合わせて使うための色々な部品。

Node: ホストマシンの事。

Namespace: リソースを分けて管理するための名前。

Pod: 一つ以上コンテナ。デプロイの単位。

Deployment: 同じコンテナを複数作るのに使う。またバージョン管理も出来る。

Service: Pod に名前をつけてお互いにアクセス出来るようにする。また外部からアクセス出来るようにする。

Services without Selectors を使うことで、クラスタと外部のサービスの連携を行う事も出来る。

Selector: Pod などを特定するのに使う。

選ばれる側のリソースは metadata.labels に辞書形式で定義する。
選ぶ側のリソースは selector などで指定する。

创建一个 Pod

以下是一个例子,用于定义容器的命令和参数。Pod是一个包含一个或多个容器的资源。

apiVersion: v1
kind: Pod # Kind でリソースの種類を指定する。
metadata:
  name: command-demo # kubectl からこの名前で Pod を参照します。
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["printenv"]
    args: ["HOSTNAME", "KUBERNETES_PORT"]
  restartPolicy: OnFailure

将此文件保存为名为commands.yaml的文件,并执行kubectl apply -f commands.yaml命令,即可创建此Pod。有趣的是,可以在参数中指定URL,作为替代:

kubectl apply -f https://k8s.io/examples/pods/commands.yaml

这个 Pod 会执行 printenv HOSTNAME KUBERNETES_PORT 的操作,以确认它是否正常运行。但它只是会移动并没有其他动作。要检查它的运行状态,请按照以下方式进行。

$ kubectl get pods
NAME           READY     STATUS      RESTARTS   AGE
command-demo   0/1       Completed   0          7m

您可以使用kubectl logs命令来查看输出结果。

$ kubectl logs command-demo 
command-demo
tcp://10.96.0.1:443

要删除 Pod,您可以使用 kubectl delete 命令。有几种方法可以做到。

kubectl delete pod command-demo # 名前を指定
kubectl delete -f commands.yaml # ファイルを指定
kubectl delete pod/command-demo # kubectl get all の出力を使う

在这个例子中,一个 Pod 包含一个容器。由于 Pod 内共享一个 IP 地址,所以据说如果包含多个容器,它们可以通过 localhost 相互通信。

如果想使用本地图像,请在库名称和最新标签之外添加标签。

举个例子来说,以前提到的那个例子来说明。

image: debian

指定了像这样的图像,但在这种情况下将引用远程 Dockerhub 上的图像。如果想使用自己机器上未发布的图像,则需要给仓库名称和除了“latest”之外的标签。

远程工作的例子是引用

hoge
hoge:latest

可以查询本地数据的示例

fuga/hoge:1.0

使用部署

Deployment(部署)是用于部署容器的资源。以下是使用部署来运行无状态应用程序的示例。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx # template.metadata.labels に記載したラベルを指定します。
  replicas: 2 # この数だけ pod を立ち上げます。
  template:
    metadata:
      labels:
        app: nginx # 作成する pod に割り振るラベルを指定します。
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

你可以通过指定URL来执行kubectl apply -f命令,例如:kubectl apply -f https://k8s.io/examples/application/deployment.yaml。执行后的状态如下。

$ kubectl get pods
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-75675f5897-bgrph   1/1       Running   0          1m
nginx-deployment-75675f5897-dpv4m   1/1       Running   0          1m

然而,遗憾的是无法直接从开发机连接到Pod。每个Pod都被分配了一个IP,但是无法从主机端看到。需要先获取Pod的IP,然后使用kubectl run命令在Kubernetes集群中运行容器,使用curl命令访问IP。

$ kubectl describe pod nginx-deployment-75675f5897-bgrph | grep IP 
IP:             10.1.0.67
$ kubectl run curl --image=byrnedo/alpine-curl -i --rm --tty --restart=Never http://10.1.0.67
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

kubectl run: イメージから適当なリソースを作って動かす。

–image: docker image を指定する。
-i: 標準出力を開いたままにする。
–rm: コマンド終了時に作成したリソースを消す。
–tty: コンテナごとに TTY を割り当てる。
–restart:

Always: Deployment を作る。常に再起動する
OnFailure: Job を作る。失敗時再起動する。
Never: Pod だけ作る。再起動はしない。

顺便说一下,要在容器中执行命令,可以使用 kubectl exec。

$ kubectl exec -it nginx-deployment-75675f5897-bgrph -- cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
...

使用服务

好吧,如此下去就无法从外部连接到容器,因此毫无用处。要将容器与外部连接起来,需要使用Service的LoadBalancer类型。

# service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - name: http
      port: 8087 # 公開するポート番号
      targetPort: 80 # Pod のポート番号

服务是一种可以为一组Pod命名并使其能够相互通信的东西。例如,当执行上述的yaml时,在Kubernetes内部的DNS中将注册一个名为nginx的名字,并且能够通过名为nginx的名称访问带有app: nginx标签的Pod。在此示例中,将服务的8087端口转发到Pod的80端口。

kubectl apply -f service.yaml 
kubectl run curl --image=byrnedo/alpine-curl -i --rm --tty --restart=Never http://nginx:8087

在 Service 中,有几种类型可供选择。在这个例子中,我们使用 LoadBalancer,因此可以直接从主机访问到 8087 端口。顺便一提,书上写着 LoadBalancer 不能在本地环境中使用,但是我不经意地尝试了一下,结果还是可以使用的。

curl http://localhost:8087

我已经启动了几个实例并成功从外部进行了访问。尚未完成的任务:

    • ストレージの設定

 

    Helm を使う

Yaml 语法

    • 先頭が – で始まるとリスト。[x, y, z] の形式もリスト

 

    • 途中 : があると辞書。{x: a, y: b, z: c} の形式もリスト

 

    # より後ろはコメント

请提供一个上下文以便我能准确地为您提供中国的翻译。

    • Docker/Kubernetes 実践コンテナ開発入門

 

    Kubernetes Tutorial
广告
将在 10 秒后关闭
bannerAds