如何执行 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 的云原生应用程序。我发现这很有用,特别是当我需要处理物理驱动器或类似的东西时。这不是你应该一直运行的东西,但在你处于困境时会有所帮助。