はじめに
KubernetesのPodのデバッグのための一つの方法として、エフェメラルコンテナを使用してみる。
環境
- Ubuntu 22.04
- kubernetes v1.28.3
- crio v1.28.2
問題、課題
KubernetesのPodのデバッグのための一つの方法として、エフェメラルコンテナの使用がある。
kubernetes.io エフェメラルコンテナは、コンテナがクラッシュしたり、コンテナイメージにデバッグユーティリティが含まれていないなどの理由でkubectl execが不十分な場合に、対話的にトラブルシューティングを行うのに便利である。
エフェメラルコンテナとして、ネットワーク関連のデバッグコマンドが入っている以下のnetshootを使用し、動作を確認する。
解決、構築
まずは動作確認用の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ではその他にも一部を抜粋するが、以下のようなコマンドがインストールされており、重宝できそうだ。