为什么 pod 里面执行的 dmesg 命令和系统里面的一样,不是应该环境分离吗?
在 Kubernetes 环境中,尽管 Pod 提供了与主机系统隔离的运行环境,但它们仍然与宿主机共享某些底层资源和环境,如内核。这种设计使得在任何 Pod 内部执行的 dmesg 命令显示的是宿主机的内核日志,而不是特定于 Pod 的日志。
原因解释
内核共享:所有在同一宿主机上的容器(包括 Pod 内的容器)都运行在同一个操作系统内核之上。dmesg 命令显示的是内核的环环缓冲区消息,这些消息是系统级别的,不是隔离在单独的容器或 Pod 中的。
安全和隔离的考虑
修改内核参数
在宿主机上,可以修改 kernel.dmesg_restrict 内核参数。当设置为 1 时,限制非特权用户禁止访问 dmesg,这样设置后,只有具有 CAP_SYS_ADMIN 能力的用户才能访问 dmesg
- kernel.dmesg_restrict 为 0
pod 拥有执行 dmesg 权限
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-dmesg
spec:
nodeSelector:
kubernetes.io/hostname: "172.31.1.127"
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["sh", "-c", "sleep infinity"] # 持续运行容器
EOF
pod/ubuntu-dmesg created
# kubectl exec -it ubuntu-dmesg -- dmesg | head -n 2
Defaulted container "ubuntu" out of: ubuntu, k8tz (init)
<