Kubernetes 1.10中mountPropagation: Bidirectional不生效问题
问题排查与解决:K8s挂载传播未生效的原因
我来帮你梳理这个问题——你设置了mountPropagation: Bidirectional但容器里还是rprivate,核心是两个关键条件没满足,咱们一步步拆解:
1. 最直接的原因:容器没开特权模式
Kubernetes里,mountPropagation: Bidirectional的生效要求容器必须是特权模式。你直接用Docker启动时加了--privileged=true,但你的Deployment里完全没配置这个!非特权容器没有权限修改挂载传播属性,所以K8s就算收到了你的配置,也没法生效。
修复步骤:给容器加特权配置
修改你的Deployment YAML,在容器部分添加securityContext.privileged: true:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: test spec: selector: matchLabels: app: test strategy: type: RollingUpdate template: metadata: labels: app: test spec: containers: - image: gcr.io/google_containers/busybox:1.24 command: ["sleep", "36000"] name: test volumeMounts: - mountPath: /tmp/test mountPropagation: Bidirectional name: test-vol # 新增特权模式配置 securityContext: privileged: true volumes: - name: test-vol hostPath: path: /tmp/test
2. RKE节点的Docker默认挂载传播限制
就算开了特权模式,你还得确保集群节点的根文件系统挂载传播是shared模式——K8s的挂载传播是继承节点的挂载层级的,RKE默认部署的Docker可能没开这个,导致容器没法拿到shared属性。
先检查节点状态
在每个集群节点上跑这个命令,看根目录的传播模式:
findmnt -o TARGET,PROPAGATION /
如果输出里PROPAGATION是private或者rprivate,就得改Docker配置。
修改RKE的Docker配置
打开你的RKE cluster.yml,给Docker daemon加默认挂载传播参数:
services: docker: extra_args: - "--mount-propagation=shared"
然后重新执行rke up更新集群,等Docker重启后生效。
验证修复结果
重新部署修改后的Deployment,然后用这个命令检查挂载传播:
kubectl exec -it $(kubectl get pods -l app=test -o jsonpath='{.items[0].metadata.name}') -- findmnt -o TARGET,PROPAGATION /tmp/test
这时候应该能看到PROPAGATION显示为shared,和你直接用Docker启动的效果一致了。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

