在kubernetes中的山脉传播

时间:2018-03-27 05:37:24

标签: kubernetes daemon volume mount

我正在使用Kubernetes的Mount propagation功能来检查某种类型的挂载点的健康状况。我创建一个守护进程并运行一个脚本,在这些挂载点上执行一个简单的ls。我注意到没有从pod中列出新的挂载点。这是预期的行为。

volumeMounts:
            - mountPath: /host
              name: host-kubelet
              mountPropagation: HostToContainer
      volumes:
          - name: host-kubelet
            hostPath:
              path: /var/lib/kubelet

相关问题:hostPath containing mounts do not update as they change on the host #44713

1 个答案:

答案 0 :(得分:1)

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

  • HostToContainer - 单向传播,从主机到容器。如果你 在卷内安装任何东西,容器都会在那里看到它。
  • Bidirectional - 除了从主机到容器的传播, Container创建的所有卷安装都将传播回 主机,因此使用相同卷的所有Pod的所有容器都将 也看得出来。

基于documentation,群集传播功能处于群集v1.9的alpha状态,并将在v1.10上成为beta版

我已经在kubernetes v1.9.2上复制了您的案例,发现它完全忽略了MountPropagation配置参数。如果您尝试检查DaemonSetDeployment的当前状态,则会在列出的yaml配置中看到此选项丢失

$ kubectl get daemonset --export -o yaml

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

docker run -d -it -v /tmp/mnt:/tmp/mnt:rshared ubuntu

将Docker容器配置与卷装入部分中的kubernetes pod容器进行比较,您可能会发现kubernetes容器中缺少最后一个标志(shared / rshared)。

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

  

为了确保稳定性和生产质量,正常的Kubernetes发动机   群集仅启用beta或更高版本的功能。 Alpha功能   在普通群集上未启用,因为它们不是   生产就绪或可升级。

     

由于Kubernetes Engine自动升级Kubernetes控件   飞机,在生产中启用alpha功能可能会危及   如果新的数据发生重大变化,则集群的可靠性   版本

Alpha level features availability:致力于主要的kubernetes回购;出现在正式版中;默认情况下禁用功能,但可以通过标志启用(如果您能够设置标志)

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

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

MountFlags=shared

或者,如果存在,请移除MountFlags=slave。然后重启Docker守护程序:

 $ sudo systemctl daemon-reload
 $ sudo systemctl restart docker