如何将 OpenStack 卷附加到 Kubernetes 静态 pod?

How to attach OpenStack volume to a Kubernetes staic pod?

假设我在 OpenStack 云中 bootstrap 一个带有 kubelet v1.10.3 的主节点,我想有一个 "self-hosted" 单个 etcd 节点作为 pod 作为 k8s 必需品。

在启动 kube-apiserver 组件之前,您需要一个可用的 etcd 实例,但当然您不能只执行 kubectl apply -f 或将清单放入 addon-manager 文件夹,因为集群尚未准备好根本。 有一种方法可以在没有现成的 apiserver 的情况下通过 kubelet 启动 pods。它被称为 static pods(yaml Pod 定义通常位于 /etc/kubernetes/manifests/)。这就是我启动 "system" pods 的方式,比如 apiserver、scheduler、controller-manager 和 etcd 本身。以前我只是从节点挂载一个目录来保存 etcd 数据,但现在我想使用 OpenStack 块存储资源。问题是:如何连接、挂载和使用 OpenStack cinder volume 来持久化来自静态 pod 的 etcd 数据?

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

好的,我将这些二进制文件添加到我的节点 (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] mount command failed, status: Failure, reason: Volume 2c21311b-7329-4cf4-8230-f3ce2f23cf1a is not available

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

用于为静态 pod 声明卷的 yaml 清单部分如下所示:

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

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

Volume has not been added to the list of VolumesInUse in the node's volume status for volume.

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

是否有任何其他方法可以将 OpenStack cinder 卷附加到仅依赖 kubelet 的静态 pod(当集群实际上还没有准备好时)?关于我错过了什么云有上述错误的任何想法?

消息Volume has not been added to the list of VolumesInUse in the node's volume status for volume. 表示该节点的attach/detach 操作仅委托给控制器管理器。 Kubelet 等待控制器建立附件,但卷未达到适当的状态,因为控制器尚未启动。 解决方法是设置kubelet flag --enable-controller-attach-detach=false 让kubelet attach、mount等。由于以下 reasons

此标志默认设置为 true
  • 如果节点丢失,附加到它的卷可以分离 由控制器重新连接到别处。

  • 不需要创建用于附加和分离的凭据 出现在每个节点上,提高安全性。

在您的情况下,将此标志设置为 false 是合理的,因为这是实现您想要的结果的唯一方法。