← Home

kubernetes node shell plugin

29 January, 2023

kubectl exec 可以进到 pod 容器内获取 shell,有时候需要 shell 到 node,而原生的 kubectl debug 虽然支持但是不支持特权模式,拿不到 root 权限,也不能用宿主机上的大部分工具,发现 Lens 上有这个功能,把核心的部分拷贝出来,做成脚本,作为 kubectl 插件。

kubectl-shell 放到 PATH 即可, kubectl shell <node-name>

vi kubectl-shell
#!/bin/bash
set -e

node=${1}
nodeName=$(kubectl get node ${node} -o template --template='{{index .metadata.labels "kubernetes.io/hostname"}}') 
nodeSelector='"nodeSelector": { "kubernetes.io/hostname": "'${nodeName:?}'" },'
podName=node-shell-${node}

kubectl run ${podName:?} --restart=Never -it --rm --timeout=5m --pod-running-timeout=5m --image overriden --overrides '
{
  "spec": {
    "hostPID": true,
    "hostNetwork": true,
    '"${nodeSelector?}"'
    "tolerations": [{
        "operator": "Exists"
    }],
    "containers": [
      {
        "name": "shell",
        "image": "alpine",
        "command": [
          "nsenter", "-t", "1", "-m", "-u", "-i", "-n",
          "bash"
        ],
        "stdin": true,
        "tty": true,
        "securityContext": {
          "privileged": true
        }
      }
    ]
  }
}' --attach "$@"

原理:

创建一个有特权模式的 pod,调度到对应的 node 上运行,然后 nsenter 拿到 root shell

P.S.

发现已有社区相关插件了,下次可以先去 krew 找一下 :)