起因
某同学在查看pod的挂载文件状态时,看到有一个Mode状态为420,但是不记得yaml中有写这个数字,要写也是777、755、644等,也不会写420呀?那么这个数字时哪里来的?什么含义呢?
场景再现
apiVersion: v1
kind: Pod
metadata:
name: my-pod-with-configmap
spec:
containers:
- name: my-container
image: nginx:latest
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: example-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: example-config
data:
config.txt: |
key1=value1
key2=value2
在应用后,我们再次查看pod的运行yaml
kubectl get pod -o yaml
你会发现example-config定义中有个mode420
volumes:
- configMap:
defaultMode: 420
name: example-config
name: config-volume
揭开谜底
在 kubectl get cm
(或其他资源)输出中看到的 mode
值(如 420
)实际上是一个十进制表示的权限值,而 Linux 文件权限通常以八进制表示。因此,这个值是十进制形式的 Linux 权限。
如何理解 420
-
十进制
420
转换为八进制:
十进制420
转为八进制是0644
,表示:- 所有者(Owner):读写权限(
rw-
)。 - 组用户(Group):只读权限(
r--
)。 - 其他用户(Others):只读权限(
r--
)。
- 所有者(Owner):读写权限(
-
为什么用十进制显示:
- Kubernetes 内部使用十进制表示权限值,因为权限值存储在系统(如 etcd)中时,通常以整数形式保存。
- 当使用
kubectl
查看资源时,mode
字段中的权限值直接显示为十进制,而不是 Linux 常用的八进制格式。
-
常见值对照表:
十进制值 | 八进制值 | 权限含义 |
---|---|---|
420 | 0644 | 所有者可读写,其他用户只读 |
493 | 0755 | 所有者可读写执行,其他用户可读执行 |
384 | 0600 | 仅所有者可读写 |
511 | 0777 | 所有用户可读写执行 |
kubectl
中 mode
的来源
- 当一个 ConfigMap 被定义或挂载为文件时,Kubernetes 会为每个文件设置一个默认权限。
mode
是文件权限的表示,来源于 Kubernetes 内部的权限分配逻辑:- 默认值:挂载时文件默认为
0644
,即十进制420
。 - 安全考虑:Kubernetes 限制权限,防止非必要的执行权限或过多的写权限。
- 默认值:挂载时文件默认为
验证与查看
如果您想验证 420
在实际挂载后的表现,可以通过以下步骤:
- 在容器中检查权限:
输出会显示:kubectl exec -it my-pod-with-configmap -- ls -l /etc/config
其中,-rw-r--r-- 1 root root 6 Dec 5 12:00 key
-rw-r--r--
对应八进制权限0644
,十进制为420
。
总结
kubectl get cm
中的mode
是文件权限的十进制表示。420
转为八进制是0644
,是文件权限的常见默认值。- 这种表示方法更贴近底层系统存储,但与 Linux 常用八进制表示有所不同。理解转换规则后,就可以轻松解读这些值。