如何将OpenStack卷连接到Kubernetes staic pod?

时间:2018-07-01 20:52:58

标签: kubernetes openstack kubelet

假设我在OpenStack云中使用kubelet v1.10.3引导单个主节点,并且希望有一个“自托管”单个etcd节点作为Pod来满足k8的需要。

在启动kube-apiserver组件之前,您需要一个有效的etcd实例,但是您当然不能仅仅执行kubectl apply -f或将清单文件放入addon-manager文件夹中,因为群集根本没有准备好。 有一种方法可以通过kubelet来启动Pod,而无需准备好apiserver。它称为静态窗格(yaml Pod定义通常位于/etc/kubernetes/manifests/)。这就是我启动apiserver,schedule,controller-manager和etcd本身的“系统” pod的方式。以前,我只是从节点挂载目录来持久保存etcd数据,但现在我想使用OpenStack块存储资源。这里的问题是:如何附加,安装和使用OpenStack煤渣卷来持久存储来自静态Pod的etcd数据?

今天我了解到,至少有3种方式附加OpenStack卷:

  • CSI OpenStack cinder驱动程序,这是一种非常新的卷管理方式。而且它不符合我的要求,因为在静态Pod清单中,我只能声明Pod,而不能声明其他资源(如PVC / PV),而CSI文档说:

      

    csi卷类型不支持从Pod直接引用,只能通过PersistentVolumeClaim对象在Pod中引用。

  • 在csi之前附加卷的方式是: FlexVolume

      

    FlexVolume驱动程序二进制文件必须安装在每个节点(有时是主节点)上的预定义卷插件路径中。

好吧,我将这些二进制文件添加到了我的节点(using this DS as a reference),并向pod清单添加了卷,如下所示:

volumes:
- name: test
  flexVolume:
    driver: "cinder.io/cinder-flex-volume-driver"
    fsType: "ext4"
    options:
      volumeID: "$VOLUME_ID"
      cinderConfig: "/etc/kubernetes/cloud-config"

并从kubelet日志中获得以下错误:

  

driver-call.go:258]安装命令失败,状态:失败,原因:卷2c21311b-7329-4cf4-8230-f3ce2f23cf1a不可用

这很奇怪,因为我确定此Cinder卷已连接到我的CoreOS计算实例。

  • 我知道的最后一种装载卷的方法是cinder树内支持,该支持自at least k8s 1.5起就可以使用,除了--cloud-provider=openstack--cloud-config kubelet选项之外,没有任何特殊要求。

用于声明静态吊舱体积的yaml清单部分如下所示:

volumes:
  - name: html-volume
    cinder:
      # Enter the volume ID below
      volumeID: "$VOLUME_ID"
      fsType: ext4

不幸的是,当我尝试这种方法时,我从kubelet中收到以下错误:

  

尚未将卷添加到节点的卷的卷状态中的VolumesInUse列表中。

不知道这意味着什么,但听起来好像无法更新节点状态(当然,还没有etcd和apiserver)。遗憾的是,这对我来说是最有前途的选择。

还有其他方法可以将OpenStack cinder卷附加到仅依赖kubelet的静态pod上(当群集实际上尚未就绪时)?我对错过的哪个云有任何错误的想法?

1 个答案:

答案 0 :(得分:2)

消息Volume has not been added to the list of VolumesInUse in the node's volume status for volume.说,对该节点的附加/分离操作仅委托给控制器管理器。 Kubelet等待控制器建立附件,但由于控制器尚未启动,因此卷尚未达到适当的状态。 解决方案是设置kubelet标志--enable-controller-attach-detach=false,以使kubelet附着,安装等等。由于以下reasons

,此标志默认设置为true
  • 如果节点丢失,则可以分离附加到该节点的卷 由控制器重新安装到其他位置。

  • 不需要附加和分离的凭据 出现在每个节点上,从而提高了安全性。

在这种情况下,将此标志设置为false是合理的,因为这是实现所需目标的唯一方法。