理解 Kubernetes 在 GKE 上的使用

image

Kubernetes是一个管理基于容器的系统生命周期的开源工具。
它通常在基础设施1上运行,但这次我们将使用预先准备好的GKE环境,从使用者的角度来学习。

粗略的理解

首先,为了大致了解构架,我们看一下图表。

image

左侧是Kubernetes的控制器,右侧是受管理的容器。以下是需要简单了解的词汇。

    • Node・・Dockerが動くマシンのこと。

 

    • Pod・・コンテナを配置する入れ物。この単位でスケールさせたりします。

 

    Proxy・・コンテナとの通信を経由するプロキシ。

当使用API或命令行进行管理时,由于经常出现以下单词,我将简单地记住它们。

    • Deployments 2・・Pod(コンテナ)を管理するもの

 

    Service 3・・Pod(コンテナ)と通信を維持するためのポリシーなどを定義するもの

为什么要学习?

我們希望使用以下教程來理解 Kubernetes。

    Redis と PHP を使用したゲストブックの作成

因为教程中的信息已经过时(从创建ReplicationController变为创建Deployment),所以我会同时参考以下内容进行操作。

    Guestbook Example

制作这样的东西。

                +--------------+
                | LoadBalancer |
                +--------------+
                       |
                +--------------+
                |   frontend   |
                +--------------+
                   |        |
        +--------------+ +--------------+
        | redis-master | | redis-slave  |
        +--------------+ +--------------+

准备命令环境

我将按照以下方式设置 gcloud 命令和 kubectl 命令:
启动容器引擎。

设定一个默认环境,这样每次输入命令时就不需要指定了。

$ gcloud config set project PROJECT_ID # プロジェクトIDの指定

$ gcloud config set compute/zone asia-northeast1-a # ゾーンの指定

$ gcloud config list # 現在の設定を確認
Your active configuration is: [default]

[compute]
region = asia-northeast1
zone = asia-northeast1-a
[core]
account = EMAIL_ADDRESS
disable_usage_reporting = False
project = PROJECT_ID

创建集群(节点)

首先,我们创建一个容器部署集群(节点)。默认情况下,会创建3个节点,但这次我们指定节点数为1进行创建。

$ gcloud container clusters create guestbook --num-nodes=1
Creating cluster guestbook...done.                                                 
Created [https://container.googleapis.com/v1/projects/{PROJECT_ID}/zones/asia-northeast1-a/clusters/guestbook].
kubeconfig entry generated for guestbook.
NAME       ZONE               MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
guestbook  asia-northeast1-a  1.4.7           104.198.127.169  n1-standard-1  1.4.7         1          RUNNING

由于Kubernetes已经启动,我们可以尝试使用以下命令启动本地代理服务器。

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

当您访问http://localhost:8001/ui/时,会出现Kubernetes的界面。这个界面看起来很棒。

image

创建Redis主节点

创建部署(Pod和容器)。

    redis-master-deployment.yaml ファイル
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis-master # 名前の指定(必須)
spec:
  replicas: 1 # コンテナのレプリカ数の設定
  template:
    metadata:
      labels: # ラベルをKV型で設定
        app: redis
        role: master
        tier: backend
    spec:
      containers:
      - name: master # コンテナの名前
        image: gcr.io/google_containers/redis:e2e # コンテナイメージの指定(必須)
        resources:
          requests:
            cpu: 100m # CPUを0.1コア確保
            memory: 100Mi # メモリ100MiB確保
        ports:
        - containerPort: 6379 # コンテナポートの指定

kube createでこのファイルを読ませるとyamlに記載したとおりのコンテナを作成してくれます。

$ kubectl create -f redis-master-deployment.yaml
deployment "redis-master" created

- Deployment一覧を表示する

```bash
$ kubectl get deployment
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
redis-master   1         1         1            1           2m
    Pod一覧を表示する
$ kubectl get pod
NAME                           READY     STATUS    RESTARTS   AGE
redis-master-343230949-6dmjd   1/1       Running   0          2m

成功创建了 Redis 容器

通过Kubernetes的kubectl run命令来迂回一下。

即使不创建yaml文件,也可以使用kubectl run命令来创建。

kubectl run コマンド

$ kubectl run redis-master \
> --image=gcr.io/google_containers/redis:e2e \
> --labels="app=redis,role=master,tier=backend" \
> --requests="cpu=100m,memory=100Mi" \
> --port=6379
deployment "redis-master-run" created

其实,这样做的话,容器的名称(实际容器名称并非如此)会变成redis-master(默认为Pod名称),并不完全相同。由于找不到设置容器名称的命令参数[^4],所以我试着在–overrides选项中强行进行了设置。

[^4]: kube run命令参考文档

[^4]: kube run命令的参考资料

–overridesオプションをつけてkubectl run

$ kubectl run redis-master \
> --image=gcr.io/google_containers/redis:e2e \
> --labels="app=redis,role=master,tier=backend" \
> --overrides='{"spec":{"template":{"spec":{"containers":[{"name":"master","image":"gcr.io/google_containers/redis:e2e","resources":{"requests":{"cpu":"100m","memory":"100Mi"}},"ports":[{"containerPort":6379}]}]}}}}'
deployment "redis-master" created

由于–image选项是必需的,因此需要在–overrides参数中和容器镜像位置中重复指定。这种方式几乎是将yaml转换为json,有点没有意义的感觉。

为了确认,我将比较”kube describe pod “命令的输出。

$ diff -u redis-master.describe redis-master_run.describe 
--- redis-master.describe 2016-12-29 23:38:58.000000000 +0900
+++ redis-master_run.describe 2016-12-29 23:41:49.000000000 +0900
@@ -1,17 +1,17 @@
-Name:    redis-master-343230949-6dmjd
+Name:    redis-master-343230949-n0sxq
 Namespace: default
 Node:    gke-guestbook-default-pool-af5eb675-xszz/10.146.0.2
-Start Time:  Thu, 29 Dec 2016 22:37:55 +0900
+Start Time:  Thu, 29 Dec 2016 23:40:41 +0900
 Labels:    app=redis
    pod-template-hash=343230949
    role=master
    tier=backend
 Status:    Running
-IP:    10.52.0.11
+IP:    10.52.0.15
 Controllers: ReplicaSet/redis-master-343230949
 Containers:
   master:
-    Container ID:  docker://2f57187ee653673df16d40532528086475aadbff9994540541147285600de612
+    Container ID:  docker://49226c07f4a0ab49503cc46eea01c9382ffe3b62d9d27170ccd8b21f04500365
     Image:   gcr.io/google_containers/redis:e2e
     Image ID:    docker://sha256:e5e67996c442f903cda78dd983ea6e94bb4e542950fd2eba666b44cbd303df42
     Port:    6379/TCP
@@ -19,7 +19,7 @@
       cpu:   100m
       memory:    100Mi
     State:   Running
-      Started:   Thu, 29 Dec 2016 22:38:24 +0900
+      Started:   Thu, 29 Dec 2016 23:40:42 +0900
     Ready:   True
     Restart Count: 0
     Volume Mounts:

只要除了IP地址和日期没有任何更改,我们可以看出这是使用相同设置创建的。

出差 (Deployment)

使用Kubernetes 1.2版本时,Deployment对象可以方便地进行Pod的创建、滚动更新和回滚等操作。

在此之前,Replication Controller负责了这方面的角色,因此在教程中,我们使用Replication Controller创建Pod并进行说明。然而在当前版本(1.4.7)中,通过Deployments创建Pod时,会触发Replication Controller的下一代版本Replica Sets的运行。或许Replication Controller会被取代掉吧。。

[^5]: 复制控制器 – kubernetes.io
[^6]: 副本集 – kubernetes.io

順便一提,Kubernetes的管理界面似乎仍然以Replication Controller为主,通过界面创建Pod时会自动创建Replication Controller。我试一试。

    コマンドラインからコンテナ(Pod)を作成
$ kubectl run cli --image=gcr.io/google-samples/gb-frontend:v4
deployment "cli" created

在这里,通过Kubernetes的用户界面以名为”ui”的方式创建容器。

    2つのPodが作成されています
$ kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
cli-2068554765-12stb   1/1       Running   0          1m
ui-sbpaz               1/1       Running   0          22s
    UIから作成したコンテナは Replication Controller になっています
$ kubectl get replicationcontroller
NAME      DESIRED   CURRENT   READY     AGE
ui        1         1         1         45s
    コマンドラインからはDeploymentになっています
$ kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
cli       1         1         1            1           1m

yaml的配置本身并没有太大变化。要强调的是,在metadata部分省略了labels。

--- legacy/redis-master-controller.yaml 2016-12-28 01:18:16.000000000 +0900
+++ redis-master-deployment.yaml  2016-12-28 01:43:37.000000000 +0900
@@ -1,13 +1,13 @@
-apiVersion: v1
-kind: ReplicationController
+apiVersion: extensions/v1beta1
+kind: Deployment
 metadata:
   name: redis-master
   # these labels can be applied automatically 
   # from the labels in the pod template if not set
-  labels:
-    app: redis
-    role: master
-    tier: backend
+  # labels:
+  #   app: redis
+  #   role: master
+  #   tier: backend
 spec:
   # this replicas value is default
   # modify it according to your case
@@ -15,9 +15,10 @@
   # selector can be applied automatically 
   # from the labels in the pod template if not set
   # selector:
-  #   app: guestbook
-  #   role: master
-  #   tier: backend
+  #   matchLabels:
+  #     app: guestbook
+  #     role: master
+  #     tier: backend
   template:
     metadata:
       labels:

通过SSH登录进行了一个小插曲。

您也可以通过SSH登录到节点。

-o wideでPodが配置されているノードIDを表示させます。

$ kubectl get pod -o wide
NAME                           READY     STATUS    RESTARTS   AGE       IP           NODE
redis-master-343230949-n0sxq   1/1       Running   0          11m       10.52.0.15   gke-guestbook-default-pool-af5eb675-xszz
    上記ノードを指定してSSHログインします。
$ gcloud compute ssh gke-guestbook-default-pool-af5eb675-xszz
Warning: Permanently added 'compute.7579721538501918346' (RSA) to the list of known hosts.

Welcome to Kubernetes v1.4.7!

You can find documentation for Kubernetes at:
  http://docs.kubernetes.io/

The source for this release can be found at:
  /home/kubernetes/kubernetes-src.tar.gz
Or you can download it at:
  https://storage.googleapis.com/kubernetes-release/release/v1.4.7/kubernetes-src.tar.gz

It is based on the Kubernetes source at:
  https://github.com/kubernetes/kubernetes/tree/v1.4.7

For Kubernetes copyright and licensing information, see:
  /home/kubernetes/LICENSES
user@gke-guestbook-default-pool-af5eb675-xszz ~ $
    ログイン出来たので”docker ps”コマンドを実行してみます。kubernetes関連のコンテナが沢山動いてますね。
user@gke-guestbook-default-pool-af5eb675-xszz ~ $ docker ps
CONTAINER ID        IMAGE                                                                  COMMAND                  CREATED             STATUS              PORTS               NAMES
49226c07f4a0        gcr.io/google_containers/redis:e2e                                     "redis-server /etc/re"   12 minutes ago      Up 12 minutes                           k8s_master.b505b5b1_redis-master-343230949-n0sxq_default_c5e1c119-cdd4-11e6-9059-42010a920020_d5ed9c19
f2e1a93483ef        gcr.io/google_containers/pause-amd64:3.0                               "/pause"                 12 minutes ago      Up 12 minutes                           k8s_POD.d8dbe16c_redis-master-343230949-n0sxq_default_c5e1c119-cdd4-11e6-9059-42010a920020_594d5d61
ed54277b3108        asia.gcr.io/google_containers/addon-resizer:1.6                        "/pod_nanny --cpu=80m"   2 hours ago         Up 2 hours                              k8s_heapster-nanny.55df2c69_heapster-v1.2.0-1847815531-zrkw6_kube-system_378ff7ba-cdc2-11e6-9059-42010a920020_84f3de55
22a3bf8a8816        asia.gcr.io/google_containers/heapster:v1.2.0                          "/heapster --source=k"   2 hours ago         Up 2 hours                              k8s_heapster.d8c9b305_heapster-v1.2.0-1847815531-zrkw6_kube-system_378ff7ba-cdc2-11e6-9059-42010a920020_b3e26ab1
b4bb94588700        gcr.io/google_containers/pause-amd64:3.0                               "/pause"                 2 hours ago         Up 2 hours                              k8s_POD.d8dbe16c_heapster-v1.2.0-1847815531-zrkw6_kube-system_378ff7ba-cdc2-11e6-9059-42010a920020_f00e16d7
262de7613d9e        asia.gcr.io/google_containers/exechealthz-amd64:1.2                    "/exechealthz '--cmd="   2 hours ago         Up 2 hours                              k8s_healthz.aaa6418e_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_19442f61
218ef4491c93        asia.gcr.io/google_containers/kube-dnsmasq-amd64:1.4                   "/usr/sbin/dnsmasq --"   2 hours ago         Up 2 hours                              k8s_dnsmasq.daf813d2_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_da4ffbd1
02b6c5abe863        asia.gcr.io/google_containers/kubedns-amd64:1.8                        "/kube-dns --domain=c"   2 hours ago         Up 2 hours                              k8s_kubedns.dc925936_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_226b6b62
9fc09d1f352d        asia.gcr.io/google_containers/defaultbackend:1.0                       "/server"                2 hours ago         Up 2 hours                              k8s_default-http-backend.8208ca2c_l7-default-backend-v1.0-shaxn_kube-system_251d5635-cdc2-11e6-9059-42010a920020_22aef95d
61d5ea514139        asia.gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0        "/dashboard --port=90"   2 hours ago         Up 2 hours                              k8s_kubernetes-dashboard.44adcd81_kubernetes-dashboard-v1.4.0-ev5z4_kube-system_2538ca75-cdc2-11e6-9059-42010a920020_3c45962e
ddc295bd5b86        asia.gcr.io/google_containers/fluentd-gcp:1.21                         "/bin/sh -c 'rm /lib/"   2 hours ago         Up 2 hours                              k8s_fluentd-cloud-logging.9d1761e_fluentd-cloud-logging-gke-guestbook-default-pool-af5eb675-xszz_kube-system_9d40f2ab7a284a2e847ba6ea821d674b_08346356
b5a7f7a969fe        gcr.io/google_containers/pause-amd64:3.0                               "/pause"                 2 hours ago         Up 2 hours                              k8s_POD.d8dbe16c_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_cfddc70c
2625088adb2d        gcr.io/google_containers/pause-amd64:3.0                               "/pause"                 2 hours ago         Up 2 hours                              k8s_POD.d8dbe16c_l7-default-backend-v1.0-shaxn_kube-system_251d5635-cdc2-11e6-9059-42010a920020_2eb5e129
6904e351db39        gcr.io/google_containers/pause-amd64:3.0                               "/pause"                 2 hours ago         Up 2 hours                              k8s_POD.d8dbe16c_kubernetes-dashboard-v1.4.0-ev5z4_kube-system_2538ca75-cdc2-11e6-9059-42010a920020_536e1b7b
7672d253bc84        gcr.io/google_containers/pause-amd64:3.0                               "/pause"                 2 hours ago         Up 2 hours                              k8s_POD.d8dbe16c_fluentd-cloud-logging-gke-guestbook-default-pool-af5eb675-xszz_kube-system_9d40f2ab7a284a2e847ba6ea821d674b_85d10a63
16bdffccc672        gcr.io/google_containers/kube-proxy:31be43b1cb619b7b0ab8fe01f997fe2f   "/bin/sh -c 'kube-pro"   2 hours ago         Up 2 hours                              k8s_kube-proxy.3ea31aa7_kube-proxy-gke-guestbook-default-pool-af5eb675-xszz_kube-system_0a4a2e1c974bec66debcc5815d60085a_0833b062
9cacc1697cf5        gcr.io/google_containers/pause-amd64:3.0                               "/pause"                 2 hours ago         Up 2 hours                              k8s_POD.d8dbe16c_kube-proxy-gke-guestbook-default-pool-af5eb675-xszz_kube-system_0a4a2e1c974bec66debcc5815d60085a_20190c5a

途径(SSH登录用户)

通过使用以下命令格式,可以使用本地环境的用户名进行连接而不带USER参数:gcloud compute ssh [USER@]INSTANCE(与常规SSH操作相同)。用户将自动创建并注册到GCE。
您可以从以下位置查看注册的用户和SSH公钥:
https://console.cloud.google.com/compute/metadata/sshKeys

创建Redis主节点服务

我們將創建一個用於與容器通信的服務。

    redis-master-service.yaml ファイル
apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    app: redis
    role: master
    tier: backend
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
    role: master
    tier: backend
    yamlファイルを読み込んでサービスを作成します。
$ kubectl create -f redis-master-service.yaml
service "redis-master" created
    サービスの情報を表示します。
$ kubectl get service redis-master
NAME           CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
redis-master   10.55.246.114   <none>        6379/TCP   43s
    もちろん、コマンドラインでサービスを作成することもできます。
$ kubectl expose service redis-master \
> --labels="app=redis,role=master,tier=backend" \
> --selector="app=redis,role=master,tier=backend" \
> --port=6379 \
> --target-port=6379

Redis スレーブのコンテナとサービス作成

我们将创建容器和服务,就像创建Redis主节点一样。

    redis-slave-deployment.yaml ファイル
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis-slave
spec:
  replicas: 2 # レプリカ数を2に指定
  template:
    metadata:
      labels:
        app: redis
        role: slave
        tier: backend
    spec:
      containers:
      - name: slave
        image: gcr.io/google_samples/gb-redisslave:v1
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM # 環境変数をセットしています。PHPのアプリケーションで使います。
          value: dns
        ports:
        - containerPort: 6379
    コンテナを作成してPod数が2になっていることを確認します。
$ kubectl create -f redis-slave-deployment.yaml 
deployment "redis-slave" created

$ kubectl get deployment redis-slave
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
redis-slave   2         2         2            0           24s # 2になっている

$ kubectl get pod 
NAME                           READY     STATUS    RESTARTS   AGE
redis-master-343230949-08kqi   1/1       Running   0          7m
redis-slave-132015689-3x3qp    1/1       Running   0          48s # 1Pod目
redis-slave-132015689-b6cha    1/1       Running   0          48s # 2Pod目

我可以看到有两个Redis从节点的Pod。接下来我们创建一个服务。

    redis-slave-service.yaml ファイル
apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    app: redis
    role: slave
    tier: backend
spec:
  ports:
  - port: 6379
  selector:
    app: redis
    role: slave
    tier: backend
    redis-slaveのサービスを作成して確認します。
$ kubectl create -f redis-slave-service.yaml
service "redis-slave" created

$ kubectl get svc redis-slave # servicesを"svc"と省略することができます。
NAME          CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
redis-slave   10.55.255.111   <none>        6379/TCP   18s

创建前端Web服务器

由于后端(redis)已被创建,现在我们将着手创建前端部分。

    front-deployment.yaml ファイル
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google-samples/gb-frontend:v4
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80
    frontendを作成して確認します。
$ kubectl create -f frontend-deployment.yaml
deployment "frontend" created

 kubectl get deployment frontend
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
frontend   3         3         3            3           1m

$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
frontend-88237173-cp3rn        1/1       Running   0          1m
frontend-88237173-kxlgh        1/1       Running   0          1m
frontend-88237173-tw65g        1/1       Running   0          1m
redis-master-343230949-08kqi   1/1       Running   0          29m
redis-slave-132015689-3x3qp    1/1       Running   0          22m
redis-slave-132015689-b6cha    1/1       Running   0          22m

我将创建一个专门用于前端的服务。由于前端需要实现多台负载均衡,所以选择了type: LoadBalancer进行指定。

    frontend-service.yaml ファイル
apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: guestbook
    tier: frontend
$ kubectl create -f frontend-service.yaml 
service "frontend" created

$ kubectl get svc frontend
NAME       CLUSTER-IP      EXTERNAL-IP     PORT(S)   AGE
frontend   10.55.254.255   104.198.125.6   80/TCP    3m

当指定为 LoadBalancer 时,会创建一个独立的 GCE 负载均衡器。默认情况下,它没有进行健康检查等配置,因此根据需要需要进行更改。

image

当我在浏览器中访问EXTERNAL_IP时,我可以看到以下的屏幕。

image

PHP代码的内容

我想要确认一下这个应用程序是用PHP编写的以确定它在做什么。

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

require 'Predis/Autoloader.php';

Predis\Autoloader::register();

if (isset($_GET['cmd']) === true) {
  $host = 'redis-master';
  if (getenv('GET_HOSTS_FROM') == 'env') {
    $host = getenv('REDIS_MASTER_SERVICE_HOST');
  }
  header('Content-Type: application/json');
  if ($_GET['cmd'] == 'set') {
    $client = new Predis\Client([
      'scheme' => 'tcp',
      'host'   => $host,
      'port'   => 6379,
    ]);

    $client->set($_GET['key'], $_GET['value']);
    print('{"message": "Updated"}');
  } else {
    $host = 'redis-slave';
    if (getenv('GET_HOSTS_FROM') == 'env') {
      $host = getenv('REDIS_SLAVE_SERVICE_HOST');
    }
    $client = new Predis\Client([
      'scheme' => 'tcp',
      'host'   => $host,
      'port'   => 6379,
    ]);

    $value = $client->get($_GET['key']);
    print('{"data": "' . $value . '"}');
  }
} else {
  phpinfo();
} ?>

如果是写入操作,连接到Redis的主节点;如果是读取操作,连接到Redis的从节点。Redis的主节点的主机名为redis-master,从节点为redis-slave。这意味着在创建Redis部署时指定的名称已经在容器的DNS空间中生效。

有时候也会不使用DNS,所以我们加入了这个判断if (getenv(‘GET_HOSTS_FROM’) == ‘env’) {,以便可以使用环境变量。

由于在 frontend-deployment.yaml 中进行了以下配置,因此在此PHP代码中使用了DNS名称。

...
        env:
        - name: GET_HOSTS_FROM
          value: dns            # envにするとPHPが環境変数を使うようになる
...

试着改变复制品的数量

可以轻松地在中途改变复制品的数量。

    レプリカ数を5へ変更する
$ kubectl scale deployment frontend --replicas=5
deployment "frontend" scaled
    5になっていることが分かります。
$ kubectl get deployment frontend
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
frontend   5         5         5            5           51m
    Podを見ると増えているのが分かります
$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
frontend-88237173-cp3rn        1/1       Running   0          26m
frontend-88237173-kuyzx        1/1       Running   0          6s   # 増えたPod
frontend-88237173-kxlgh        1/1       Running   0          26m
frontend-88237173-sljba        1/1       Running   0          6s   # 増えたPod
frontend-88237173-tw65g        1/1       Running   0          26m
redis-master-343230949-08kqi   1/1       Running   0          53m
redis-slave-132015689-3x3qp    1/1       Running   0          47m
redis-slave-132015689-b6cha    1/1       Running   0          47m

寄一個方向(kube編輯)

您可以使用kube edit命令来更改副本数量和其他配置。

$ KUBE_EDITOR=vim kubectl edit deployment frontend # デフォルトエディタはvi

您可以通过使用上述命令打开配置文件(yaml),然后进行修改并保存,以更改设置。

障碍发生时Pod的行为

我想用命令删除Pod并模拟故障。

    シミュレーションする前に状態を確認します。
$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
frontend-88237173-cp3rn        1/1       Running   0          53m
frontend-88237173-kxlgh        1/1       Running   0          53m
frontend-88237173-tw65g        1/1       Running   0          53m
redis-master-343230949-08kqi   1/1       Running   0          1h
redis-slave-132015689-3x3qp    1/1       Running   0          1h
redis-slave-132015689-b6cha    1/1       Running   0          1h
    Podを一つ削除します。
$ kubectl delete pod frontend-88237173-cp3rn
pod "frontend-88237173-cp3rn" deleted
    即座に新しいPodが作成されています。
$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
frontend-88237173-0omu3        1/1       Running   0          3s   # 直ぐPodが作成された
frontend-88237173-kxlgh        1/1       Running   0          54m
frontend-88237173-tw65g        1/1       Running   0          54m
redis-master-343230949-08kqi   1/1       Running   0          1h
redis-slave-132015689-3x3qp    1/1       Running   0          1h
redis-slave-132015689-b6cha    1/1       Running   0          1h

成功地重制了复制品。

尝试更改标签

我想要确认一下Kubernetes据说可以通过检查标签来检查副本数量,如果标签有变动,我想要了解它的行为。

    ラベルがtier=frontend のPodを表示します。
$ kubectl get pod -l tier=frontend
NAME                      READY     STATUS    RESTARTS   AGE
frontend-88237173-0omu3   1/1       Running   0          21m  # このPodのラベルを変更する
frontend-88237173-fadzg   1/1       Running   0          1m
frontend-88237173-tw65g   1/1       Running   0          1h
    ひとつのPodのラベルを変更します。
$ kubectl label --overwrite pods frontend-88237173-0omu3 tier=middle
pod "frontend-88237173-0omu3" labeled
    ラベルがtier=frontendのPodを表示します。新しいPodに入れ替っているのが分かります。
$ kubectl get pod -l tier=frontend
NAME                      READY     STATUS    RESTARTS   AGE
frontend-88237173-fadzg   1/1       Running   0          2m
frontend-88237173-kkjpu   1/1       Running   0          4s   # 新しいPodに変わっている
frontend-88237173-tw65g   1/1       Running   0          1h
    frontendとしてレプリカ数は維持しています。
$ kubectl get deployment frontend
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
frontend   3         3         3            3           1h   # Podの数は変わらない
    変更したPodはDeployment外に存在しています。
$ kubectl get pod -l tier=middle
NAME                      READY     STATUS    RESTARTS   AGE
frontend-88237173-0omu3   1/1       Running   0          22m # 変更したPodは存在している

这边也维持了一个出色的复制品。

清洁

删除所有资源。

$ kubectl delete service,deployment --all
service "frontend" deleted
service "kubernetes" deleted
service "redis-master" deleted
service "redis-slave" deleted
deployment "frontend" deleted
deployment "redis-master" deleted
deployment "redis-slave" deleted

$ gcloud container clusters delete guestbook
The following clusters will be deleted.
 - [guestbook] in [asia-northeast1-a]

Do you want to continue (Y/n)?  Y

Deleting cluster guestbook...done.                                                 
Deleted [https://container.googleapis.com/v1/projects/{PROJECT_ID}/zones/asia-northeast1-a/clusters/guestbook].

最后

我觉得容器的操作很简单,不仅供应也很容易,但我认为最大的魅力是在运营中有灵活的管理。下一步,我希望学习更接近实践的内容,例如滚动更新等。

那么,

选择合适的解决方案 – kubernetes.io

部署 – kubernetes.io

服务 – kubernetes.io

广告
将在 10 秒后关闭
bannerAds