为何Linux的ps命令能看到K8s Pod运行的进程?
问题
在Linux基金会的CKAD课程(LFD259)环境中,我用kubeadm搭建了裸金属K8s集群,worker节点上运行着metrics-server的Deployment:
student@master:~$ k get deployments.apps metrics-server -o yaml | grep -A10 args - args: - --secure-port=4443 - --cert-dir=/tmp - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - --kubelet-use-node-status-port - --metric-resolution=15s - --kubelet-insecure-tls image: k8s.gcr.io/metrics-server/metrics-server:v0.6.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 student@master:~$ k get pod metrics-server-6894588c69-fpvtt -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES metrics-server-6894588c69-fpvtt 1/1 Running 0 4d15h 192.168.171.98 worker <none> <none> student@master:~$
我原本以为Pod的进程只在worker节点的容器内部运行,但用Linux的ps命令竟然能直接看到它:
student@worker:~$ ps aux | grep kubelet-preferred-address-types ubuntu 1343092 0.3 0.6 752468 49612 ? Ssl Oct28 20:25 /metrics-server --secure-port=4443 --cert-dir=/tmp --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --kubelet-use-node-status-port --metric-resolution=15s --kubelet-insecure-tls student 3310743 0.0 0.0 8184 2532 pts/0 S+ 17:39 0:00 grep --color=auto kubelet-preferred-address-types student@worker:~$
我忽略了什么关键点?
解答
这是容器技术的核心特性导致的:
- 容器本质上是宿主机上被隔离的进程,它依赖Linux的namespace(命名空间)实现资源隔离,用cgroup实现资源限制,但进程本身仍然属于宿主机的进程树。
- 默认情况下,
ps aux命令会显示宿主机上所有的进程,包括运行在容器内的进程——这些进程只是被限制在自己的命名空间中,从宿主机角度看它们依然是普通进程。 - 你看到的
/metrics-server进程就是容器内的主进程,只是从宿主机的全局进程视角可见。如果要查看容器内部的进程,需要使用工具进入容器的命名空间,比如kubectl exec <pod-name> -- ps aux,或者用nsenter直接挂载容器的命名空间。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

