쿠버네티스 노드에 root 권한의 shell로 접속하기.
LENS(https://k8slens.dev/) 를 사용하다가, 쿠버네티스 노드에 root 권한의 shell로 접속할 수 있는 기능을 발견하였습니다.
이게 어떻게 가능한 일이지 궁금해서, 간단히 조사를 해보았습니다.
알고 보니 원리는 간단하였습니다.
권한이 있는 컨테이너(privileged containers)를 실행시키고, 그 컨테이너로 접속을 하는 것이었습니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8f5f3c2b4c08 alpine "nsenter -t 1 -m -u …" 53 seconds ago Up 52 seconds k8s_shell_node-shell-1fa79f9a-837e-4f46-a66a-c98e05fb5e5e_kube-system_2f3e6447-3046-11eb-951e-fa164857d866_0
docker inspect 8f5f3c2b4c08 [ { "Id": "8f5f3c2b4c083d7f9c301ce06331dbc429927f5a8ee64a9969f24ceae4c7a3f9", "Created": "2020-11-26T12:19:20.51461897Z", "Path": "nsenter", "Args": [ "-t", "1", "-m", "-u", "-i", "-n", "sleep", "14000" ], ... ]
nsenter
라는 명령어는 namepsace enter
의 약어입니다. 글자 그대로, 격리된 네임스페이스에 들어가는 명령어입니다.
kubectl node-shell
kubectl node-shell (https://github.com/kvaps/kubectl-node-shell) 을 이용해서. kubectl
에서도 똑같은 방법으로 노드에 접속할 수 있습니다.
Installation
using krew
brew install krew kubectl krew index add kvaps <https://github.com/kvaps/krew-index> kubectl krew install kvaps/node-shell
Usage
# Get standard bash shell kubectl node-shell <node>