Pod

podとは

  • 1以上のコンテナから構成されており、同じPodに含まれるコンテナ同士はネットワーク的に隔離されておらず、IPアドレスと共有してます。
  • 2つのコンテナが入ったPodを作成した場合、2つのコンテナ同士は同一のIPアドレスを持つこととなります。
  • Pod内のコンテナはお互いにlocalhostで通信することが可能です。

Podのデザインパターン

多くの場合、1つのPodに1つのコンテナが含まれますが、メインのコンテナ以外にメインのコンテナを補助するサブコンテナを含むパターンがあります。

  • サイドカーパターン
  • アンバサダーパターン
  • アダプタパターン

Podの作成

1.Podの定義ファイルの作成
ファイル: pod-sample-1.yml
Nginxのコンテナが含まれるPodの例です。

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: nginx-container
      image: nginx

2.Podの作成
コマンド: kubectl create -f 定義ファイル名
定義ファイルに定義されている情報をもとにPodを作成します。

$ kubectl create -f pod-sample-1.yml
pod/sample-pod created

3.Podの確認
コマンド: kubectl get pods
Podの一覧が取得できます。

$ kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          103s

4.Podの確認(詳細)
コマンド: kubectl get pods -o wide
「-o wide」オプションを付けると、IPや起動しているNode名等の追加情報が表示されます。

$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP           NODE                             NOMINATED NODE
sample-pod   1/1     Running   0          49s   10.244.1.3   yasuyuki03212c.mylabserver.com

5.Podの詳細情報の確認
コマンド: kubectl describe pod Pod名
作成したPodに含まれるコンテナの情報やPodの状態に関しての詳細な情報が表示されます。

$ kubectl describe pod sample
Name:               sample-pod
Namespace:          default
Priority:           0
PriorityClassName:  
Node:               yasuyuki03213c.mylabserver.com/172.31.12.83
Start Time:         Tue, 11 Dec 2018 14:41:46 +0000
Labels:             <none>
Annotations:        <none>
Status:             Running
IP:                 10.244.2.4
Containers:
  nginx-container:
    Container ID:   docker://c44385477ca2bd69f7fa0d782d92360cbe9aa268792db71b7221e2138dcc9aca
    Image:          nginx
    Image ID:       docker-pullable://[email protected]:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 11 Dec 2018 14:41:56 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nr79v (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
…

6.複数のコンテナを含むPod
ファイル: pod-sample-2.yml
NginxとRedisのコンテナが含まれるPodの例です。

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
    - name: redis-container
      image: redis

7.Podの確認(詳細)
コマンド: kubectl get pods -o wide
READYのコンテナ数が「2/2」となっていることが確認できます。

$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP           NODE                             NOMINATED NODE
sample-pod   2/2     Running   0          4m22s   10.244.1.4   yasuyuki03212c.mylabserver.com

8.接続確認
ncコマンドを使用し、それぞれのアプリケーションに接続します。
Nginx

$ (echo GET / HTTP/1.1\n\n) | nc 10.244.1.4 80
HTTP/1.1 400 Bad Request
Server: nginx/1.15.7
Date: Tue, 11 Dec 2018 15:05:37 GMT
Content-Type: text/html
Content-Length: 157
Connection: close
…

Redis

$ (echo ping) | nc 10.244.1.4 6379
+PONG

コンテナへのログイン方法

1.コンテナ上でbashを起動
コマンド: kubectl exec -it Pod名 /bin/bash
※Podに複数コンテナが含まれる場合には、「-c コンテナ名」でコンテナの指定が可能です。
コマンド: kubectl exec -it Pod名 -c コンテナ名 /bin/bash

kubectl exec -it sample-pod -c nginx-container /bin/bash
[email protected]:/#

2.稼働確認用のパッケージのインストール

apt-get update; apt-get -y install iproute procps

3.稼働確認
IPアドレスの確認

[email protected]:/# ip a | grep inet
    inet 127.0.0.1/8 scope host lo
    inet 10.244.1.7/24 scope global eth0
[email protected]:/#

LISTENしているポートの確認

[email protected]:/# ss -napt | grep -i listen
LISTEN     0      128          *:6379                     *:*
LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=1,fd=6))
LISTEN     0      128         :::6379                    :::*
[email protected]:/#

プロセスの確認

[email protected]:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:14 ?        00:00:00 nginx: master process nginx -g daemon off;
nginx        6     1  0 13:14 ?        00:00:00 nginx: worker process
root       232     0  0 13:26 pts/0    00:00:00 /bin/bash
root       553   232  0 13:31 pts/0    00:00:00 ps -ef
[email protected]:/#

コンテナに対してのコマンド実行

1.コマンド: kubectl exec Pod名 コマンド
※Podに複数コンテナが含まれる場合には、「-c コンテナ名」でコンテナの指定が可能です。
コマンド: kubectl exec Pod名 -c コンテナ名 コマンド
IPアドレスの確認

$ kubectl exec sample-pod -c nginx-container ip a | grep inet
    inet 127.0.0.1/8 scope host lo
    inet 10.244.1.7/24 scope global eth0
$

2.LISTENしているポートの確認

$ kubectl exec sample-pod -c nginx-container -- ss -napt | grep -i listen
LISTEN     0      128          *:6379                     *:*
LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=1,fd=6))
LISTEN     0      128         :::6379                    :::*
$

3.プロセスの確認

$ kubectl exec sample-pod -c nginx-container -- ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:14 ?        00:00:00 nginx: master process nginx -g daemon off;
nginx        6     1  0 13:14 ?        00:00:00 nginx: worker process
root       631     0  0 14:06 ?        00:00:00 ps -ef
$

コメント