Kubernetes1.10 チュートリアル101やってみた (kubectl, pod管理, emptydir, 1Pod複数コンテナ)
はじめに
Kubernetesの公式ページに、多くのチュートリアルが掲載されています。
Kubernetesの勉強の一環で、チュートリアルを消化していきます。
今回は、Kubernetes 101 が対象です。
https://kubernetes.io/docs/user-guide/walkthrough/
なお、Kubernetesのバージョンは、2018年4月時点で最新の1.10を使用しています。
Kubernetes 101:
Kubernetes 101 基础知识
Kubernetes101チュートリアルでは、以下の内容を勉強していくものになっています。
-
- kubectlの使い方
-
- Pods
-
- volume
- Pod内に複数コンテナ
kubectl如何使用
基本的にはDocumentを読めば分かります。
https://kubernetes.io/docs/reference/kubectl/overview/
基本的な内容と、気になったポイントを抜き出してこちらの記事に記載します。
基本内容
使用以下命令来使用kubectl:
kubectl [command] [TYPE] [NAME] [flags]
command, TYPE, NAME, flags は次の通りです
-
- command : create, get, describe, delete を指定することが出来ます
- TYPE : resource-typeを指定することが出来ます。大文字小文字を区別しません。また、単数形・複数形・省略形を指定することができます
$ kubectl get pod pod1
$ kubectl get pods pod1
$ kubectl get po pod1
NAME : リソースの名前を指定することが出来ます。NAMEを省略すると、全てのリソースが表示されます。また、複数のリソースを表示したい時は、複数指定することが出来ます
同じTYPEに所属している複数のリソースを表示
kubectl get pod example-pod1 example-pod2
異なるTYPEに所属している複数のリソースを表示
kubectl get pod/example-pod1 replicationcontroller/example-rc1
YAML Fileで複数指定
kubectl get pod -f ./pod.yaml
flags : ハイフンを指定して様々なフラグを指定することが出来ます。flagsで指定した内容は、default値や環境変数で指定している内容を上書きして実行されます。
引起了我的兴趣的话题
输出模式
您可以指定kubectl的输出格式。
kubectl [command] [TYPE] [NAME] -o=<output_format>
jsonやyamlなどの多数のオプションを指定することができます。
その中で私が気になったのは -o wideです。
通常のgetと比べて、追加情報を同時に表示することができます。
-o wide なし
[root@sugi-kubernetes110-master01 ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h
kube-system kube-apiserver-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h
kube-system kube-controller-manager-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h
kube-system kube-dns-86f4d74b45-bvps2 3/3 Running 3 2h
kube-system kube-flannel-ds-5tgh7 1/1 Running 1 2h
kube-system kube-flannel-ds-d92qj 1/1 Running 1 2h
kube-system kube-flannel-ds-rb6ll 1/1 Running 1 2h
kube-system kube-proxy-khhwf 1/1 Running 1 2h
kube-system kube-proxy-l8pbk 1/1 Running 1 2h
kube-system kube-proxy-zblxq 1/1 Running 1 2h
kube-system kube-scheduler-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h
-o wide あり时,可以同时检查正在运行的pod所在的节点和IP地址,非常方便。
[root@sugi-kubernetes110-master01 ~]# kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
kube-system etcd-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h 192.168.120.220 sugi-kubernetes110-master01.localdomain
kube-system kube-apiserver-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h 192.168.120.220 sugi-kubernetes110-master01.localdomain
kube-system kube-controller-manager-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h 192.168.120.220 sugi-kubernetes110-master01.localdomain
kube-system kube-dns-86f4d74b45-bvps2 3/3 Running 3 2h 10.244.0.3 sugi-kubernetes110-master01.localdomain
kube-system kube-flannel-ds-5tgh7 1/1 Running 1 2h 192.168.120.224 sugi-kubernetes110-node02.localdomain
kube-system kube-flannel-ds-d92qj 1/1 Running 1 2h 192.168.120.223 sugi-kubernetes110-node01.localdomain
kube-system kube-flannel-ds-rb6ll 1/1 Running 1 2h 192.168.120.220 sugi-kubernetes110-master01.localdomain
kube-system kube-proxy-khhwf 1/1 Running 1 2h 192.168.120.223 sugi-kubernetes110-node01.localdomain
kube-system kube-proxy-l8pbk 1/1 Running 1 2h 192.168.120.224 sugi-kubernetes110-node02.localdomain
kube-system kube-proxy-zblxq 1/1 Running 1 2h 192.168.120.220 sugi-kubernetes110-master01.localdomain
kube-system kube-scheduler-sugi-kubernetes110-master01.localdomain 1/1 Running 1 2h 192.168.120.220 sugi-kubernetes110-master01.localdomain
豆荚
Kubernetesでは、1個 or 複数のコンテナの集まりをPodと呼んでいます。
Podの中のコンテナは、同時にデプロイされます。
開始、停止、レプリカはPod単位で実行されます。
Pod的YAML定义
YAMLファイルを使用して、Nginxを使用したシンプルな定義をします。
DockerHubから、nginxイメージのバージョン
cat <<'EOF' > /root/kube_yaml/101_walkthrough/pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
EOF
Pod管理 (pinyin:
上記で定義したYAMLファイルを使用して、Podをデプロイすることが出来ます。
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl create -f /root/kube_yaml/101_walkthrough/pod-nginx.yaml
pod "nginx" created
kubectl run でも同様のことが出来ますが、YAMLファイルとして定義することで、gitなどでバージョン管理が出来るため、本番環境ではYAMLで実行するのがおすすめです。
podの状態を確認します
STATUSがContainerCreatingとなっているため、完了まで待機します。
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 0/1 ContainerCreating 0 19s <none> sugi-kubernetes110-node02.localdomain
状态已更改为运行中
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 1m 10.244.2.2 sugi-kubernetes110-node02.localdomain
環境によりますが、ほとんどの環境では、PodのIPアドレス(上記の例だと10.244.2.2)には、Kubernetesクラスタの外部からアクセスが出来ません。
デプロイしたPodが稼働しているかどうかテストする簡単な方法は、busyboxコマンドが格納されているコンテナイメージをデプロイする方法です。
BusyBoxイメージをデプロイと同時に、BusyBoxコンテナ内のshellに接続します
その際に、envでBusyBoxコンテナ内の環境変数を指定して、nginxのClusterIPを渡しています
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1 --env "POD_IP=$(kubectl get pod nginx -o go-template='{{.status.podIP}}')"
If you don't see a command prompt, try pressing enter.
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 sh
5 root 0:00 ps aux
/ #
/ #
/ #
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 0a:58:0a:f4:01:04 brd ff:ff:ff:ff:ff:ff
inet 10.244.1.4/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::2c8b:15ff:fee8:1bbb/64 scope link
valid_lft forever preferred_lft forever
/ #
/ #
/ #
/ # ip r
default via 10.244.1.1 dev eth0
10.244.0.0/16 via 10.244.1.1 dev eth0
10.244.1.0/24 dev eth0 scope link src 10.244.1.4
/ #
/ #
/ #
/ # echo $POD_IP
10.244.2.2
在BusyBox容器中,使用wget命令对nginx进行HTTP访问。
结果显示nginx的欢迎页面已返回,确认其正常运行。
/ # wget -qO- http://$POD_IP
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ #
/ #
/ #
/ # exit
[root@sugi-kubernetes110-master01 101_walkthrough]#
删除BusyBoxPod
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 0/1 Completed 0 3m
nginx 1/1 Running 0 56m
[root@sugi-kubernetes110-master01 101_walkthrough]#
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl delete pod busybox
pod "busybox" deleted
[root@sugi-kubernetes110-master01 101_walkthrough]#
删除nginxPod。
kubectl delete pod nginx
数量
Pod内のファイルシステムは、Podが稼働している間だけデータを保持しています。つまり、Podの再起動や障害が発生した際には、Pod内のデータは消えます。
アプリケーションが永続的なデータを保管したい場合は、persistent volume を利用することで、Podの外部にデータを保管することが出来ます。
次の例では、redisPodをデプロイする際に、以下の内容を含めています
-
- volumeの定義 (Podのデプロイ先Nodeのローカルファイルシステムを使用。異なるPodに移動するとデータが消える。テスト用に使用)
- 定義したvolumeをコンテナ内の /data/redis にマウント
cat <<'EOF' > /root/kube_yaml/101_walkthrough/pod-redis.yaml
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-persistent-storage
mountPath: /data/redis
volumes:
- name: redis-persistent-storage
emptyDir: {}
EOF
部署/部署工作
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl create -f /root/kube_yaml/101_walkthrough/pod-redis.yaml
pod "redis" created
我会确认Pod的状态。
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
redis 1/1 Running 0 4m 10.244.2.3 sugi-kubernetes110-node02.localdomain
我会查看Pod的详细信息。
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl describe pods redis
Name: redis
Namespace: default
Node: sugi-kubernetes110-node02.localdomain/192.168.120.224
Start Time: Sun, 29 Apr 2018 01:32:58 +0900
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.244.2.3
Containers:
redis:
Container ID: docker://35605f94178e807c3e14a0a89f87a54dcf439d65b4d7f06c5284cbfc9fc69c4d
Image: redis
Image ID: docker-pullable://docker.io/redis@sha256:2a10443dced488731f0a3ed12e442c230d39b526f95ecb8e280cd1596705e822
Port: <none>
Host Port: <none>
State: Running
Started: Sun, 29 Apr 2018 01:33:39 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/data/redis from redis-persistent-storage (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-q65hj (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
redis-persistent-storage:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
default-token-q65hj:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-q65hj
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 48s default-scheduler Successfully assigned redis to sugi-kubernetes110-node02.localdomain
Normal SuccessfulMountVolume 48s kubelet, sugi-kubernetes110-node02.localdomain MountVolume.SetUp succeeded for volume "redis-persistent-storage"
Normal SuccessfulMountVolume 48s kubelet, sugi-kubernetes110-node02.localdomain MountVolume.SetUp succeeded for volume "default-token-q65hj"
Normal Pulling 47s kubelet, sugi-kubernetes110-node02.localdomain pulling image "redis"
Normal Pulled 7s kubelet, sugi-kubernetes110-node02.localdomain Successfully pulled image "redis"
Normal Created 7s kubelet, sugi-kubernetes110-node02.localdomain Created container
Normal Started 7s kubelet, sugi-kubernetes110-node02.localdomain Started container
redisPodのデプロイ先のNodeである「sugi-kubernetes110-node02」の、ローカルファイルシステムがvolumeとして使用されていることになります
「sugi-kubernetes110-node02」でdocker ps を実行し、コンテナ一覧を確認
[root@sugi-kubernetes110-node02 redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35605f94178e docker.io/redis@sha256:2a10443dced488731f0a3ed12e442c230d39b526f95ecb8e280cd1596705e822 "docker-entrypoint..." 8 minutes ago Up 8 minutes k8s_redis_redis_default_cf58a748-4b01-11e8-baee-0050569817ee_0
9983e98b0149 k8s.gcr.io/pause-amd64:3.1 "/pause" 8 minutes ago Up 8 minutes k8s_POD_redis_default_cf58a748-4b01-11e8-baee-0050569817ee_0
8b275f7c03c3 2b736d06ca4c "/opt/bin/flanneld..." 2 hours ago Up 2 hours k8s_kube-flannel_kube-flannel-ds-5tgh7_kube-system_4679fc06-4ae3-11e8-bbe9-0050569817ee_1
13b5e5f69d69 77019aa0531a "/usr/local/bin/ku..." 2 hours ago Up 2 hours k8s_kube-proxy_kube-proxy-l8pbk_kube-system_4679a0d6-4ae3-11e8-bbe9-0050569817ee_1
ae9b7156a62a k8s.gcr.io/pause-amd64:3.1 "/pause" 2 hours ago Up 2 hours k8s_POD_kube-flannel-ds-5tgh7_kube-system_4679fc06-4ae3-11e8-bbe9-0050569817ee_1
5ca34711fe92 k8s.gcr.io/pause-amd64:3.1 "/pause" 2 hours ago Up 2 hours k8s_POD_kube-proxy-l8pbk_kube-system_4679a0d6-4ae3-11e8-bbe9-0050569817ee_1
请用docker inspect命令来确认CONTAINER ID「35605f94178e」对应的容器。通过使用该命令,您可以查看容器所挂载的路径。
[root@sugi-kubernetes110-node02 redis]# docker inspect 35605f94178e | grep Mounts -A43
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/cf58a748-4b01-11e8-baee-0050569817ee/volumes/kubernetes.io~secret/default-token-q65hj",
"Destination": "/var/run/secrets/kubernetes.io/serviceaccount",
"Mode": "ro,rslave",
"RW": false,
"Propagation": "rslave"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/cf58a748-4b01-11e8-baee-0050569817ee/etc-hosts",
"Destination": "/etc/hosts",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/cf58a748-4b01-11e8-baee-0050569817ee/containers/redis/f4b441cf",
"Destination": "/dev/termination-log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "volume",
"Name": "33ef4ea6079e4318f6086f878bc88d3c00150e73c3bb05166bb6634cde2aa023",
"Source": "/var/lib/docker/volumes/33ef4ea6079e4318f6086f878bc88d3c00150e73c3bb05166bb6634cde2aa023/_data", <------------------------------- ここを確認
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/cf58a748-4b01-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/redis-persistent-storage",
"Destination": "/data/redis",
"Mode": "rslave",
"RW": true,
"Propagation": "rslave"
}
],
通过「sugi-kubernetes110-node02」,检查源目录。
[root@sugi-kubernetes110-node02 redis]# ls -la /var/lib/docker/volumes/33ef4ea6079e4318f6086f878bc88d3c00150e73c3bb05166bb6634cde2aa023/_data/
total 0
drwxr-xr-x 3 systemd-bus-proxy ssh_keys 19 Apr 29 01:33 .
drwxr-xr-x 3 root root 19 Apr 29 01:33 ..
drwxr-xr-x 2 root root 6 Apr 29 01:33 redis
[root@sugi-kubernetes110-node02 redis]# ls -la /var/lib/docker/volumes/33ef4ea6079e4318f6086f878bc88d3c00150e73c3bb05166bb6634cde2aa023/_data/redis/
total 0
drwxr-xr-x 2 root root 6 Apr 29 01:33 .
drwxr-xr-x 3 systemd-bus-proxy ssh_keys 19 Apr 29 01:33 ..
redisコンテナのshellにログインします
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl exec -it redis /bin/bash
root@redis:/data#
确认/data目录的文件结构。
与在”sugi-kubernetes110-node02″上确认的结构相一致。
root@redis:/data# pwd
/data
root@redis:/data#
root@redis:/data# ls -la
total 0
drwxr-xr-x 3 redis redis 19 Apr 28 16:33 .
drwxr-xr-x 1 root root 17 Apr 28 16:33 ..
drwxrwxrwx 2 redis root 6 Apr 28 16:32 redis
在容器上创建一个适当的文件在/data/redis/目录下,并验证其行为。
cat <<'EOF' > /data/redis/test.txt
can you look me?
EOF
volumeに emptyDirを指定しているので、Node02上にはデータが書き込まれない (そうなのか。ここまでチュートリアルを進めて、データが出力されないことに気が付きました)
[root@sugi-kubernetes110-node02 _data]# pwd
/var/lib/docker/volumes/33ef4ea6079e4318f6086f878bc88d3c00150e73c3bb05166bb6634cde2aa023/_data
[root@sugi-kubernetes110-node02 _data]#
[root@sugi-kubernetes110-node02 _data]# ls -la redis/
total 0
drwxr-xr-x 2 root root 6 Apr 29 01:33 .
drwxr-xr-x 3 systemd-bus-proxy ssh_keys 19 Apr 29 01:33 ..
多个容器
Pod内に複数コンテナを含めた形式にして、volumeが共有されていることを確認します。
下面是如何创建清单文件的方式。
-
- nginxコンテナと、redisコンテナの2種類を1Podに内包
- nginxコンテナの「/srv/www」とgit-monitorコンテナの「/data」はvolumeとして共有されている
cat <<'EOF' > /root/kube_yaml/101_walkthrough/pod-multiple.yaml
apiVersion: v1
kind: Pod
metadata:
name: www
spec:
containers:
- name: nginx
image: nginx:1.7.9
volumeMounts:
- mountPath: /srv/www
name: www-data
readOnly: true
- name: redis
image: redis
env:
- name: GIT_REPO
value: http://github.com/some/repo.git
volumeMounts:
- mountPath: /data
name: www-data
volumes:
- name: www-data
emptyDir: {}
EOF
部署
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl create -f /root/kube_yaml/101_walkthrough/pod-multiple.yaml
pod "www" created
确认状态
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
www 0/2 ContainerCreating 0 10s <none> sugi-kubernetes110-node01.localdomain
在部署先的Node上使用Docker Inspect进行操作,确认已挂载的目录。
[root@sugi-kubernetes110-node01 ~]# docker inspect 9e4add3d6de2 | grep Mounts -A43
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/etc-hosts",
"Destination": "/etc/hosts",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/containers/redis/83241a20",
"Destination": "/dev/termination-log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/www-data", <---------------------------- ここを確認
"Destination": "/data",
"Mode": "rslave",
"RW": true,
"Propagation": "rslave"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~secret/default-token-q65hj",
"Destination": "/var/run/secrets/kubernetes.io/serviceaccount",
"Mode": "ro,rslave",
"RW": false,
"Propagation": "rslave"
}
],
现在是一片空白。
[root@sugi-kubernetes110-node01 www-data]# pwd
/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/www-data
[root@sugi-kubernetes110-node01 www-data]#
[root@sugi-kubernetes110-node01 www-data]# ls -la
total 0
drwxrwxrwx 2 systemd-bus-proxy root 6 Apr 29 02:14 .
drwxr-xr-x 3 root root 22 Apr 29 02:14 ..
我确认了wwwPod的详细信息,发现其中包含了两个容器。
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl describe pods www
Name: www
Namespace: default
Node: sugi-kubernetes110-node01.localdomain/192.168.120.223
Start Time: Sun, 29 Apr 2018 02:14:20 +0900
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.244.1.6
Containers:
nginx:
Container ID: docker://389b82c1dfd62513c5e78344c0f38b79349bec873bf7e52c09baf44de381401d
Image: nginx:1.7.9
Image ID: docker-pullable://docker.io/nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
Port: <none>
Host Port: <none>
State: Running
Started: Sun, 29 Apr 2018 02:14:47 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/srv/www from www-data (ro)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-q65hj (ro)
redis:
Container ID: docker://9e4add3d6de2e53cc2b06a750f91082fb0547e68fb90445e2cbd80d6d58dba9d
Image: redis
Image ID: docker-pullable://docker.io/redis@sha256:2a10443dced488731f0a3ed12e442c230d39b526f95ecb8e280cd1596705e822
Port: <none>
Host Port: <none>
State: Running
Started: Sun, 29 Apr 2018 02:15:13 +0900
Ready: True
Restart Count: 0
Environment:
GIT_REPO: http://github.com/some/repo.git
Mounts:
/data from www-data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-q65hj (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
www-data:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
default-token-q65hj:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-q65hj
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 8m default-scheduler Successfully assigned www to sugi-kubernetes110-node01.localdomain
Normal SuccessfulMountVolume 8m kubelet, sugi-kubernetes110-node01.localdomain MountVolume.SetUp succeeded for volume "www-data"
Normal SuccessfulMountVolume 8m kubelet, sugi-kubernetes110-node01.localdomain MountVolume.SetUp succeeded for volume "default-token-q65hj"
Normal Pulling 8m kubelet, sugi-kubernetes110-node01.localdomain pulling image "nginx:1.7.9"
Normal Pulled 8m kubelet, sugi-kubernetes110-node01.localdomain Successfully pulled image "nginx:1.7.9"
Normal Created 8m kubelet, sugi-kubernetes110-node01.localdomain Created container
Normal Started 8m kubelet, sugi-kubernetes110-node01.localdomain Started container
Normal Pulling 8m kubelet, sugi-kubernetes110-node01.localdomain pulling image "redis"
Normal Pulled 7m kubelet, sugi-kubernetes110-node01.localdomain Successfully pulled image "redis"
Normal Created 7m kubelet, sugi-kubernetes110-node01.localdomain Created container
Normal Started 7m kubelet, sugi-kubernetes110-node01.localdomain Started container
登录到redis容器的shell。
由于Pod名为”www”的存在多个容器,所以使用”-c”选项来指定容器名称。
[root@sugi-kubernetes110-master01 101_walkthrough]# kubectl exec -it www -c redis /bin/bash
root@redis:/data#
在容器上创建一个适当的文件在/data/redis/目录下,然后进行行为确认。
cat <<'EOF' > /data/test.txt
can you look me?
EOF
nginxコンテナのshellにログインします
[root@sugi-kubernetes110-master01 ~]# kubectl exec -it www -c nginx /bin/bash
root@www:/#
当检查挂载点时,我们可以看到test.txt文件存在且已被共享。
root@www:/srv/www# pwd
/srv/www
root@www:/srv/www#
root@www:/srv/www# cat test.txt
can you look me?
我会在正在运行的 Pod “sugi-kubernetes110-node01” 上进行确认。
通过检查上方显示的 Docker 进程的名称,我们可以确定 www Pod 中存在nginx容器和redis容器。
[root@sugi-kubernetes110-node01 www-data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e4add3d6de2 docker.io/redis@sha256:2a10443dced488731f0a3ed12e442c230d39b526f95ecb8e280cd1596705e822 "docker-entrypoint..." 18 minutes ago Up 18 minutes k8s_redis_www_default_9737fa0b-4b07-11e8-baee-0050569817ee_0
389b82c1dfd6 docker.io/nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451 "nginx -g 'daemon ..." 19 minutes ago Up 19 minutes k8s_nginx_www_default_9737fa0b-4b07-11e8-baee-0050569817ee_0
ea4f9101872b k8s.gcr.io/pause-amd64:3.1 "/pause" 19 minutes ago Up 19 minutes k8s_POD_www_default_9737fa0b-4b07-11e8-baee-0050569817ee_0
b9d65d4ddb1c 2b736d06ca4c "/opt/bin/flanneld..." 3 hours ago Up 3 hours k8s_kube-flannel_kube-flannel-ds-d92qj_kube-system_436dce14-4ae3-11e8-bbe9-0050569817ee_1
5592ed89cbe0 77019aa0531a "/usr/local/bin/ku..." 3 hours ago Up 3 hours k8s_kube-proxy_kube-proxy-khhwf_kube-system_436d9ed6-4ae3-11e8-bbe9-0050569817ee_1
496d9d63cddd k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_kube-flannel-ds-d92qj_kube-system_436dce14-4ae3-11e8-bbe9-0050569817ee_1
fab2fd0c0a3b k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_kube-proxy-khhwf_kube-system_436d9ed6-4ae3-11e8-bbe9-0050569817ee_1
docker inspectでマウントしているpathを確認します
redisコンテナ
[root@sugi-kubernetes110-node01 www-data]# docker inspect k8s_redis_www_default_9737fa0b-4b07-11e8-baee-0050569817ee_0 | grep Mounts -A33
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/www-data",
"Destination": "/data",
"Mode": "rslave",
"RW": true,
"Propagation": "rslave"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~secret/default-token-q65hj",
"Destination": "/var/run/secrets/kubernetes.io/serviceaccount",
"Mode": "ro,rslave",
"RW": false,
"Propagation": "rslave"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/etc-hosts",
"Destination": "/etc/hosts",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/containers/redis/83241a20",
"Destination": "/dev/termination-log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
nginxコンテナ
[root@sugi-kubernetes110-node01 www-data]# docker inspect k8s_nginx_www_default_9737fa0b-4b07-11e8-baee-0050569817ee_0 | grep Mounts -A45
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/www-data",
"Destination": "/srv/www",
"Mode": "ro,rslave",
"RW": false,
"Propagation": "rslave"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~secret/default-token-q65hj",
"Destination": "/var/run/secrets/kubernetes.io/serviceaccount",
"Mode": "ro,rslave",
"RW": false,
"Propagation": "rslave"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/etc-hosts",
"Destination": "/etc/hosts",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/containers/nginx/7b84551e",
"Destination": "/dev/termination-log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "volume",
"Name": "cc23bcbef53fa0551005cf23cd104a133571c1f72e982276b8193c98be10d121",
"Source": "/var/lib/docker/volumes/cc23bcbef53fa0551005cf23cd104a133571c1f72e982276b8193c98be10d121/_data",
"Destination": "/var/cache/nginx",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
両方のコンテナが、Nodeホスト側の「/var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/www-data」をマウントしていることがわかります。
また、ホスト側でファイルが存在していることを確認できます
[root@sugi-kubernetes110-node01 www-data]# cat /var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/www-data/test.txt
can you look me?
[root@sugi-kubernetes110-node01 www-data]# ls -la /var/lib/kubelet/pods/9737fa0b-4b07-11e8-baee-0050569817ee/volumes/kubernetes.io~empty-dir/www-data/
total 4
drwxrwxrwx 2 systemd-bus-proxy root 22 Apr 29 02:31 .
drwxr-xr-x 3 root root 22 Apr 29 02:14 ..
-rw-r--r-- 1 root root 17 Apr 29 02:31 test.txt
请提供URL参考
Kubernetes 101 公式教程页面
https://kubernetes.io/docs/user-guide/walkthrough/