在 kubernetes 中挂载传播

amb*_*air 2 mount daemon volume kubernetes

我正在使用Kubernetes 的挂载传播功能来检查某种类型的挂载点的健康状况。我创建了一个 daemonset 并运行一个脚本,该脚本可以ls在这些挂载点上做一个简单的操作。我注意到新的挂载点没有从 pod 中列出。这是预期的行为吗?

volumeMounts:
            - mountPath: /host
              name: host-kubelet
              mountPropagation: HostToContainer
      volumes:
          - name: host-kubelet
            hostPath:
              path: /var/lib/kubelet
Run Code Online (Sandbox Code Playgroud)

相关问题:包含挂载的 hostPath 在主机上更改时不会更新 #44713

VAS*_*VAS 5

简而言之,Mount 传播允许将 Container 挂载的卷共享到同一 Pod 中的其他 Container,甚至是同一节点上的其他 Pod。
卷的安装传播由 中的mountPropagation字段控制Container.volumeMounts。它的值是:

  • HostToContainer- 从主机到容器的一种传播方式。如果您在卷内挂载任何内容,Container 将在那里看到它。
  • Bidirectional - 除了从主机到容器的传播之外,容器创建的所有卷挂载都将传播回主机,因此使用相同卷的所有 Pod 的所有容器也会看到它。

基于文档,Mount 传播功能对于集群 v1.9 处于 alpha 状态,并将在 v1.10 上进行测试

我在 kubernetes v1.9.2 上复制了你的案例,发现它完全忽略了MountPropagation配置参数。如果您尝试检查DaemonSetor 的当前状态Deployment,您将看到列出的 yaml 配置中缺少此选项

$ kubectl get daemonset --export -o yaml
Run Code Online (Sandbox Code Playgroud)

如果您尝试仅使用挂载传播选项运行 docker 容器,您可能会看到它按预期工作:

docker run -d -it -v /tmp/mnt:/tmp/mnt:rshared ubuntu
Run Code Online (Sandbox Code Playgroud)

在卷挂载部分将 docker 容器配置与 kubernetes pod 容器进行比较,您可能会看到最后一个标志(shared/rsharedkubernetes 容器中缺少 )。

这就是为什么它发生在Google kubernetes 集群中并且可能发生在由其他提供商管理的集群中的原因:

为确保稳定性和生产质量,普通 Kubernetes Engine 集群仅启用测试版或更高版本的功能。Alpha 功能未在普通集群上启用,因为它们不可用于生产或升级。

由于 Kubernetes Engine 会自动升级 Kubernetes 控制平面,如果新版本发生重大更改,在生产中启用 alpha 功能可能会危及集群的可靠性。

Alpha 级功能可用性:致力于主要 kubernetes 存储库;出现在正式版本中;默认情况下禁用功能,但可以通过标志启用(如果您能够设置标志)

在挂载传播可以在某些部署(CoreOS、RedHat/Centos、Ubuntu)上正常工作之前,必须在 Docker 中正确配置挂载共享,如下所示。

编辑 Docker 的systemd服务文件。设置MountFlags如下:

MountFlags=shared
Run Code Online (Sandbox Code Playgroud)

或者,删除(MountFlags=slave如果存在)。然后重启 Docker 守护进程:

 $ sudo systemctl daemon-reload
 $ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)