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

RHEL8からdockerコマンドの代わりにpodmanコマンドの利用が推奨されるようになったので、podmanコマンドの使い方を以下のページに作成しました。
[コンテナ起動時、コンテナ間通信の処理概要（Podman編）](https://hana-shin.hatenablog.com/entry/2024/06/19/232656)
[コンテナイメージのレジストリ検索方法（Podman編）](https://hana-shin.hatenablog.com/entry/2024/06/24/205617)


[podmanコマンドの使い方（Almalinux9)](https://hana-shin.hatenablog.com/entry/2024/05/29/223512)
[podmanコマンドの使い方](https://hana-shin.hatenablog.com/entry/2022/07/27/221453)
[コンテナーのネットワークについて](https://hana-shin.hatenablog.com/entry/2022/08/01/215409)
[コンテナイメージのレジストリ検索方法（Podman編）](https://hana-shin.hatenablog.com/entry/2024/06/24/205617)
[Podmanでコンテナ／ホスト間でファイルをコピーする方法](https://hana-shin.hatenablog.com/entry/2024/07/07/233139)



#1 コマンド一覧(kubernetes 1.2)
以下は、man kubectlから抜粋したもの。
チェック印がついているものは、本ページで説明をしているものです。

- [x] kubectl get
- [x] kubectl describe
- [x] kubectl create
- [x] kubectl create namespace
- [x] kubectl create secret
- [ ] kubectl create secret docker-registry
- [x] kubectl create secret generic
- [x] kubectl create configmap
- [ ] kubectl create serviceaccount
- [x] kubectl replace
- [ ] kubectl patch
- [x] kubectl delete
- [x] kubectl edit
- [x] kubectl apply
- [ ] kubectl namespace
- [x] kubectl logs
- [x] kubectl rolling-update
- [x] kubectl scale
- [x] kubectl cordon
- [x] kubectl drain
- [x] kubectl uncordon
- [x] kubectl attach
- [x] kubectl exec
- [ ] kubectl port-forward
- [x] kubectl proxy
- [x] kubectl run
- [x] kubectl stop
- [x] kubectl expose
- [ ] kubectl autoscale
- [x] kubectl rollout
- [x] kubectl rollout history
- [x] kubectl rollout undo
- [ ] kubectl rollout pause
- [ ] kubectl rollout resume
- [x] kubectl label
- [x] kubectl annotate
- [x] kubectl config
- [x] kubectl config view
- [x] kubectl config set-cluster
- [x] kubectl config set-credentials
- [x] kubectl config set-context
- [ ] kubectl config set
- [ ] kubectl config unset
- [x] kubectl config current-context
- [x] kubectl config use-context
- [x] kubectl cluster-info
- [x] kubectl api-versions
- [x] kubectl version
- [x] kubectl explain
- [x] 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補完ができるようになります（便利になる）。

```console
[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

```console: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 ~]#
```

```console: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 ~]#
```

```console: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
```

```console: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の詳細バージョン)

```console
リソースの一覧を表示する。"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(リソースを作成する）

```console
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を作成してみます。

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

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

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

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

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

```console: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を作成する)

```console
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の組)を渡すときに使うリソースです。

```console
-----------------------------------
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でコマンドを実行する）


```console
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の数を増減する）
------------------------------------------------------------
```console
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を他のホストに移動する。


```console
ホスト(マスタとノード）の状態を確認する。
[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配備禁止の解除)


```console
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

```console
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（操作を取り消す。過去の状態に戻る）

```console
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へのラベル貼付、削除、上書き）

```console
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(リソースに注釈の追加、削除を行う）

```console
-----------------------------------------
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はファイルや標準入力から、リソースの定義情報を変更するときに使う。

```console
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(リソースを置き換える。いったんリソースを削除して作り直す）


```console
イメージの版数を確認する。版数は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(リソースを動的に変更する）

```console
テンプレートの内容を確認する。イメージの版数は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が標準出力に出力するメッセージを表示する）

```console
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の使い方](http://qiita.com/hana_shin/items/b7a947511a89accea6d4)


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

  (注)検証環境が貧弱なので、クラスタ内のホストはマスタのみ。ノードはありません。
```


```console:確認事項
本実施例では、master1でコンテキストの切り替えコマンドを実行することで、
ローカルクラスタ、リモートクラスタのPodの状態が参照できることを確認してみます。
なお、セキュリティについては考慮していません。
```

```console:準備(ローカルクラスタで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
```

```console:準備(リモートクラスタで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
```

```console:コンテキストの作成
これ以降の作業は全てローカルクラスタ(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.
```

```console:ローカルコンテキストの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
```

```console:リモートコンテキストの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
```

```console:リモートクラスタで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 ~]#
```

```console:設定内容の確認
[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の版数を表示する）

```console
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(クラスタの情報を表示する）

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

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

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



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

```console
[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(リソースの説明)

```console
[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 コンポーネントの状態を調べる
```console
[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となるにつれて、より詳細な情報が得られる。

```console
[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/ を参照しました。

```console
[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を使う)

```console
ホストのラベルを確認する。
[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の定義ファイルに定義する方法について説明する。

```console
-----------------------------------------------
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](https://kubernetes.io/docs/user-guide/pods/multi-container/)

```console
---------------------------------------
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)に使用するリソース量を明に設定する。
  ただし上限値を超えて設定することはできない。

```console
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](http://kubernetes.io/docs/user-guide/deployments/#what-is-a-deployment)
[Secrets](http://kubernetes.io/docs/user-guide/secrets/)
[Using ConfigMap](http://kubernetes.io/docs/user-guide/configmap/)
[high-availability](https://github.com/kubernetes/kubernetes.github.io/tree/master/docs/admin/high-availability)
[k8s-setup](https://github.com/philips/real-world-kubernetes/tree/master/k8s-setup)

##5.2 その他
[Getting Started with Kubernetes](https://blog.codeship.com/getting-started-with-kubernetes/)
[Sharing secret data in Kubernetes](https://mesosphere.com/blog/2015/11/12/sharing-secret-data-in-kubernetes/)
[Kubernetes: 構成コンポーネント一覧](http://qiita.com/tkusumi/items/c2a92cd52bfdb9edd613#skydns-link)
[KubernetesのConfigMapを試してみる](http://qiita.com/tkusumi/items/8e31fddda77f93ccfdd8)
[Kubernetesクラスタ環境を構築してDashboardで見える化を試してみた](http://acro-engineer.hatenablog.com/entry/2016/10/04/120000)
[Kubernetes こと始め (2) - Service開発](http://taizo.hatenablog.jp/entry/2016/09/15/003641)