Contents
概要
1つのPod内で複数のコンテナを実行します。本稿ではコンテナイメージにCentOSを使用します。特に正式な名称ではないと思いますが、「Multi Container Pod」で検索すると目的の情報に辿り着きやすいかもしれません。
手順
Podの作成
Manifestの作成
Manifestを作成します。Multi Container Podの場合、containers内の配列に同じように別の名前で追加するだけです。
root@k8s-01:~# vim /root/k8s/yaml/centos-mc.yaml
apiVersion: v1
kind: Pod
metadata:
name: centos-mc-pod
spec:
containers:
- name: centos1
image: centos
command:
- "/sbin/init"
- name: centos2
image: centos
command:
- "/sbin/init"
Manifestの実行
ManifestからPodを作成します。
root@k8s-01:~# kubectl create -f /root/k8s/yaml/centos-mc.yaml
pod/centos-mc-pod created
Podのステータス確認
Podのステータスを確認します。Multi Container Podで起動することで気づきましたが、READYの数はコンテナの数でした。
root@k8s-01:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
centos-mc-pod 2/2 Running 0 28s
コンテナ(≠Pod)のコマンドを実行
Podを指定して/bin/bashを起動
勘違いしている人をたまに見かけますが、kubectl exec -itはPodではなく、Pod内のコンテナのコマンドを実行しています。本稿のように複数のコンテナを起動させると分かりますが、”Defaulted container “centos1” out of: centos1, centos2″の通り、複数のコンテナが存在する為、コンテナを指定しなければデフォルトのコンテナに対してexecしています。
root@k8s-01:~# kubectl exec -it centos-mc-pod -- /bin/bash Defaulted container "centos1" out of: centos1, centos2 [root@centos-mc-pod /]# ls
execでコンテナを指定
-cオプションでexecの対象コンテナを指定しています。下記の通り、execはPodではなく各コンテナ内のコマンドを実行しています。Podmanでも同じです。Kubernetesの場合、Pod作成時に必ずコンテナを含める必要があり、kubectl execではコンテナを意識しなくても実行でき、1Pod/1Containerで説明しているサイトが多い為、分かりづらい状態になっていると思われます。そもそも1Pod/1ContainerだけだったらPodの意味があまりないですね。
root@k8s-01:~# kubectl exec -it centos-mc-pod -c centos1 -- /bin/bash [root@centos-mc-pod /]# echo centos1 > test.txt [root@centos-mc-pod /]# exit root@k8s-01:~# kubectl exec -it centos-mc-pod -c centos1 -- cat test.txt centos1 root@k8s-01:~# kubectl exec -it centos-mc-pod -c centos2 -- /bin/bash [root@centos-mc-pod /]# echo centos2 > test.txt [root@centos-mc-pod /]# exit root@k8s-01:~# kubectl exec -it centos-mc-pod -c centos2 -- cat test.txt centos2 root@k8s-01:~# kubectl exec -it centos-mc-pod -- cat test.txt Defaulted container "centos1" out of: centos1, centos2 centos1
※なぜか「kubectl exec -it centos-mc-pod -c centos1 — /bin/bash ‘echo “centos1” > test.txt’」は失敗します。