Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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,name2という名前のnamespaceを作成してみます。

namespaceの作成
[root@master ~]# kubectl create namespace name1
namespace "name1" created

[root@master ~]# kubectl create namespace name2
namespace "name2" created

作成したnamespaceを確認します。

namespaceの確認
[root@master ~]# kubectl get namespace
NAME          STATUS    AGE
default       Active    61d
name1         Active    2m
name2         Active    2m

作成したnamespaceでPodの起動/終了を確認してみます。

namespaceでのPodの起動/終了
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開発

hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定でしたが、コロナ終息しないので断念。甲子園で高校野球もみれない。ほんと悲しい!コロナなんとかならないか!治療薬の研究開発している人がんばってほしいな。ソフトが少しでも役に立てればと思う今日この頃。取得済資格:ネットワークスペシャリスト、オンライン情報処理技術者。
https://hana-shin.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away