쿠버네티스 노드에 root 권한의 shell로 접속하기.

쿠버네티스 노드에 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>