kubectl debugとnetshootの使用

はじめに

KubernetesのPodのデバッグのための一つの方法として、エフェメラルコンテナを使用してみる。

環境

問題、課題

KubernetesのPodのデバッグのための一つの方法として、エフェメラルコンテナの使用がある。

kubernetes.io エフェメラルコンテナは、コンテナがクラッシュしたり、コンテナイメージにデバッグユーティリティが含まれていないなどの理由でkubectl execが不十分な場合に、対話的にトラブルシューティングを行うのに便利である。

エフェメラルコンテナとして、ネットワーク関連のデバッグコマンドが入っている以下のnetshootを使用し、動作を確認する。

github.com

解決、構築

まずは動作確認用のPodを立てる。

$ kubectl run nginx --image==nginx:latest --port=80
$ kubectl get po
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          32s

次にkubectl debugコマンドでnetshootを、先ほどのPodにアタッチする。

$ kubectl debug nginx -it --image=nicolaka/netshoot
Defaulting debug container name to debugger-ggtqg.
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (containers "nginx", "debugger-jmvt4", "debugger-ggtqg" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (containers "nginx", "debugger-jmvt4", "debugger-ggtqg" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or containers "nginx", "debugger-jmvt4", "debugger-ggtqg" must set securityContext.runAsNonRoot=true), seccompProfile (pod or containers "nginx", "debugger-jmvt4", "debugger-ggtqg" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
If you don't see a command prompt, try pressing enter.
                    dP            dP                           dP
                    88            88                           88
88d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P
88'  `88 88ooood8   88   Y8ooooo. 88'  `88 88'  `88 88'  `88   88
88    88 88.  ...   88         88 88    88 88.  .88 88.  .88   88
dP    dP `88888P'   dP   `88888P' dP    dP `88888P' `88888P'   dP

Welcome to Netshoot! (github.com/nicolaka/netshoot)
Version: 0.11
 

 nginx  ~  

確認

試しにipコマンドで動作を確認する。まずはエフェメラルコンテナで確認する。

 nginx  ~  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
    inet6 ::1/128 scope host
       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@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default qlen 1000
    link/ether 2a:70:71:2f:ba:50 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.120.174/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::2870:71ff:fe2f:ba50/64 scope link
       valid_lft forever preferred_lft forever

次にnginxのPodを確認する。

$ kubectl exec nginx -- apt update
$ kubectl exec nginx -- apt install iproute2 -y
$ kubectl exec nginx -- 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
    inet6 ::1/128 scope host
       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@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default qlen 1000
    link/ether 2a:70:71:2f:ba:50 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.120.174/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::2870:71ff:fe2f:ba50/64 scope link
       valid_lft forever preferred_lft forever

同じ動作をしていることを確認できた。

補足

netshootではその他にも一部を抜粋するが、以下のようなコマンドがインストールされており、重宝できそうだ。

参考

kubernetes.io

github.com