Podの動作を確認する


はじめに

Kubernetesは「Pod」という単位でデプロイされます。Podはコンテナの集合体で、一つ以上のコンテナで構成されています。
また、コンテナが一つでもPodとしてデプロイされます。
今回はこのPodについてまとめていきます。

ネットワーク構成

KubernetesではIPアドレスはPodに対して割り当てられます。そのため、同一Pod内のコンテナは同じIPアドレスを持つことになります。
もし、同一Pod内のコンテナがPod外部に対してアクセスする必要がある場合には、ポートを分ける必要があります。

同一Pod内のコンテナはlocalhostで通信できます。

Podのデプロイ

以下のyamlファイルでnginxとRedisを含むPodをデプロイします。

nginx_redis.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod1
spec:
  containers:
    - name: nginx
      image: nginx:latest
    - name: redis
      image: redis:latest
$ kubectl apply -f nginx_redis.yaml
pod/sample-pod1 created
$ kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
sample-pod1   2/2     Running   0          40s

READYのコンテナ数が「2/2」になって、STATUSが「Running」になってます。
ちなみにログを確認する場合は、コンテナ単位で確認する必要があります。

$ kubectl logs sample-pod1
error: a container name must be specified for pod sample-pod1, choose one of: [nginx redis]
$ kubectl logs sample-pod1 -c nginx
$ kubectl logs sample-pod1 -c redis
1:C 08 Mar 2020 02:10:31.296 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 08 Mar 2020 02:10:31.296 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 08 Mar 2020 02:10:31.296 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 08 Mar 2020 02:10:31.298 * Running mode=standalone, port=6379.
1:M 08 Mar 2020 02:10:31.298 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 08 Mar 2020 02:10:31.298 # Server initialized
1:M 08 Mar 2020 02:10:31.298 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 08 Mar 2020 02:10:31.299 * Ready to accept connections

何かWARNINGが出てるけど、とりあえずここでは気にしない。

コンテナ内の確認

Podがデプロイできたので、コンテナにログインして確認します。

nginx

kubectl exeでログインします。
コンテナが複数あるとき、コンテナ名を指定しないと「Defaulting container」にログインされます。
※デフォルトのコンテナが何か?は、おそらく、kubectl describe podで一番上に表示されるコンテナではないかと推測。

$ kubectl exec -it sample-pod1 /bin/bash
Defaulting container name to nginx.
Use 'kubectl describe pod/sample-pod1 -n default' to see all of the containers in this pod.
root@sample-pod1:/#

デフォルト状態ではipコマンドが使えないので、インストールしてIPアドレスを確認する。

root@sample-pod1:/# apt-get update
・・・
root@sample-pod1:/# apt-get install iproute2
・・・
root@sample-pod1:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
    link/ether ea:e5:ec:2c:df:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.69.200/32 scope global eth0
       valid_lft forever preferred_lft forever

Redis

nginxからログアウトし、今度はRedisにログインする。

$ kubectl exec -it sample-pod1 -c redis /bin/bash
root@sample-pod1:/data#

nginxと同様にIPアドレスを確認します。

root@sample-pod1:/data# apt-get update
・・・
root@sample-pod1:/data# apt-get install iproute
・・・
root@sample-pod1:/data# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
    link/ether ea:e5:ec:2c:df:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.69.200/32 scope global eth0
       valid_lft forever preferred_lft forever

どちらも同じ「192.168.69.200/32」を持つことが確認できました。

なお、Podに割り当てられたIPアドレスは、コンテナにログインしなくても確認できます。

$ kubectl get pod -o wide
NAME          READY   STATUS             RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
sample-pod1   2/2     Running            0          124m    192.168.69.200   k8s-worker02   <none>           <none>

ポートが競合する場合の動作確認

今度はあえてポートが競合する場合のPodをデプロイして、動作を確認してみます。

nginx_2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod2
spec:
  containers:
    - name: nginx1
      image: nginx:latest
    - name: nginx2
      image: nginx:latest

デプロイします。

$ kubectl apply -f nginx_2.yaml
pod/sample-pod2 created
$ kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
sample-pod2   1/2     Error     0          17s

デプロイはできましたが、STATUSが「Error」になって、起動しているコンテナも1つであることが確認できます。
どちらのコンテナがエラーになっているか確認します。

$ kubectl describe pod sample-pod2
・・・
Containers:
  nginx1:
    Container ID:   docker://90848de2293e1fb2ea4d1a92c4ac4520783731a2feadcf180ab2dce3eaf0ca56
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 08 Mar 2020 13:11:04 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nstst (ro)
  nginx2:
    Container ID:   docker://c6203e17546640f3e304280757fa2c93c467aba1a7dbd8b7048f0acbdee65675
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Sun, 08 Mar 2020 13:14:38 +0900
      Finished:     Sun, 08 Mar 2020 13:14:40 +0900
    Ready:          False
    Restart Count:  5
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nstst (ro)
・・・

nginx2がErrorになっています。
nginx2のログを確認します。

$ kubectl logs sample-pod2 -c nginx2
2020/03/08 04:14:38 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

80番ポートがバッティングしていることがわかります。