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


1 コマンド一覧(kubernetes 1.2)

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

チェック印がついているものは、本ページで説明をしているものです。



  • kubectl get


  • kubectl describe


  • kubectl create


  • kubectl create namespace


  • kubectl create secret


  • kubectl create secret docker-registry


  • kubectl create secret generic


  • kubectl create configmap


  • kubectl create serviceaccount


  • kubectl replace


  • kubectl patch


  • kubectl delete


  • kubectl edit


  • kubectl apply


  • kubectl namespace


  • kubectl logs


  • kubectl rolling-update


  • kubectl scale


  • kubectl cordon


  • kubectl drain


  • kubectl uncordon


  • kubectl attach


  • kubectl exec


  • kubectl port-forward


  • kubectl proxy


  • kubectl run


  • kubectl stop


  • kubectl expose


  • kubectl autoscale


  • kubectl rollout


  • kubectl rollout history


  • kubectl rollout undo


  • kubectl rollout pause


  • kubectl rollout resume


  • kubectl label


  • kubectl annotate


  • kubectl config


  • kubectl config view


  • kubectl config set-cluster


  • kubectl config set-credentials


  • kubectl config set-context


  • kubectl config set


  • kubectl config unset


  • kubectl config current-context


  • kubectl config use-context


  • kubectl cluster-info


  • kubectl api-versions


  • kubectl version


  • kubectl explain


  • kubectl convert


2 検証環境


  • master,node1の2台構成。master,node1はホスト名.

  • VMware Workstation 12 Player上で動作する仮想マシン。OSはCentOS7.2

+--- master ---+    +---- node1 ---+

| | | |
| CentOS7.2 | | CentOS7.2 |
| | | |
+--------------+ +--------------+
+----------------------------------+
| VMware Workstation 12 Player |
+----------------------------------+


3 コマンドの使い方


3.1 事前準備

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

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

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

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

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


3.2 kubectl run/kubectl get/kubectl delete


Podを1つ起動する方法

Podを起動する。runに指定する文字列(下記例はnginx)は任意です。

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

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

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

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

Podを終了する。Podの名前ではなく、Deploymentの名前を指定すること。
[root@master ~]# kubectl delete deployment nginx
deployment "nginx" deleted
[root@master ~]# kubectl get pod
[root@master ~]#



Podを複数起動する方法(--replicas)

Podを2つ起動する。"--replicas=2"を指定する。

[root@master ~]# kubectl run nginx --image=nginx --replicas=2
deployment "nginx" created

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

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



Podに環境変数を渡す方法(--env)

Podを起動する。

[root@master ~]# kubectl run nginx --image=nginx --env="TEST=test1"
deployment "nginx" created

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

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

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

root@nginx-3180491960-163ut:/# exit
exit



Podにラベルを付ける方法(--labels)

Podに"os=linux"というラベルをつけて起動する。

[root@master ~]# kubectl run nginx --image=nginx --labels="os=linux"
deployment "nginx" created

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

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

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

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



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

リソースの一覧を表示する。"get"とタイプしたあとに"Tab"キーを押下する。

[root@master ~]# kubectl get
componentstatus ingress pod securitycontextconstraints
configmap job podsecuritypolicy service
daemonset limitrange podtemplate serviceaccount
deployment namespace replicaset thirdpartyresource
endpoints node replicationcontroller
event persistentvolume resourcequota
horizontalpodautoscaler persistentvolumeclaim secret

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

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

[root@master ~]#


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

Deploymentのテンプレートファイルの内容は以下のとおり

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

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

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

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

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

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


3.5 kubectl create namespace(ネームスペースの作成)

name1,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開発