先日以下の記事を書きました。
DistrolessコンテナでもEKSでのデバッグを諦めない
この記事を書いたときには、EKSの最新Kubernetesバージョンが1.30だったので、 一部のやりたい機能ができなかったのですが、 先月末についにEKSにも1.31がやってきたので、1.31でできるようになったことを紹介します。
やりたいことは前回と同じく、root以外のユーザで動作するコンテナ対してデバッグコマンドでファイルシステムにアクセスすることです。
$ kubectl run hello --image gcr.io/google-samples/hello-app:1.0
pod/hello created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello 1/1 Running 0 5s
$ kubectl debug -it hello --image busybox --target hello -- sh
Targeting container "hello". If you don't see processes from this container it may be because the container runtime doesn't support this feature.
Defaulting debug container name to debugger-vbns9.
If you don't see a command prompt, try pressing enter.
/ #
/ # id
uid=0(root) gid=0(root) groups=0(root),10(wheel)
/ #
/ # ps -ef
PID USER TIME COMMAND
1 65532 0:00 /hello-app
10 root 0:00 sh
16 root 0:00 ps -ef
/ # ls /proc/1/root
ls: /proc/1/root: Permission denied
/ #
/ # ls -l /proc/1/root
ls: /proc/1/root: cannot read link: Permission denied
lrwxrwxrwx 1 65532 65532 0 Oct 20 04:27 /proc/1/root
前回同様、デバッグしたい先のコンテナがuid 65532で動作していて、 不一致のためファイルシステムにアクセスできないことが確認できます。
デバッグ用のコンテナイメージを作らずに、プロファイル指定でデバッグする
これは、前回の記事を公開後に教えてもらったのですが、実は1.30の時点でできます。
kubectl debug
の際に、 --profile
オプションを使うことでデバッグコンテナのプロファイルを修正することができ、
これを利用することでユーザが異なるコンテナイメージに対しても、強い権限でアクセスすることが可能になります。
$ kubectl debug -it hello --image busybox --target hello --profile sysadmin -- sh
Targeting container "hello". If you don't see processes from this container it may be because the container runtime doesn't support this feature.
Defaulting debug container name to debugger-5trdh.
If you don't see a command prompt, try pressing enter.
/ #
/ # id
uid=0(root) gid=0(root) groups=0(root),10(wheel)
/ #
/ # ps -ef
PID USER TIME COMMAND
1 65532 0:00 /hello-app
45 65532 0:00 sh
82 root 0:00 sh
89 root 0:00 ps -ef
/ #
/ # ls /proc/1/root
bin boot dev etc hello-app home lib lib64 proc root run sbin sys tmp usr var
/ #
/ #
コマンド引数に --profile sysadmin
がついたことに注意してください。
そして、実行時のuidは同じでありながら、ファイルシステムにアクセスできることが確認できます。
プロファイルの詳細は以下を参照してください。
https://kubernetes.io/ja/docs/tasks/debug/debug-application/debug-running-pod/#debugging-profiles
カスタムプロファイルを設定する
そして、Kubernetes 1.31からベータに昇格したのが、カスタムプロファイルをいう機能です。 これは上記プロファイルをプリセットのものではなく自由に設定することができる機能となります。
これを実行するには、あらかじめPodの設定のうち、 .spec
配下の上書きしたい部分を抜きだしたyamlファイルを作成しておきます。
今回は、uid、gidを変更したいので、以下のような簡単なyamlファイルをcustom.yamlという名前で作成しました。
securityContext:
runAsUser: 65532
runAsGroup: 65532
そして、kubectl debugを実行する際に、 --custom
オプションの引数にこのファイル名を指定することで、
デバッグ用コンテナの設定を上書きして動作させることが可能です。
$ kubectl debug -it hello --image busybox --target hello --custom custom.yaml -- sh
Targeting container "hello". If you don't see processes from this container it may be because the container runtime doesn't support this feature.
Defaulting debug container name to debugger-jssb4.
If you don't see a command prompt, try pressing enter.
~ $
~ $ id
uid=65532 gid=65532 groups=65532
~ $
~ $ ps -ef
PID USER TIME COMMAND
1 65532 0:00 /hello-app
45 65532 0:00 sh
91 65532 0:00 sh
98 65532 0:00 ps -ef
~ $
~ $ ls /proc/1/root/
bin boot dev etc hello-app home lib lib64 proc root run sbin sys tmp usr var
~ $
このように、デバッグ用のコンテナの実行ユーザを変更することができ、 期待通り動かすことができました。
まとめ
今回は、EKSに1.31が来てできるようになった、デバッグ時のカスタムプロファイルの設定について紹介しました。
前回内容とあわせて、Kubernetesでデバッグが必要になったときの頼りになる機能ですので、 もしデバッグのためにメインのコンテナにシェルやツールをいれようか迷っているかたは、この機能で代替できないか検討してみてください。
Share