TIPS之 Kubernetes Kubelet 获得Node节点的 Shell 权限方法

Kubernetes Kubelet 获得Node节点的 Shell 权限方法

Posted by 董江 on Tuesday, October 25, 2022

Kubernetes Kubelet 获得Node节点的 Shell 权限方法

Kubernetes 集群的整个生命周期中,可能需要访问集群工作节点。此访问可能用于维护配置检查日志收集其他故障排除操作。不仅如此,

如果可以在需要时启用此访问权限并在完成任务时禁用此访问权限,那就太好了。

方式一: SSH 方法

通常方式: 设置跳转服务器(也称为堡垒主机),通过最小授权方式管理支持的 SSH 基础设施,并通过 sshshell 访问工作节点或运行一些命令

方式二: 通过Kubernetes特殊权限pod 实现部署和管理

首先,了解下 nsenter是一个来自包的小程序util-linux,可以与namespaces(和cgroups)其他进程一起运行程序.

nsenter pod在指定的 Kubernetes 工作Node节点上运行, 此shell脚本在主机的进程PID网络名称空间namespace中创建特权 ,使用标志运行,加入所有并以超级用户身份(使用命令)运行默认 shell. 例如:

nsenter podnsenter--allnamespacescgroupssu -

通过部署以上yaml方式,部署到特定node上

apiVersion: apps/v1
kind: DaemonSet
metadata:
  namespace: kube-system
  name: node-shell
spec:
  selector:
    matchLabels:
      name: node-shell
  template:
    metadata:
      labels:
        name: node-shell
    spec:
      containers:
      - name: shell
        image: docker.io/alpine:3.13
        command:
          - nsenter
        args:
          - '-t'
          - '1'
          - '-m'
          - '-u'
          - '-i'
          - '-n'
          - sleep
          - '14000'
        imagePullPolicy: IfNotPresent
        securityContext:
          privileged: true
      restartPolicy: Always
      terminationGracePeriodSeconds: 0
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      hostNetwork: true # join host network namespace
      hostPID: true     # join host process namespace
      hostIPC: true     # join host IPC namespace
      tolerations:
      - effect: NoExecute
        operator: Exists
      - effect: NoSchedule
        operator: Exists
      schedulerName: default-scheduler
      priorityClassName: system-node-critical
      preemptionPolicy: PreemptLowerPriority

部署方式:

$ kubectl create -f daemonset.yaml
daemonset.apps/node-shell created

$ kubectl get ds -n kube-system | grep "node-shell"
node-shell             5         5         5       5            5           <none>                        25s

$ kubectl exec -it node-shell-bxmcs -n kube-system -- /bin/bash
[root@kcs-cpu-test-s-wht2b /]#  sysctl -a |grep "oom"
vm.oom_dump_tasks = 1
vm.oom_kill_allocating_task = 0
vm.panic_on_oom = 0

总结

不需要为node节点分配公网EIP地址,以纯 Kubernetes 方式管理 Kubernetes 节点相对容易,无需承担不必要的风险和管理复杂的 SSH 基础设施。

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付