centos7
kubectl

kubectlコマンドの使い方(1.2)

1 コマンド一覧(kubernetes 1.2)

以下は、man kubectlから抜粋したもの。

  • kubectl get
  • kubectl describe
  • kubectl create
  • kubectl create namespace
  • kubectl create secret
  • kubectl create secret docker-registry
  • kubectl create secret generic
  • kubectl create configmap
  • kubectl create serviceaccount
  • kubectl replace
  • kubectl patch
  • kubectl delete
  • kubectl edit
  • kubectl apply
  • kubectl namespace
  • kubectl logs
  • kubectl rolling-update
  • kubectl scale
  • kubectl cordon
  • kubectl drain
  • kubectl uncordon
  • kubectl attach
  • kubectl exec
  • kubectl port-forward
  • kubectl proxy
  • kubectl run
  • kubectl stop
  • kubectl expose
  • kubectl autoscale
  • kubectl rollout
  • kubectl rollout history
  • kubectl rollout undo
  • kubectl rollout pause
  • kubectl rollout resume
  • kubectl label
  • kubectl annotate
  • kubectl config
  • kubectl config view
  • kubectl config set-cluster
  • kubectl config set-credentials
  • kubectl config set-context
  • kubectl config set
  • kubectl config unset
  • kubectl config current-context
  • kubectl config use-context
  • kubectl cluster-info
  • kubectl api-versions
  • kubectl version
  • kubectl explain
  • kubectl convert

2 検証環境

  • master,node1の2台構成。master,node1はホスト名.
  • VMware Workstation 12 Player上で動作する仮想マシン。OSはCentOS7.2
+--- master ---+    +---- node1 ---+
|              |    |              |
|   CentOS7.2  |    |   CentOS7.2  |
|              |    |              |
+--------------+    +--------------+
+----------------------------------+
|   VMware Workstation 12 Player   |
+----------------------------------+

3 コマンドの使い方

3.1 事前準備

bash-completionパッケージを導入することで、kubectlコマンドでTAB補完ができるようになります(便利になる)。

[root@master ~]# yum -y epel-release
[root@master ~]# yum -y bash-completion

bash-completionを有効にするため、一回ログアウトして、再度ログインしなおす(他の方法もある、と思います。。)

kubectlとタイプしたあと、"TAB"を押下すると、下記のサブコマンド一覧が表示される。
[root@master ~]# kubectl
annotate        autoscale       cordon          drain           expose          namespace       replace         scale
api-versions    cluster-info    create          edit            get             patch           rolling-update  uncordon
apply           config          delete          exec            label           port-forward    rollout         version
attach          convert         describe        explain         logs            proxy           run
[root@master ~]# kubectl

3.2 kubectl run/kubectl get/kubectl delete

Podを1つ起動する方法
Podを起動する。runに指定する文字列(下記例はnginx)は任意です。
[root@master ~]# kubectl run nginx --image=nginx
deployment "nginx" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-lw9zo   1/1       Running   0          22s

Podがどのホスト(マスタ、またはノード)で動いてるのかを確認する。-o wideオプションを指定する。Podがmasterで動作していることがわかる。
[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       NODE
nginx-2040093540-lw9zo   1/1       Running   0          28s       master

Deploymentの状態を確認する。
[root@master ~]# kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     1         1         1            1           8m

Podを終了する。Podの名前ではなく、Deploymentの名前を指定すること。
[root@master ~]# kubectl delete deployment nginx
deployment "nginx" deleted
[root@master ~]# kubectl get pod
[root@master ~]#
Podを複数起動する方法(--replicas)
Podを2つ起動する。"--replicas=2"を指定する。
[root@master ~]# kubectl run nginx --image=nginx --replicas=2
deployment "nginx" created

Podの状態を確認する。Podが2つ起動していることがわかる。
[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       NODE
nginx-2040093540-5932k   1/1       Running   0          27s       master
nginx-2040093540-mpnrw   1/1       Running   0          27s       master

Podを終了する。
[root@master ~]# kubectl delete deployment nginx
deployment "nginx" deleted
[root@master ~]# kubectl get pod
[root@master ~]#
Podに環境変数を渡す方法(--env)
Podを起動する。
[root@master ~]# kubectl run nginx --image=nginx --env="TEST=test1"
deployment "nginx" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-3180491960-163ut   1/1       Running   0          31s

Podでbashを実行する。
[root@master ~]# kubectl exec nginx-3180491960-163ut -it bash

環境変数を表示する。
root@nginx-3180491960-163ut:/# echo $TEST
test1

root@nginx-3180491960-163ut:/# exit
exit
Podにラベルを付ける方法(--labels)
Podに"os=linux"というラベルをつけて起動する。
[root@master ~]# kubectl run nginx --image=nginx --labels="os=linux"
deployment "nginx" created

ラベルを確認する。"os=linux"というラベルが付いていることがわかる。
[root@master ~]# kubectl get pod --show-labels
NAME                     READY     STATUS    RESTARTS   AGE       LABELS
nginx-3952892669-fmqbt   1/1       Running   0          15s       os=linux,pod-template-hash=3952892669

違うラベルを持ったPodを起動する。
[root@master ~]# kubectl run nginx1 --image=nginx --labels="os=windows"
deployment "nginx1" created

ラベルを確認する。ラベルが付いていることがわかる。
[root@master ~]# kubectl get pod --show-labels
NAME                      READY     STATUS    RESTARTS   AGE       LABELS
nginx-3952892669-fmqbt    1/1       Running   0          4m        os=linux,pod-template-hash=3952892669
nginx1-3838991369-1yuur   1/1       Running   0          14s       os=windows,pod-template-hash=3838991369

キーが"os"のものだけを表示する。
[root@master ~]# kubectl get pod -L os
NAME                      READY     STATUS    RESTARTS   AGE       OS
nginx-3952892669-fmqbt    1/1       Running   0          5m        linux
nginx1-3838991369-1yuur   1/1       Running   0          1m        windows

3.3 kubectl describe (getの詳細バージョン)

リソースの一覧を表示する。"get"とタイプしたあとに"Tab"キーを押下する。
[root@master ~]# kubectl get
componentstatus             ingress                     pod                         securitycontextconstraints
configmap                   job                         podsecuritypolicy           service
daemonset                   limitrange                  podtemplate                 serviceaccount
deployment                  namespace                   replicaset                  thirdpartyresource
endpoints                   node                        replicationcontroller
event                       persistentvolume            resourcequota
horizontalpodautoscaler     persistentvolumeclaim       secret

Podの状態を取得する。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-4g0um   1/1       Running   0          21s

Podの状態を取得する。getに比べより詳細な情報が得られる。
[root@master ~]# kubectl describe pod nginx-2040093540-4g0um
Name:           nginx-2040093540-4g0um
Namespace:      default
Node:           master/192.168.0.100
Start Time:     Thu, 03 Nov 2016 22:28:17 +0900
Labels:         pod-template-hash=2040093540,run=nginx
Status:         Running
IP:             10.1.57.2
Controllers:    ReplicaSet/nginx-2040093540
Containers:
  nginx:
    Container ID:       docker://fe90e85dcb1b58659e748b045c7487723ad07bc475d45b3322718820e07b0b72
    Image:              nginx
    Image ID:           docker://sha256:e43d811ce2f4986aa69bc8ba6c92f0789537f604d1601e0b6ec024e1c38062b4
    Port:
    QoS Tier:
      memory:           BestEffort
      cpu:              BestEffort
    State:              Running
      Started:          Thu, 03 Nov 2016 22:28:32 +0900
    Ready:              True
    Restart Count:      0
    Environment Variables:
Conditions:
  Type          Status
  Ready         True
No volumes.
Events:
  FirstSeen     LastSeen        Count   From                    SubobjectPath           Type            Reason          Message
  ---------     --------        -----   ----                    -------------           --------        ------          -------
  38s           38s             1       {default-scheduler }                            Normal          Scheduled       Successfully assigned nginx-2040093540-4g0um to 127.0.0.1
  36s           36s             1       {kubelet master}     spec.containers{nginx}  Normal          Pulling         pulling image "nginx"
  25s           25s             1       {kubelet master}     spec.containers{nginx}  Normal          Pulled          Successfully pulled image "nginx"
  24s           24s             1       {kubelet master}     spec.containers{nginx}  Normal          Created         Created container with docker id fe90e85dcb1b
  23s           23s             1       {kubelet master}     spec.containers{nginx}  Normal          Started         Started container with docker id fe90e85dcb1b

[root@master ~]#

3.4 kubectl create(リソースを作成する)

Deploymentのテンプレートファイルの内容は以下のとおり
[root@master ~]# cat nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

テンプレートファイル名を引数にしてDeployment を作成する。
[root@master ~]# kubectl create -f nginx-deployment.yaml
deployment "nginx-deployment" created

作成したDeploymentの状態を確認する。Deploymentの名前は"nginx-deployment"であることがわかる。
[root@master ~]# kubectl get deployment
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1         1         1            1           2m


Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-2035384211-xggt8   1/1       Running   0          2m

Deploymentを削除する。
[root@master ~]# kubectl delete deployment nginx-deployment
deployment "nginx-deployment" deleted

Podの状態を確認する。Deploymentを削除すると、Podも停止していることがわかる。
[root@master ~]# kubectl get pod
[root@master ~]#

3.5 kubectl create namespace(ネームスペースを作成する)

name1というnamespaceを作成する。
[root@master ~]# kubectl create namespace name1
namespace "name1" created

name2というnamespaceを作成する。
[root@master ~]# kubectl create namespace name2
namespace "name2" created

作成したnamespaceを確認する。
[root@master ~]# kubectl get namespace
NAME          STATUS    AGE
default       Active    61d
name1         Active    2m
name2         Active    2m

name1とname2でそれぞれPodを起動する。
[root@master ~]# kubectl run nginx --image=nginx --namespace=name1
deployment "nginx" created
[root@master ~]# kubectl run nginx --image=nginx --namespace=name2
deployment "nginx" created

Podの状態を確認する。name1,name2でそれぞれPodが動作していることがわかる。
[root@master ~]# kubectl get pod --all-namespaces
NAMESPACE   NAME                     READY     STATUS    RESTARTS   AGE
name1       nginx-2040093540-npjtb   1/1       Running   0          44s
name2       nginx-2040093540-7njdh   1/1       Running   0          39s

Podを終了する。
[root@master ~]# kubectl delete deployment nginx --namespace=name1
deployment "nginx" deleted
[root@master ~]# kubectl delete deployment nginx --namespace=name2
deployment "nginx" deleted

Podの状態を確認する。
[root@master ~]# kubectl get pod --all-namespaces
[root@master ~]#

3.6 kubectl create secret (secretを作成する)

secretとしてPodにマウントする情報は以下の2つの情報。
[root@master secrets]# cat username.txt
foo
[root@master secrets]# cat pass.txt
12345

"mysecret"という名前のsecretを作成する。
[root@master secrets]# kubectl create secret generic mysecret --from-file=./username.txt --from-file=./pass.txt
secret "mysecret" created

secretの状態を確認する。
[root@master secrets]# kubectl get secret
NAME                  TYPE                                  DATA      AGE
mysecret              Opaque                                2         5s

secretの詳細情報を確認する。
[root@master secrets]# kubectl describe secret mysecret
Name:           mysecret
Namespace:      default
Labels:         <none>
Annotations:    <none>

Type:   Opaque

Data
====
username.txt:   4 bytes  <= ファイルの中身そのものはでなく、ファイルのバイト数が表示される。
pass.txt:       6 bytes  <= ファイルの中身そのものはでなく、ファイルのバイト数が表示される。


Podを起動するためのテンプレートを確認する。/tmp/mysecにmysecretという名前のsecretをマウントする。
[root@master secrets]# cat secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: secretstest1  <= Podに付けるラベル名を指定する(任意の名前)
  name: secretstest     <= Podの名前を指定する(任意の名前)
spec:
  volumes:
    - name: "secretstest"
      secret:
        secretName: mysecret   <= マウントするsecretの名前を指定する。
  containers:
    - image: nginx:1.7.1
      name: awebserver
      volumeMounts:
        - mountPath: "/tmp/mysec"   <= secretをマウントするPod内のパス。
          name: "secretstest"

Podを起動する。
[root@master secrets]# kubectl create -f secret-pod.yaml
pod "secretstest" created

Podの状態を確認する。
[root@master secrets]# kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
secretstest            1/1       Running   0          31s

Podのラベルを確認する。
[root@master secrets]# kubectl get pod --show-labels
NAME          READY     STATUS    RESTARTS   AGE       LABELS
secretstest   1/1       Running   0          35s       name=secretstest1

secretの中身を確認する。
[root@master secrets]# kubectl exec -it secretstest bash
root@secretstest:/usr/local/nginx/html# cat /tmp/mysec/pass.txt
12345
root@secretstest:/usr/local/nginx/html# cat /tmp/mysec/username.txt
foo
root@secretstest:/usr/local/nginx/html# exit
exit
[root@master secrets]#

3.7 kubectl create configmap (configmapを作成する)

configmapは、ホストからPodに設定情報(key,valueの組)を渡すときに使うリソースです。

-----------------------------------
1. ConfigMapを作成する。
-----------------------------------
ConfigMapを作成する。
[root@master ~]# vi config.yaml
[root@master ~]# cat config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: test-config
data:
  # key, value形式で設定を記述する
  test1: '11111'
  test2: '22222'

ConfigMapを作成する。
[root@master ~]# kubectl create -f config.yaml
configmap "test-config" created

作成したConfigMapを確認する。
[root@master ~]# kubectl get configmap
NAME          DATA      AGE
test-config   2         11s

作成したConfigMapの詳細情報を確認する。
[root@master ~]# kubectl describe configmap test-config
Name:           test-config
Namespace:      default
Labels:         <none>
Annotations:    <none>

Data
====
test1:  5 bytes   <===== '11111'のサイズが表示される。
test2:  5 bytes   <===== '22222'のサイズが表示される。

-----------------------------------
2. 作成したConfigMapをPodに渡す
-----------------------------------
Podの定義ファイルを作成する。
[root@master ~]# vi pod.yaml
[root@master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: example-container
      image: busybox
      # あとからexecで操作するためsleepさせておく
      command: ["sleep", "3600"]
      # ConfigMapをマウントする
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # ConfigMapリソースの名前を指定する(kubectl get configmapで得られる名前)
        name: test-config

Podを起動する。
[root@master ~]# kubectl create -f pod.yaml
pod "test-pod" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME       READY     STATUS    RESTARTS   AGE
test-pod   1/1       Running   0          26s

Podのshを起動して、ConfigMapのKey,Valueを確認する。
[root@master ~]# kubectl exec -it test-pod sh
/ # cat /etc/config/test1
11111/ #
/ # cat /etc/config/test2
22222/ #

-----------------------------------------------------------
3. 動的にConfigMapを変更する。変更したConfigMapをPodで参照する。
------------------------------------------------------------
ConfigMapを動的に変更する。
[root@master ~]# kubectl edit configmap test-config
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  test1: "88888"  <=== '11111'から'88888'に変更する。
  test2: "99999"  <=== '22222'から'99999'に変更する。
kind: ConfigMap
"/tmp/kubectl-edit-np3nb.yaml" 16L, 503C

Podを起動する。
[root@master ~]# kubectl get pod
NAME       READY     STATUS    RESTARTS   AGE
test-pod   1/1       Running   0          4m

ConfigMapのValueを確認する。Valueが変更されていることが確認できる。
[root@master ~]# kubectl exec -it test-pod sh
/ # cat /etc/config/test1
88888/ #
/ # cat /etc/config/test2
99999/ #
/ # exit

3.8 kubectl exec (Podでコマンドを実行する)

Podを起動する。
[root@master2 ~]# kubectl run nginx --image=nginx
deployment "nginx" created

Podの状態を確認する。
[root@master2 ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-69r4e   1/1       Running   0          13s

Podでコマンドを実行する。
[root@master2 ~]# kubectl exec nginx-2040093540-69r4e -it bash

psコマンドを実行する。nginxが動いていることがわかる。
root@nginx-2040093540-69r4e:/# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.7  0.2  31760  2856 ?        Ss   01:17   0:00 nginx: master
nginx         8  0.0  0.1  32152  1408 ?        S    01:17   0:00 nginx: worker
root          9  4.8  0.1  20216  1912 ?        Ss   01:17   0:00 bash
root         17  0.0  0.1  17492  1148 ?        R+   01:17   0:00 ps aux

unameコマンドを実行する。Linuxの版数が確認できる。
root@nginx-2040093540-69r4e:/# uname -r
3.10.0-327.el7.x86_64

コンテナから抜ける
root@nginx-2040093540-69r4e:/# exit
exit
[root@master2 ~]#


----------------------------------------------------
1つのPodで2つのコンテナを起動した場合のexec実施例
----------------------------------------------------
Pod定義ファイルを作成する。
[root@master2 ~]# vi multi_os.yaml
[root@master2 ~]# cat multi_os.yaml
apiVersion: v1
kind: Pod
metadata:
  name: multiple-container
spec:
  containers:
    - name: busybox
      image: busybox
      command: ["sleep", "3600"]
    - name: centos7
      image: centos
      command: ["sleep", "3600"]

Podを起動する。
[root@master2 ~]# kubectl create -f multi_os.yaml
pod "multiple-container" created

busyboxのコンテナでコマンドを実行する。
[root@master2 ~]# kubectl exec multiple-container -c busybox -it sh
/ # uname -r
3.10.0-327.el7.x86_64
/ # exit
[root@master2 ~]#


centosのコンテナでコマンドを実行する。
[root@master2 ~]# kubectl exec multiple-container -c centos7 -it bash
[root@multiple-container /]# uname -r
3.10.0-327.el7.x86_64
[root@multiple-container /]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@multiple-container /]# exit
exit
[root@master2 ~]#


----------------------------------------------------
Podの詳細情報の確認
----------------------------------------------------
[root@master2 ~]# kubectl describe pod multiple-container
Name:           multiple-container
Namespace:      default
Node:           master2/192.168.0.20
Start Time:     Sat, 07 Jan 2017 11:05:13 +0900
Labels:         <none>
Status:         Running
IP:             172.17.0.2
Controllers:    <none>
Containers:
  busybox:
    Container ID:       docker://075b790da0ff3404d9567e92a9ac5d2efb55231734633723f5fc0143ea866822
    Image:              busybox
    Image ID:           docker://sha256:8a4698b1752b8142df16b73eca10c8b03fbd2ccbbd03cfd47882f04ace12de66
    Port:
    Command:
      sleep
      3600
    QoS Tier:
      memory:           BestEffort
      cpu:              BestEffort
    State:              Running
      Started:          Sat, 07 Jan 2017 11:05:29 +0900
    Ready:              True
    Restart Count:      0
    Environment Variables:
  centos7:
    Container ID:       docker://780ded7a424d58315ab2ea8b580eef7c2d11929286abfe37be899f6a8b6ac931
    Image:              centos
    Image ID:           docker://sha256:67591570dd29de0e124ee89d50458b098dbd83b12d73e5fdaf8b4dcbd4ea50f8
    Port:
    Command:
      sleep
      3600
    QoS Tier:
      memory:           BestEffort
      cpu:              BestEffort
    State:              Running
      Started:          Sat, 07 Jan 2017 11:05:20 +0900
    Ready:              True
    Restart Count:      0
    Environment Variables:
Conditions:
  Type          Status
  Ready         True

-以下、略-

3.9 kubectl scale(Podの数を増減する)


Podを1つ起動する。
[root@master ~]# kubectl run nginx --image=nginx
deployment "nginx" created

Podの状態を確認する。Podが1つ動いていることがわかる。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-xfxj6   1/1       Running   0          18s

Podを2個に増やす。
[root@master ~]# kubectl scale deployment nginx --replicas=2
deployment "nginx" scaled

Podの状態を確認する。Podが2個になったことがわかる。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-d2c6a   1/1       Running   0          21s
nginx-2040093540-xfxj6   1/1       Running   0          1m

Podを終了する。
[root@master ~]# kubectl delete deployment nginx
deployment "nginx" deleted
[root@master ~]# kubectl get pod
[root@master ~]#

3.10 kubectl cordon(Pod配備禁止)/kubectl uncordon(Pod配備禁止の解除)

kubectl cordonもkubectl drainも、指定したホストへのPodの新規配備を禁止する。違いは、以下のとおり。
- kubectl cordon : kubectl cordonで指定したホストでPodが動作中の場合、そのPodはそのホストで動作したまま。
- kubectl drain : kubectl drainで指定したホストでPodが動作中の場合、Podを他のホストに移動する。

ホスト(マスタとノード)の状態を確認する。
[root@master ~]# kubectl get node
NAME        STATUS     AGE
master      Ready      59d
node1       Ready      61d

Podを4つ起動する。
[root@master ~]# kubectl run nginx --image=nginx --replicas=4
deployment "nginx" created

Podの状態を確認する。マスタ(master)とノード(node1)で2個ずつ動いていることがわかる。
[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       NODE
nginx-2040093540-147wy   1/1       Running   0          42s       master
nginx-2040093540-s5lu3   1/1       Running   0          42s       node1
nginx-2040093540-st25o   1/1       Running   0          42s       node1
nginx-2040093540-w8rxu   1/1       Running   0          42s       master

Podを終了する。
[root@master ~]# kubectl delete deployment nginx
deployment "nginx" deleted

マスタ(master)へのPod配備を禁止する。
[root@master ~]# kubectl cordon master
node "master" cordoned

ホストの状態を確認する。マスタへのPod配備が禁止(SchedulingDisabled)になっていることがわかる。
[root@master ~]# kubectl get node
NAME        STATUS                     AGE
master      Ready,SchedulingDisabled   59d
node1       Ready                      61d

Podを4個起動する。
[root@master ~]# kubectl run nginx --image=nginx --replicas=4
deployment "nginx" created

Podの状態を確認する。4個すべてがノード(node1)で動いていることがわかる。masterへのpod配備禁止が確認できたことがわかる。
[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       NODE
nginx-2040093540-2e7pe   1/1       Running   0          47s       node1
nginx-2040093540-aebg5   1/1       Running   0          47s       node1
nginx-2040093540-jgw2y   1/1       Running   0          47s       node1
nginx-2040093540-wmvem   1/1       Running   0          47s       node1

マスタへのPod配備禁止を解除する。
[root@master ~]# kubectl uncordon master
node "master" uncordoned

ホストの状態を確認する。マスタのPod配備禁止が解除されていることがわかる。
[root@master ~]# kubectl get node
NAME        STATUS     AGE
master      Ready      59d
node1       Ready      61d

3.11 kubectl drain(Pod配備禁止)/kubectl uncordon(Pod配備禁止の解除)

Podを2つ起動する。
[root@master ~]# kubectl run nginx --image=nginx --replicas=2
deployment "nginx" created

Podの状態を確認する。マスタ(master)とノード(node1)でPodが1個ずつ動いている。
[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       NODE
nginx-2040093540-2oix4   1/1       Running   0          20s       node1
nginx-2040093540-pkmvj   1/1       Running   0          20s       master

マスタ(master)をPod配備禁止にする。
[root@master ~]# kubectl drain master
node "master" cordoned
error: pods not managed by ReplicationController, Job, or DaemonSet: nginx-2040093540-pkmvj (use --force to override)

Pod配備禁止を実行する。
配備禁止に指定するホストでDeploymentで管理するPodが稼働中の場合は、--forceオプションを指定する必要がある。
[root@master ~]# kubectl drain --force master
node "master" already cordoned
WARNING: About to delete these pods not managed by ReplicationController, Job, or DaemonSet: nginx-2040093540-pkmvj
pod "nginx-2040093540-pkmvj" deleted
node "master" drained

ホストの状態を確認する。マスタがPod配備禁止になっていることがわかる。
[root@master ~]# kubectl get node
NAME        STATUS                     AGE
master      Ready,SchedulingDisabled   59d
node1       Ready                      61d

Podの状態を確認する。
マスタ(master)で動いていたPodがノード(node1)に移動して2つともノード(node1)で動いていることがわかる。
[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       NODE
nginx-2040093540-2oix4   1/1       Running   0          1m        node1
nginx-2040093540-ab2l4   1/1       Running   0          31s       node1

Pod配備禁止を解除する。
[root@master ~]# kubectl uncordon master
node "master" uncordoned

ホストの状態を確認する。Pod配備禁止が解除されたことがわかる。
[root@master ~]# kubectl get node
NAME        STATUS     AGE
master      Ready      59d
node1       Ready      61d

3.12 kubectl attach(動作中のPodに接続する)

本コマンドの用途がわからない。。。
https://github.com/kubernetes/kubernetes/issues/23335

Podを起動する。
[root@master ~]# kubectl run httpd --image=httpd
deployment "httpd" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
httpd-2047761252-mp52s   1/1       Running   0          14s

Podにattachする。
[root@master ~]# kubectl attach httpd-2047761252-mp52s -i
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Sat Jan 07 02:49:25.819545 2017] [mpm_event:notice] [pid 1:tid 139689717176192] AH00489: Apache/2.4.25 (Unix) configured -- resuming normal operations
[Sat Jan 07 02:49:25.820892 2017] [core:notice] [pid 1:tid 139689717176192] AH00094: Command line: 'httpd -D FOREGROUND'


3.13 kubectl rollout

3.13.1 kubectl rollout history(更新履歴を表示する)

3.13.2 kubectl rollout undo(操作を取り消す。過去の状態に戻る)

Podを起動する。履歴を残すために、--recordオプションを付ける。
[root@master ~]# kubectl run nginx --image=nginx:1.7.1 --record
deployment "nginx" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-4193804003-j9lsd   1/1       Running   0          7s

Deploymentの更新履歴を確認する。
[root@master ~]# kubectl rollout history deployment/nginx
deployments "nginx":
REVISION        CHANGE-CAUSE
1               kubectl run nginx --image=nginx:1.7.1 --record

イメージの版数を変更(1.7.1 -> 1.9.1)する。エディタ(vi等)が起動するので、版数を変更する。
[root@master ~]# kubectl edit deployment nginx

      - image: nginx:1.7.1
           ↓変更
      - image: nginx:1.9.1

deployment "nginx" edited

履歴を確認する。
[root@master ~]# kubectl rollout history deployment nginx
deployments "nginx":
REVISION        CHANGE-CAUSE
1               kubectl run nginx --image=nginx:1.7.1 --record
2               kubectl edit deployment nginx


Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
nginx-45047525-1xrp3   1/1       Running   0          57s

イメージの版数が1.7.1から1.9.1になったことがわかる。
[root@master ~]# kubectl describe pod nginx-45047525-1xrp3|grep "Image:"
    Image:              nginx:1.9.1

コンテナの状態を確認する。1.9.1版をもとに起動したコンテナということがわかる。
[root@master ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED              STATUS              PORTS               NAMES
1c3bcac0febb        nginx:1.9.1                                                  "nginx -g 'daemon off"   About a minute ago   Up About a minute                       k8s_nginx.e0d0df54_nginx-45047525-1xrp3_default_f1902308-a413-11e6-b2c9-000c291946c5_1d70a802

イメージの版数を変更(1.9.1 -> 1.9.2)する。
[root@master ~]# kubectl edit deployment nginx

      - image: nginx:1.9.1
      - image: nginx:1.9.2
deployment "nginx" edited

履歴を確認する。3回分の更新履歴を確認することができる。
[root@master ~]# kubectl rollout history deployment nginx
deployments "nginx":
REVISION        CHANGE-CAUSE
1               kubectl run nginx --image=nginx:1.7.1 --record
2               kubectl edit deployment nginx
3               kubectl edit deployment nginx

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                    READY     STATUS    RESTARTS   AGE
nginx-117530342-onbvj   1/1       Running   0          38s

イメージの版数が1.9.1から1.9.2になったことがわかる。
[root@master ~]# kubectl describe pod nginx-117530342-onbvj|grep "Image:"
    Image:              nginx:1.9.2

コンテナの状態を確認する。1.9.2版をもとに起動したコンテナということがわかる。
[root@master ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED              STATUS              PORTS    NAMES
20d6aaed4863   nginx:1.9.2   "nginx -g 'daemon off"   About a minute ago   Up About a minute            k8s_nginx.e2fedf55_nginx-117530342-onbvj_default_49ebf179-a414-11e6-b2c9-000c291946c5_13a2ecc9

REVISION 1の状態に戻す。
[root@master ~]# kubectl rollout undo deployment nginx --to-revision=1
deployment "nginx" rolled back

[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-4193804003-1fx52   1/1       Running   0          34s

イメージの版数が1.9.2から1.7.1になったことがわかる。
[root@master ~]# kubectl describe pod nginx-4193804003-1fx52|grep "Image:"
    Image:              nginx:1.7.1

[root@master ~]# docker ps
CONTAINER ID   IMAGE         COMMAND     CREATED           STATUS           PORTS    NAMES
f30ae136f042   nginx:1.7.1   "nginx"     51 seconds ago    Up 50 seconds             k8s_nginx.dc70df52_nginx-4193804003-1fx52_default_50748203-a415-11e6-b2c9-000c291946c5_15fe34ac


REVISION 2の状態に戻す。
[root@master ~]# kubectl rollout undo deployment nginx --to-revision=2
deployment "nginx" rolled back

[root@master ~]# kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
nginx-45047525-iw6w6   1/1       Running   0          6s

イメージの版数が1.7.1から1.9.1になったことがわかる。
[root@master ~]# kubectl describe pod nginx-45047525-iw6w6|grep "Image:"
    Image:              nginx:1.9.1

[root@master ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                 CREATED           STATUS           PORTS    NAMES
1268824ad1c5   nginx:1.9.1   "nginx -g 'daemon off"  17 seconds ago    Up 16 seconds             k8s_nginx.e0d0df54_nginx-45047525-iw6w6_default_94a637f0-a415-11e6-b2c9-000c291946c5_c1d96f5c

3.13.3 kubectl rollout pause

3.13.4 kubectl rollout resume

3.14 kubectl label(Podへのラベル貼付、削除、上書き)

Podを起動する。
[root@master ~]# kubectl run nginx --image=nginx
deployment "nginx" created

Podのラベルを確認する。
[root@master ~]# kubectl get pod --show-labels
NAME                     READY     STATUS    RESTARTS   AGE       LABELS
nginx-2040093540-ujjzd   1/1       Running   0          18s       pod-template-hash=2040093540,run=nginx

ラベル(os=linux)を追加する。
[root@master ~]# kubectl label pod nginx-2040093540-ujjzd os=linix
pod "nginx-2040093540-ujjzd" labeled

ラベルを確認する。os=linuxというラベルが追加されたことがわかる。
[root@master ~]# kubectl get pod --show-labels
NAME                     READY     STATUS    RESTARTS   AGE       LABELS
nginx-2040093540-ujjzd   1/1       Running   0          1m        os=linix,pod-template-hash=2040093540,run=nginx

ラベル(os=linux)を削除する。
キーの後にハイフンを指定する。以下の例だとOSの後に「-」を指定する。
[root@master ~]# kubectl label pod nginx-2040093540-ujjzd os-
pod "nginx-2040093540-ujjzd" labeled

ラベルを確認する。ラベル(os=linux)が削除されたことがわかる。
[root@master ~]# kubectl get pod --show-labels
NAME                     READY     STATUS    RESTARTS   AGE       LABELS
nginx-2040093540-ujjzd   1/1       Running   0          3m        pod-template-hash=2040093540,run=nginx

Podの状態を確認する。
[root@master ~]# kubectl get pod --show-labels
NAME                     READY     STATUS    RESTARTS   AGE       LABELS
nginx-2040093540-ujjzd   1/1       Running   0          6m        pod-template-hash=2040093540,run=nginx

ラベルを書き換える。run=nginxというラベルをrun=hogeに書き換える。
[root@master ~]# kubectl label --overwrite pod nginx-2040093540-ujjzd run=hoge
pod "nginx-2040093540-ujjzd" labeled

Podの状態を確認する。
run=nginxというラベルを持ったPodがいなくなったため、もう1つPodを起動していることがわかる。
[root@master ~]# kubectl get pod --show-labels
NAME                     READY     STATUS    RESTARTS   AGE       LABELS
nginx-2040093540-32i08   1/1       Running   0          1m        pod-template-hash=2040093540,run=nginx
nginx-2040093540-ujjzd   1/1       Running   0          9m        pod-template-hash=2040093540,run=hoge

新たに起動したPodのラベルをrun=hogeからrun=nginxに戻す。
[root@master ~]# kubectl label --overwrite pod nginx-2040093540-ujjzd run=nginx
pod "nginx-2040093540-ujjzd" labeled

Podの状態を確認する。
run=nginxというラベルを持ったPodが2個になったため、Podの数を2個から1個に減らしたことがわかる。
[root@master ~]# kubectl get pod --show-labels
NAME                     READY     STATUS    RESTARTS   AGE       LABELS
nginx-2040093540-ujjzd   1/1       Running   0          14m       pod-template-hash=2040093540,run=nginx

3.15 kubectl annotate(リソースに注釈の追加、削除を行う)

-----------------------------------------
1. 注釈(annotate)の追加、削除を行う。
-----------------------------------------
Podを起動する。
[root@master1 ~]# kubectl run nginx --image=nginx
deployment "nginx" created

Podの状態を確認する。
[root@master1 ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-vb1qg   1/1       Running   0          1m

Podに注釈(os='centos6')を付ける。
[root@master1 ~]# kubectl annotate pod nginx-2040093540-vb1qg os='centos6'
pod "nginx-2040093540-vb1qg" annotated

注釈を確認する。
[root@master1 ~]# kubectl get pod nginx-2040093540-vb1qg -o yaml|grep -w os
    os: centos6

注釈を削除する。descriptionのあとに「-」を付ける。
[root@master1 ~]# kubectl annotate pod nginx-2040093540-vb1qg os-
pod "nginx-2040093540-vb1qg" annotated

注釈を確認する。注釈が削除できたことがわかる。
[root@master1 ~]# kubectl get pod nginx-2040093540-vb1qg -o yaml|grep -w os
[root@master1 ~]#

-----------------------------------------------
2. 注釈を上書きする(--overwriteオプションを使う)
-----------------------------------------------
Podに注釈(os='centos6')を付ける。
[root@master1 ~]# kubectl annotate pod nginx-2040093540-vb1qg os='centos6'
pod "nginx-2040093540-vb1qg" annotated

注釈を確認する。。
[root@master1 ~]# kubectl get pod nginx-2040093540-vb1qg -o yaml|grep -w os
    os: centos6

注釈を上書きする。os='centos6' => os='centos7'
[root@master1 ~]# kubectl annotate --overwrite pod nginx-2040093540-vb1qg os='centos7'
pod "nginx-2040093540-vb1qg" annotated

注釈を確認する。注釈が上書きされたことがわかる。
[root@master1 ~]# kubectl get pod nginx-2040093540-vb1qg -o yaml|grep -w os
    os: centos7

3.16 kubectl edit(定義情報変更)/kubectl apply(定義情報変更)

editもapplyもリソースの定義情報を変更するために使う。違いは以下のとおり。
- editはエディタ(vi等)を使って、リソースの定義情報を変更するときに使う。
- applyはファイルや標準入力から、リソースの定義情報を変更するときに使う。

Podを起動する。イメージは1.7.1版を使う
[root@master ~]# kubectl run nginx --image=nginx:1.7.1
deployment "nginx" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-4193804003-rqoun   1/1       Running   0          7s

イメージの版数を確認する。1.7.1であることがわかる。
[root@master ~]# kubectl describe pod nginx-4193804003-rqoun|grep "Image:"
    Image:              nginx:1.7.1

イメージの版数を1.7.1から1.9.1に変更する。
[root@master ~]# kubectl edit deployment nginx

      - image: nginx:1.7.1
             ↓
      - image: nginx:1.9.1

deployment "nginx" edited

Podの状態を確認する。1.9.1版のイメージをもとにPodが起動していることがわかる。
[root@master ~]# kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
nginx-45047525-8tklr   1/1       Running   0          2m

[root@master ~]# kubectl describe pod nginx-45047525-8tklr |grep "Image:"
    Image:              nginx:1.9.1

dockerコマンドでも確認してみる。イメージの版数が1.9.1にアップデートされている。
[root@master ~]# docker ps
CONTAINER ID     IMAGE          COMMAND                  CREATED              STATUS              PORTS        NAMES
007830b209b4     nginx:1.9.1    "nginx -g 'daemon off"   About a minute ago   Up About a minute                k8s_nginx.e0d0df54_nginx-45047525-8tklr_default_fc4049e3-a3b0-11e6-815e-000c291946c5_42df405c

3.17 kubectl replace(リソースを置き換える。いったんリソースを削除して作り直す)

イメージの版数を確認する。版数は1.7.1
[root@master ~]# cat nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.1
        ports:
        - containerPort: 80

Podを起動する。
[root@master ~]# kubectl create -f nginx-deployment.yaml
deployment "nginx-deployment" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                                READY     STATUS        RESTARTS   AGE
nginx-deployment-1406762891-5typw   1/1       Running       0          23s

起動したPodのイメージ版数を確認する。
[root@master ~]# kubectl get pod nginx-deployment-1406762891-5typw -o yaml|grep "image:"
  - image: nginx:1.7.1
    image: nginx:1.7.1

イメージの版数を変更(1.7.1->1.9.1)する。
[root@master ~]# vi nginx-deployment.yaml
[root@master ~]# cat nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.9.1
        ports:
        - containerPort: 80


[root@master ~]# kubectl replace -f nginx-deployment.yaml
deployment "nginx-deployment" replaced

Podの状態を確認する。Podの名前が変わっていることがわかる。
[root@master ~]# kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-1564180365-qplk2   1/1       Running   0          13s

起動したPodのイメージ版数を確認する。
[root@master ~]# kubectl get pod nginx-deployment-1564180365-qplk2 -o yaml|grep "image:"
  - image: nginx:1.9.1
    image: nginx:1.9.1

Dockerコマンドでも確認してみる。イメージの版数が1.9.1になっていることがわかる。
[root@master ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED           STATUS           PORTS      NAMES
d6116aeec2e4   nginx:1.9.1  "nginx -g 'daemon off"   57 seconds ago    Up 55 seconds               k8s_nginx.f50b001f_nginx-deployment-1564180365-qplk2_default_7b606b07-a5a9-11e6-991f-000c291946c5_a8b717af3bde29fcacea

3.18 kubectl rolling-update(リソースを動的に変更する)

テンプレートの内容を確認する。イメージの版数は1.7.1
[root@master ~]# cat nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.1
        ports:
        - containerPort: 80

Podを起動する。
[root@master ~]# kubectl create -f nginx-rc.yaml
replicationcontroller "nginx" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME          READY     STATUS              RESTARTS   AGE
nginx-du0qx   0/1       ContainerCreating   0          4s

イメージの版数を確認する。
[root@master ~]# kubectl get pod nginx-du0qx -o yaml|grep "image:"
  - image: nginx:1.7.1
    image: nginx:1.7.1

[root@master ~]# docker ps
CONTAINER ID    IMAGE          COMMAND      CREATED              STATUS              PORTS    NAMES
6381c2a09d64    nginx:1.7.1    "nginx"      About a minute ago   Up About a minute            k8s_nginx.eff1001d_nginx-du0qx_default_b39e9ff4-a5ab-11e6-991f-000c291946c5_b39a845b

ローリングアップデートを実行する。イメージの版数を1.7.1から1.9.1にアップデートする。
[root@master ~]# kubectl rolling-update nginx --image=nginx:1.9.1
Created nginx-b1c0dfc3c6acc641415953ffec068cfd
Scaling up nginx-b1c0dfc3c6acc641415953ffec068cfd from 0 to 1, scaling down nginx from 1 to 0 (keep 1 pods available, don't exceed 2 pods)
Scaling nginx-b1c0dfc3c6acc641415953ffec068cfd up to 1

- しばらく待つ

Scaling nginx down to 0
Update succeeded. Deleting old controller: nginx
Renaming nginx-b1c0dfc3c6acc641415953ffec068cfd to nginx
replicationcontroller "nginx" rolling updated


上記「しばらく待つ」のとき、別の端末でPodの状態を確認する。
更新前のPodと新しいPodの2つが起動していることがわかる。
[root@master ~]# kubectl get pod
NAME                                           READY     STATUS    RESTARTS   AGE
nginx-b1c0dfc3c6acc641415953ffec068cfd-w7ka2   1/1       Running   0          9s
nginx-du0qx                                    1/1       Running   0          11m

rolling-updateが終了した後、Podの状態を確認する。新しく起動したPodだけが動いていることがわかる。
[root@master ~]# kubectl get pod
NAME                                           READY     STATUS    RESTARTS   AGE
nginx-b1c0dfc3c6acc641415953ffec068cfd-w7ka2   1/1       Running   0          2m

3.19 kubectl logs(Podが標準出力に出力するメッセージを表示する)

Podを起動する。
[root@master ~]# kubectl run httpd --image=httpd
deployment "httpd" created

Podの状態を確認する。
[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
httpd-2047761252-vrz7s   1/1       Running   0          2m

Deploymentの状態を確認する。
[root@master ~]# kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
httpd     1         1         1            1           2m

Serviceを作成する。ホストのポート番号8888をコンテナのポート番号80にマップする。
[root@master ~]# kubectl expose deployment httpd --port=8888 --target-port=80
service "httpd" exposed

Serviceを作成する。--portはホストのポート番号、--target-portはPodのポート番号。
[root@master ~]# kubectl expose deployment httpd --port=8888 --target-port=80
service "httpd" exposed

Serviceとエンドポイント情報を確認する。ホスト側(10.254.92.77:8888) <-> Pod(10.1.72.2:80)の関係がわかる。
[root@master ~]# kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
httpd        10.254.92.77    <none>        8888/TCP        15m
[root@master ~]# kubectl get endpoints
NAME         ENDPOINTS            AGE
httpd        10.1.72.2:80         15m


Pod(httpd)にアクセスする。
[root@master ~]# curl http://10.254.92.77:8888
<html><body><h1>It works!</h1></body></html>

HTTPアクセスしたログが出力される。
[root@master ~]# kubectl logs httpd-2047761252-vrz7s
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.1.72.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.1.72.2. Set the 'ServerName' directive globally to suppress this message
[Sun Nov 06 12:06:42.420907 2016] [mpm_event:notice] [pid 1:tid 140692115355520] AH00489: Apache/2.4.23 (Unix) configured -- resuming normal operations
[Sun Nov 06 12:06:42.446383 2016] [core:notice] [pid 1:tid 140692115355520] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.0.100 - - [06/Nov/2016:12:07:33 +0000] "GET / HTTP/1.1" 200 45

もう一度HTTPアクセスする。
[root@master ~]# curl http://10.254.92.77:8888
<html><body><h1>It works!</h1></body></html>

2回目のHTTPアクセスのログが出力されていることがわかる。
[root@master ~]# kubectl logs httpd-2047761252-vrz7s
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.1.72.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.1.72.2. Set the 'ServerName' directive globally to suppress this message
[Sun Nov 06 12:06:42.420907 2016] [mpm_event:notice] [pid 1:tid 140692115355520] AH00489: Apache/2.4.23 (Unix) configured -- resuming normal operations
[Sun Nov 06 12:06:42.446383 2016] [core:notice] [pid 1:tid 140692115355520] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.0.100 - - [06/Nov/2016:12:07:33 +0000] "GET / HTTP/1.1" 200 45
192.168.0.100 - - [06/Nov/2016:12:07:52 +0000] "GET / HTTP/1.1" 20

最後の2行だけログを出力する。--tail=2 オプションを付ける。
[root@master ~]# kubectl logs --tail=2 httpd-2047761252-vrz7s
192.168.0.100 - - [06/Nov/2016:12:07:33 +0000] "GET / HTTP/1.1" 200 45
192.168.0.100 - - [06/Nov/2016:12:07:52 +0000] "GET / HTTP/1.1" 200 45
オプション使用例 意味
--tail=2 最後の2行だけログを出力する
--since=10s 最後の10秒間のログを出力する
--since=1m 最後の1分間のログを出力する
--since=2H 最後の2時間のログを出力する

3.20 kubectl config(クラスタ管理を行う)

configコマンドを使って、コンテキスト切り替えを実行してみます。
コンテキストとは、ユーザとクラスタの組を意味します。
1.4のkubectl configの使い方

検証環境
・master1,master2の2台構成。OSはCentOS7.2。
・master1で構成する環境をローカルクラスタ、master2で構成する環境をリモートクラスタと呼ぶことにします。
・master1,master2はマスタ機能を持っている。つまり、kube-apiserverが動作している。

  (注)検証環境が貧弱なので、クラスタ内のホストはマスタのみ。ノードはありません。
確認事項
本実施例では、master1でコンテキストの切り替えコマンドを実行することで、
ローカルクラスタ、リモートクラスタのPodの状態が参照できることを確認してみます。
なお、セキュリティについては考慮していません。
準備(ローカルクラスタでPodを起動する)
[root@master1 ~]# kubectl run local-nginx --image=nginx
deployment "local-nginx" created

[root@master1 ~]# kubectl get pod
NAME                           READY     STATUS    RESTARTS   AGE
local-nginx-1294491604-jnqwn   1/1       Running   0          19s
準備(リモートクラスタでPodを起動する)
[root@master2 ~]# kubectl run remote-nginx --image=nginx
deployment "remote-nginx" created

[root@master2 ~]# kubectl get pod
NAME                            READY     STATUS    RESTARTS   AGE
remote-nginx-1644388566-i26w1   1/1       Running   0          13m
コンテキストの作成
これ以降の作業は全てローカルクラスタ(master1)で行う。
コンテキストの作成は、set-credentials -> set-cluster -> set-context の順でサブコマンドを実行する。

ユーザを作成する。ローカルクラスタ、リモートクラスタ用に2つ作成する。"local-user","remote-user"は任意の名前で良い。
[root@master1 ~]# kubectl config set-credentials local-user --username=hana --password=hana
user "local-user" set.
[root@master1 ~]# kubectl config set-credentials remote-user --username=shin --password=shin
user "remote-user" set.

クラスタを作成する。ローカルクラスタ、リモートクラスタ用に2つ作成する。"localhost","remotehost"は任意の名前で良い。
[root@master1 ~]# kubectl config set-cluster localhost --insecure-skip-tls-verify=true --server=http://master1:8080
cluster "localhost" set.
[root@master1 ~]# kubectl config set-cluster remotehost --insecure-skip-tls-verify=true --server=http://master2:8080
cluster "remotehost" set.

コンテキストを作成する。コンテキストを作成することで、ユーザとクラスタが紐付けされる。
[root@master1 ~]# kubectl config set-context local-contex --user=local-user --cluster=localhost
context "local-contex" set.
[root@master1 ~]# kubectl config set-context remote-contex --user=remote-user --cluster=remotehost
context "remote-contex" set.
ローカルコンテキストのPodの状態確認
使用するコンテキストを"local-contex"に切り替える
[root@master1 ~]# kubectl config use-context local-contex
switched to context "local-contex".

コンテキストを確認する。"local-contex"に切り替わったことがわかる。
[root@master1 ~]# kubectl config current-context
local-contex

Podの状態を確認する。ローカルクラスタのPodが動作していることが確認できる。
[root@master1 ~]# kubectl get pod
NAME                           READY     STATUS    RESTARTS   AGE
local-nginx-1294491604-jnqwn   1/1       Running   0          2m
リモートコンテキストのPodの状態確認
使用するコンテキストを"remote-contex"に切り替える
[root@master1 ~]# kubectl config use-context remote-contex
switched to context "remote-contex".

コンテキストを確認する。"remote-contex"に切り替わったことがわかる。
[root@master1 ~]# kubectl config current-context
remote-contex

Podの状態を確認する。リモートクラスタのPodが動作していることが確認できる。
[root@master1 ~]# kubectl get pod
NAME                            READY     STATUS    RESTARTS   AGE
remote-nginx-1644388566-i26w1   1/1       Running   0          3m
リモートクラスタでPodの起動
コンテキストを確認する。"remote-contex"であることがわかる。
[root@master1 ~]# kubectl config current-context
remote-contex

Podを起動する。
[root@master1 ~]# kubectl run httpd --image=httpd
deployment "httpd" created

Podを確認する。nginxに加え、httpdのPodも起動していることがわかる。
[root@master1 ~]# kubectl get pod
NAME                            READY     STATUS    RESTARTS   AGE
httpd-2047761252-6ywrg          1/1       Running   0          55s
remote-nginx-1644388566-i26w1   1/1       Running   0          1h

master2でもPodの状態を確認してみる。httpdのPodが起動していることがわかる。
[root@master2 ~]# kubectl get pod
NAME                            READY     STATUS    RESTARTS   AGE
httpd-2047761252-6ywrg          1/1       Running   0          1m
remote-nginx-1644388566-i26w1   1/1       Running   0          1h
[root@master2 ~]#

リモートクラスタのPodを全て終了する。
[root@master1 ~]# kubectl delete deployment remote-nginx
deployment "remote-nginx" deleted
[root@master1 ~]# kubectl delete deployment httpd
deployment "httpd" deleted

Podの状態を確認する。全てのPodが終了したことが確認できる。
[root@master1 ~]# kubectl get pod
[root@master1 ~]#
設定内容の確認
[root@master1 ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: http://master1:8080
  name: localhost
- cluster:
    insecure-skip-tls-verify: true
    server: http://master2:8080
  name: remotehost
contexts:
- context:
    cluster: localhost
    user: local-user
  name: local-contex
- context:
    cluster: remotehost
    user: remote-user
  name: remote-contex
current-context: remote-contex
kind: Config
preferences: {}
users:
- name: local-user
  user:
    password: hana
    username: hana
- name: remote-user
  user:
    password: shin
    username: shin
[root@master1 ~]#

なお、上記コマンドは、~/.kube/configに格納されている設定を表示しています。

3.21 stop (廃止予定なので使わないこと)

以下、man kubectl-stop より引用

The stop command is deprecated, all its functionalities are covered by delete command.

See 'kubectl delete --help' for more details.

3.22 kubectl version (kubernetesの版数を表示する)

kubernetes 1.2を使っていることがわかる。
[root@master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"2", GitVersion:"v1.2.0", GitCommit:"ec7364b6e3b155e78086018aa644057edbe196e5", GitTreeState:"clean"}
Server Version: version.Info{Major:"1", Minor:"2", GitVersion:"v1.2.0", GitCommit:"ec7364b6e3b155e78086018aa644057edbe196e5", GitTreeState:"clean"}

3.23 kubectl cluster-info(クラスタの情報を表示する)

[root@master ~]# kubectl cluster-info
Kubernetes master is running at http://localhost:8080

3.24 kubectl api-versions(サポートしているAPIバージョンを表示する)

[root@master ~]# kubectl api-versions
autoscaling/v1
batch/v1
extensions/v1beta1
v1

3.25 kubectl convert(ファイル形式を変換(yaml<=>json)する。)

[root@master ~]# cat nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80


[root@master ~]# kubectl convert -f nginx-deployment.yaml --local -o json
running in local mode...
{
    "kind": "Deployment",
    "apiVersion": "extensions/v1beta1",
    "metadata": {
        "name": "nginx-deployment",
        "creationTimestamp": null,
        "labels": {
            "app": "nginx"
        }
    },
    "spec": {
        "replicas": 1,
        "selector": {
            "matchLabels": {
                "app": "nginx"
            }
        },
        "template": {
            "metadata": {
                "creationTimestamp": null,
                "labels": {
                    "app": "nginx"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "nginx",
                        "image": "nginx:1.7.9",
                        "ports": [
                            {
                                "containerPort": 80,
                                "protocol": "TCP"
                            }
                        ],
                        "resources": {},
                        "terminationMessagePath": "/dev/termination-log",
                        "imagePullPolicy": "IfNotPresent"
                    }
                ],
                "restartPolicy": "Always",
                "terminationGracePeriodSeconds": 30,
                "dnsPolicy": "ClusterFirst",
                "securityContext": {}
            }
        },
        "strategy": {
            "type": "RollingUpdate",
            "rollingUpdate": {
                "maxUnavailable": 1,
                "maxSurge": 1
            }
        }
    },
    "status": {}
}
[root@master ~]#

3.26 kubectl explain(リソースの説明)

[root@master ~]# kubectl explain node
DESCRIPTION:
Node is a worker node in Kubernetes, formerly known as minion. Each node will have a unique identifier in the cache (i.e. in etcd).

FIELDS:
   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     http://releases.k8s.io/release-1.2/docs/devel/api-conventions.md#resources
-以下、略-

他にも以下のようなリソースの説明がある。リソース一覧を得たいなら、kubectl getを入力したあとに "TAB"キーを押下する。
[root@master ~]# kubectl explain pod
[root@master ~]# kubectl explain deployment
[root@master ~]# kubectl explain rc

4 その他

4.1 コンポーネントの状態を調べる

[root@master ~]# kubectl get componentstatus
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health": "true"}

etcdを停止する。
[root@master ~]# systemctl stop etcd
[root@master ~]# systemctl is-active etcd
inactive

コンポーネントの状態を確認する。etcdを停止すると、etcdの行自体表示されないようだ。
[root@master ~]# kubectl get componentstatus
NAME                 STATUS    MESSAGE   ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok

次に、schedulerを停止する。
[root@master ~]# systemctl stop kube-scheduler.service
[root@master ~]# systemctl is-active kube-scheduler.service
inactive

コンポーネントの状態を確認する。schedulerの状態が「Unhealthy」と表示されるようになった。
[root@master ~]# kubectl get componentstatus
NAME                 STATUS      MESSAGE                                                                                        ERROR
scheduler            Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: getsockopt: connection refused
controller-manager   Healthy     ok

次に、controller-managerを停止する。
[root@master ~]# systemctl stop kube-controller-manager.service
[root@master ~]# systemctl is-active kube-controller-manager.service
inactive

コンポーネントの状態を確認する。controller-managerの状態が「Unhealthy」と表示されるようになった。
[root@master ~]# kubectl get componentstatus
NAME                 STATUS      MESSAGE                                                                                        ERROR
controller-manager   Unhealthy   Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: getsockopt: connection refused
scheduler            Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: getsockopt: connection refused
[root@master ~]#

etcd,scheduler,controller-managerを再度起動して、状態を確認する。
[root@master ~]# systemctl start etcd
[root@master ~]# systemctl start kube-controller-manager.service
[root@master ~]# systemctl start kube-scheduler.service
[root@master ~]# kubectl get componentstatus
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

4.2 kubectlコマンドが利用しているAPIを調べる

オプションに--v=6,7,8を指定すると、kubectl実行時に利用しているAPIを調べることができる。6->7->8となるにつれて、より詳細な情報が得られる。

[root@master ~]# kubectl get pod --v=6
I1106 18:44:05.765128   10587 round_trippers.go:286] GET http://localhost:8080/api 200 OK in 3 milliseconds
I1106 18:44:05.769004   10587 round_trippers.go:286] GET http://localhost:8080/apis 200 OK in 1 milliseconds
I1106 18:44:05.775203   10587 round_trippers.go:286] GET http://localhost:8080/api/v1/namespaces/default/pods 200 OK in 3 milliseconds
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-jdy9o   1/1       Running   0          3m


--v=7を指定した場合
[root@master ~]# kubectl get pod --v=7
I1106 18:44:07.691145   10596 round_trippers.go:264] GET http://localhost:8080/api
I1106 18:44:07.691350   10596 round_trippers.go:271] Request Headers:
I1106 18:44:07.691380   10596 round_trippers.go:274]     Accept: application/json, */*
I1106 18:44:07.691407   10596 round_trippers.go:274]     User-Agent: kubectl/v1.2.0 (linux/amd64) kubernetes/ec7364b
I1106 18:44:07.696376   10596 round_trippers.go:289] Response Status: 200 OK in 4 milliseconds
I1106 18:44:07.697985   10596 round_trippers.go:264] GET http://localhost:8080/apis
I1106 18:44:07.698169   10596 round_trippers.go:271] Request Headers:
I1106 18:44:07.698224   10596 round_trippers.go:274]     User-Agent: kubectl/v1.2.0 (linux/amd64) kubernetes/ec7364b
I1106 18:44:07.698280   10596 round_trippers.go:274]     Accept: application/json, */*
I1106 18:44:07.700849   10596 round_trippers.go:289] Response Status: 200 OK in 2 milliseconds
I1106 18:44:07.703040   10596 round_trippers.go:264] GET http://localhost:8080/api/v1/namespaces/default/pods
I1106 18:44:07.703818   10596 round_trippers.go:271] Request Headers:
I1106 18:44:07.704378   10596 round_trippers.go:274]     Accept: application/json, */*
I1106 18:44:07.705106   10596 round_trippers.go:274]     User-Agent: kubectl/v1.2.0 (linux/amd64) kubernetes/ec7364b
I1106 18:44:07.709303   10596 round_trippers.go:289] Response Status: 200 OK in 3 milliseconds
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2040093540-jdy9o   1/1       Running   0          3m
[root@master ~]#

4.3 サービスを作成するとき、target-portにどんな値を指定するのか?

イメージがExposedPortsとしてExposeしているポート番号を指定する。ためしに、httpd のサービスを作成するとき、target-portに100番を指定してみたところ、Podにアクセスできなかった。ExposedPortsの説明は https://docs.docker.com/docker-cloud/apps/ports/ を参照しました。

[root@master ~]# kubectl run httpd --image=httpd
deployment "httpd" created

[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
httpd-2047761252-fmrmn   1/1       Running   0          12s

[root@master ~]# kubectl expose deployment httpd --port=8888 --target-port=100
service "httpd" exposed

サービスを確認する。
[root@master ~]# kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
httpd        10.254.40.137   <none>        8888/TCP        5s

エンドポイント情報を確認する。Pod側のポート番号が100番になった
[root@master ~]# kubectl get endpoints
NAME         ENDPOINTS            AGE
httpd        10.1.72.2:100        8s

[root@master ~]# curl http://10.254.40.137:8888
curl: (7) Failed connect to 10.254.40.137:8888; 接続を拒否されました


[root@master ~]# docker images |grep httpd
docker.io/httpd                                       latest              9a0bc463edaa        2 weeks ago         193.3 MB
[root@master ~]# docker inspect httpd|grep -A2 ExposedPorts
            "ExposedPorts": {
                "80/tcp": {}
            },
--
            "ExposedPorts": {
                "80/tcp": {}
            },

4.4 指定したホストでPodを起動する(nodeSelectorを使う)

ホストのラベルを確認する。
[root@master1 ~]# kubectl get node --show-labels
NAME      STATUS    AGE       LABELS
master1   Ready     3h        kubernetes.io/hostname=master1
master2   Ready     3h        kubernetes.io/hostname=master2

Pod定義ファイルを作成する。
Podをmaster2で起動するので、nodeSelectorに"kubernetes.io/hostname: master2"を指定する。
[root@master1 ~]# vi centos.yaml
[root@master1 ~]# cat centos.yaml
apiVersion: v1
kind: Pod
metadata:
  name: centos
  labels:
    app: web
spec:
  containers:
    - name: centos6
      image: centos:centos6
      command: ["sleep", "3600"]
    - name: centos7
      image: centos:centos7
      command: ["sleep", "3600"]
  nodeSelector:
    kubernetes.io/hostname: master2

Podを起動する。
[root@master1 ~]# kubectl create -f centos.yaml
pod "centos" created

Podの状態を確認する。master2で動いていることがわかる。
[root@master1 ~]# kubectl get pod -o wide --show-labels
NAME                          READY     STATUS    RESTARTS   AGE       NODE      LABELS
centos                        2/2       Running   0          10s       master2   app=web

ためしに、centos7でbashを実行してみる。centos7.3であることがわかる。
[root@master1 ~]# kubectl exec centos -c centos7 -it bash
[root@centos /]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@centos /]# exit
exit

ためしに、centos6でbashを実行してみる。centos6.8であることがわかる。
[root@master1 ~]# kubectl exec centos -c centos6 -it bash
[root@centos /]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@centos /]# exit
exit

Podを終了する。
[root@master1 ~]# kubectl delete pod centos
pod "centos" deleted

4.5 kubeletのPod起動方法

Podを起動するには、kubectl runを実行する方法以外に、他に3つの方法がある(man kubeletより)
本章では、Pod定義ファイルの格納場所をkubeletの定義ファイルに定義する方法について説明する。

-----------------------------------------------
1. 参考情報
------------------------------------------------
kubeletのPod起動方法。man kubeletより抜粋。

  (1) kube-apiserverからの指示(kubectl runで起動する方法)
  (2) kubeletがpod定義ファイルを読み込んでPodを起動する方法(ここの説明)
  (3) HTTP  endpointによる方法
  (4) HTTP serverによる方法

他の参考情報
http://kubernetes.io/docs/admin/static-pods/

-----------------------------------------------
2. 実施手順
------------------------------------------------
Podの定義ファイル(yaml)を格納するディレクトリを作成する。
[root@node1 ~]# mkdir -p /etc/kubernetes/manifests

テンプレート格納場所をkubeletの定義ファイルに指定する。
[root@node1 ~]# vi /etc/kubernetes/kubelet
KUBELET_ARGS="--config=/etc/kubernetes/manifests"

テスト用のPod(httpd)定義ファイルを作成する。
[root@node1 ~]# vi /etc/kubernetes/manifests/httpd.yaml
[root@node1 ~]# cat /etc/kubernetes/manifests/httpd.yaml
apiVersion: v1
kind: Pod
metadata:
  name: httpd
spec:
  containers:
  - name: httpd
    image: httpd
    ports:
    - containerPort: 8080


テスト用のPod(Nginx)定義ファイルを作成する。
[root@node1 ~]# vi /etc/kubernetes/manifests/nginx.yaml
[root@node1 ~]# cat /etc/kubernetes/manifests/nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

作成したPod定義ファイルを確認する。
[root@node1 ~]# ls /etc/kubernetes/manifests/
httpd.yaml  nginx.yaml

kubeletを再起動する。
[root@node1 ~]# systemctl restart kubelet.service

kubeletの状態を確認する。
[root@node1 ~]# systemctl is-active kubelet.service
active

kubeletの起動オプションを確認する。1行が長いので折り返しています。
Pod定義ファイルの格納場所(★印)が有効になっていることがわかる。
[root@node1 ~]# ps aux |grep kubelet
root       6795 11.0  4.1 425032 41628 ?        Ssl  09:42   0:54 /usr/bin/kubelet 
    --logtostderr=true 
    --v=0 
    --api-servers=http://master1:8080 
    --address=0.0.0.0 
    --allow-privileged=false 
    --pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest 
  ★--config=/etc/kubernetes/manifests

コンテナの状態を確認する。コンテナが2つ(Httpd,Nginx)起動していることがわかる。
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED              STATUS              PORTS               NAMES
50577e1e4446        nginx                                                        "nginx -g 'daemon off"   About a minute ago   Up About a minute                       k8s_nginx.7270fc8f_nginx-node1_default_ca6112932ce36c625ac20a3916ea5bac_32042029
795272acc6ef        httpd                                                        "httpd-foreground"       About a minute ago   Up About a minute                       k8s_httpd.ccebfcf7_httpd-node1_default_df10c6d7dec5867a7c313e234344ce45_ec8dd867
ba1b7228adb5        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/pod"                   2 minutes ago        Up About a minute                       k8s_POD.c36b0a77_nginx-node1_default_ca6112932ce36c625ac20a3916ea5bac_fe690ed7
bc90da1e0bb3        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/pod"                   2 minutes ago        Up About a minute                       k8s_POD.3e750adf_httpd-node1_default_df10c6d7dec5867a7c313e234344ce45_554c2cd3
[root@node1 ~]#

Pod定義ファイルを確認する。
[root@node1 manifests]# pwd
/etc/kubernetes/manifests
[root@node1 manifests]# ls
httpd.yaml  nginx.yaml

kubeletがPod定義ファイルを読めないようにする。
[root@node1 manifests]# mv httpd.yaml ../
[root@node1 manifests]# mv nginx.yaml ../
[root@node1 manifests]# ls
[root@node1 manifests]#

コンテナの状態を確認する。Pod定義ファイルが読めなくなり、kubeletがコンテナを終了させたことがわかる。
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]#


httpdのPod定義ファイルだけ、kubeletが読めるようにする。
[root@node1 manifests]# cp ../httpd.yaml .
[root@node1 manifests]# ls
httpd.yaml

コンテナの状態を確認する。Httpdのコンテナだけ起動していることがわかる。
[root@node1 manifests]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND              CREATED             STATUS                  PORTS               NAMES
b0aac7802de2        httpd                                                        "httpd-foreground"   3 seconds ago       Up Less than a second                       k8s_httpd.ccebfcf7_httpd-node1_default_df10c6d7dec5867a7c313e234344ce45_75d498d0
e0bae879cd72        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/pod"               16 seconds ago      Up 12 seconds                               k8s_POD.3e750adf_httpd-node1_default_df10c6d7dec5867a7c313e234344ce45_b22b86a6
[root@node1 manifests]#

4.6 Pod,RC(ReplicationController),Deploymentのyamlファイル

busyboxのPodを起動する定義ファイルをPod,RC,Deploymentとして作成した。

The spec schema

---------------------------------------
1. Pod
---------------------------------------
Podの定義ファイル
[root@master1 test]# cat test.yaml
apiVersion: v1
kind: Pod
metadata:
   name: busybox-test
spec:
  containers:
    - name: busybox
      image: busybox
      command: ["sleep", "3600"]

[root@master1 test]# kubectl create -f test.yaml
pod "busybox-test" created

[root@master1 test]# kubectl get pod
NAME           READY     STATUS    RESTARTS   AGE
busybox-test   1/1       Running   0          46s


---------------------------------------
2. ReplicationController
---------------------------------------
[root@master1 test]# cat test2.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: busybox-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: nginx
        image: nginx
        command: ["sleep", "3600"]

[root@master1 test]# kubectl create -f test2.yaml
replicationcontroller "busybox-test" created

[root@master1 test]# kubectl get pod
NAME                 READY     STATUS    RESTARTS   AGE
busybox-test-vcpjd   1/1       Running   0          17s

[root@master1 test]# kubectl get rc
NAME           DESIRED   CURRENT   AGE
busybox-test   1         1         20s
[root@master1 test]#

---------------------------------------
3. Deployment
---------------------------------------
[root@master1 test]# cat test3.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: busybox-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        command: ["sleep", "3600"]
[root@master1 test]#

[root@master1 test]# kubectl create -f test3.yaml
deployment "busybox-test" created

[root@master1 test]# kubectl get pod
NAME                           READY     STATUS    RESTARTS   AGE
busybox-test-308240389-dgcor   1/1       Running   0          27s

[root@master1 test]# kubectl get deployment
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
busybox-test   1         1         1            1           34s


4.7 リソース制御(ResourceQuota,limitrange)

  • ResourceQuota
    起動するpod数をnamespace毎に最大100個まで、といった制限を設定するときに使う。
    cpu,memoryも設定可能。また、使用中のリソース量を表示することができる。

  • limitrange
    Containerが使用すリソース(cpu,memory)のデフォルト値、および上限値を設定する。
    デフォルト値ではなく、任意の値を使いたい場合は、Container起動時、コマンドの
    オプション(--requests=memory,--requests=cpu)に使用するリソース量を明に設定する。
    ただし上限値を超えて設定することはできない。

apiserverの定義ファイル編集する。LimitRangerを有効にする。
[root@master ~]# vi /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission-control=LimitRanger"

[root@master resource]# cat quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
spec:
  hard:
    cpu: "10"
    memory: 1Gi
    pods: "2"
    replicationcontrollers: "5"
    resourcequotas: "1"
    services: "5"

[root@master resource]# cat limits.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: limits
spec:
  limits:
  - max:
      cpu: "2"
      memory: 1Gi
    min:
      cpu: 200m
      memory: 6Mi
    type: Pod
  - default:
      cpu: 400m
      memory: 200Mi
    defaultRequest:
      cpu: 300m
      memory: 100Mi
    max:
      cpu: "2"
      memory: 500Mi
    min:
      cpu: 100m
      memory: 3Mi
    type: Container

リソースクォータ(resourcequota)を作成する。
[root@master resource]# kubectl create -f quota.yaml
resourcequota "quota" created

リソースクォータの状態を確認する。
[root@master resource]# kubectl describe resourcequota quota
Name:                   quota
Namespace:              default
Resource                Used    Hard
--------                ----    ----
cpu                     0       10
memory                  0       1Gi
pods                    0       2
replicationcontrollers  0       5
resourcequotas          1       1
services                1       5


limitrangeを作成する。
[root@master resource]# kubectl create -f limits.yaml
limitrange "limits" created

limitrangeの状態を確認する。
[root@master resource]# kubectl describe limitrange limits
Name:           limits
Namespace:      default
Type            Resource        Min     Max     Default Request Default Limit   Max Limit/Request Ratio
----            --------        ---     ---     --------------- -------------   -----------------------
Pod             memory          6Mi     1Gi     -               -               -
Pod             cpu             200m    2       -               -               -
Container       cpu             100m    2       300m            400m            -
Container       memory          3Mi     500Mi   100Mi           200Mi           -

[root@master resource]# cat test.yaml
apiVersion: v1
kind: Pod
metadata:
   name: centos
spec:
  containers:
    - name: centos
      image: centos
      command: ["sleep", "36000"]

5 参考情報

5.1 kubernetes公式

Deployments
Secrets
Using ConfigMap
high-availability
k8s-setup

5.2 その他

Getting Started with Kubernetes
Sharing secret data in Kubernetes
Kubernetes: 構成コンポーネント一覧
KubernetesのConfigMapを試してみる
Kubernetesクラスタ環境を構築してDashboardで見える化を試してみた
Kubernetes こと始め (2) - Service開発

  • 2 検証環境
  • 3 コマンドの使い方
  • 4 その他
  • 5 参考情報