如何通过 kubectl 执行到 **节点**(不是容器)

如何通过 kubectl 执行到 **节点**(不是容器)

如何执行 K8s节点

到目前为止,我只找到了在节点上运行的容器的方法。

我想避免ssh

答案1

pod(及其容器)上方的层是操作系统(不包括 k8s 的逻辑层)。

没有任何工具(据我所知)特别是 kubernetes 管理工具的一部分可以做到这一点 - 这就是 SSH 的用途。

答案2

您可以使用kubectl-节点外壳

kubectl-node-shell:在节点的主机操作系统中启动根 shell。

用法:

# Get standard bash shell
kubectl node-shell <node>

为此,您需要能够启动特权容器。

答案3

根据您想要实现的目标,您可以启动具有更多权限的 pod。例如,您可以在 / 上执行 hostpath 挂载。只要具备一些 Linux 知识,这应该就足够了。

apiVersion: v1
kind: Pod
metadata:
  name: evil-pod
spec:
  containers:
  - image: busybox
    name: evil
    command: ["/bin/sh"]
    args: "-c" ,"sleep infinity"]
    volumeMounts:
    - mountPath: /host
      name: host-root
  volumes:
  - hostPath:
      path: /
      type: ""
    name: host-root

请注意,这当然是一个安全问题,在安全集群中不应该发生这种情况。如果您必须维护节点,请按照 samson 的建议使用 ssh

答案4

如果您需要访问 Kubernetes 集群的底层节点(并且您没有直接访问权限 - 通常如果您在其他地方托管 Kubernetes),则可以使用以下部署来创建 Pod,您可以在其中使用 登录kubectl exec,并且可以访问 下的节点 IPC 和完整文件系统/node-fs。要获得一个就像您已通过 SSHd 进入的节点控制台,请在登录后执行chroot /node-fs。不建议让它保持运行,但如果您需要访问节点,这会有所帮助。因为它是一个 DaemonSet,它会在每个节点上启动其中一个 Pod。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: privpod
spec:
  selector:
    matchLabels:
      mydaemon: privpod
  template:
    metadata:
      labels:
        mydaemon: privpod
    spec:
      hostNetwork: true
      hostPID: true
      hostIPC: true
      containers:
        - name: privcontainer
          image: johnnyb61820/network-toolkit
          securityContext:
            privileged: true
          command:
            - tail
            - "-f"
            - /dev/null
          volumeMounts:
            - name: nodefs
              mountPath: /node-fs
            - name: devfs
              mountPath: /dev
      volumes:
        - name: nodefs
          hostPath:
            path: / 
        - name: devfs
          hostPath:
            path: /dev

这来自附录 C.13使用 Docker 和 Kubernetes 的云原生应用程序。我发现这很有用,特别是当我需要处理物理驱动器或类似的东西时。这不是你应该一直运行的东西,但在你处于困境时会有所帮助。

相关内容