为什么 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)
[ 0.000000] Linux version 5.4.0-147-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #164-Ubuntu SMP Tue Mar 21 14:23:17 UTC 2023 (Ubuntu 5.4.0-147.164-generic 5.4.231)
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-147-generic root=/dev/vda1 ro true intel_idle.max_cstate=0 console=ttyS0 console=tty0 net.ifnames=0 biosdevname=0 mitigations=off
# kubectl exec -it ubuntu-dmesg -- sysctl kernel.dmesg_restrict
kernel.dmesg_restrict = 0
- kernel.dmesg_restrict 为 1
pod 默认没有执行 dmesg 权限,需要赋权
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-dmesg-1
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-1 created
# kubectl exec -it ubuntu-dmesg-1 -- dmesg | head -n 2
dmesg: read kernel buffer failed: Operation not permitted
command terminated with exit code 1
# kubectl exec -it ubuntu-dmesg-1 -- sysctl kernel.dmesg_restrict
kernel.dmesg_restrict = 1
### 赋予权限
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-dmesg-2
spec:
nodeSelector:
kubernetes.io/hostname: "172.31.1.127"
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["sh", "-c", "sleep infinity"] # 持续运行容器
securityContext:
capabilities:
add:
- SYS_ADMIN # 添加 CAP_SYS_ADMIN 权限
EOF
pod/ubuntu-dmesg-2 created
# kubectl exec -it ubuntu-dmesg-2 -- dmesg | head -n 2
[ 0.000000] Linux version 5.4.0-147-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #164-Ubuntu SMP Tue Mar 21 14:23:17 UTC 2023 (Ubuntu 5.4.0-147.164-generic 5.4.231)
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-147-generic root=/dev/vda1 ro true intel_idle.max_cstate=0 console=ttyS0 console=tty0 net.ifnames=0 biosdevname=0 mitigations=off
# kubectl exec -it ubuntu-dmesg-2 -- sysctl kernel.dmesg_restrict
kernel.dmesg_restrict = 1