kubernetes - 如何将 OpenStack 卷附加到 Kubernetes 静态 Pod?

标签 kubernetes openstack kubelet

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

在启动 kube-apiserver 组件之前,您需要一个工作的 etcd 实例,但当然您不能只执行 kubectl apply -f 或将 list 放入 addon-manager 文件夹,因为集群根本没有准备好。 有一种方法可以在没有现成的 apiserver 的情况下通过 kubelet 启动 pod。它称为静态 Pod(yaml Pod 定义通常位于/etc/kubernetes/manifests/)。这就是我启动“系统”pod(例如 apiserver、调度程序、 Controller 管理器和 etcd 本身)的方式。以前我只是从节点挂载了一个目录来保存 etcd 数据,但现在我想使用 OpenStack block 存储资源。这里的问题是:如何附加、挂载和使用 OpenStack cinder 卷来保存静态 pod 中的 etcd 数据?

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

  • CSI OpenStack cinder 驱动程序,这是管理卷的全新方式。它不符合我的要求,因为在静态 Pod list 中,我只能声明 Pod,而不能声明 PVC/PV 等其他资源,而 CSI 文档说:

    The csi volume type does not support direct reference from Pod and may only be referenced in a Pod via a PersistentVolumeClaim object.

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

    FlexVolume driver binaries must be installed in a pre-defined volume plugin path on each node (and in some cases master).

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

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 计算实例。

  • 我知道的最后一种挂载卷的方法是 cinder 树内支持,它应该从 at least k8s 1.5 开始工作。除了 --cloud-provider=openstack--cloud-config kubelet 选项之外,没有任何特殊要求。

用于声明静态 Pod 卷的 yaml list 部分如下所示:

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(当集群实际上尚未准备好时)?关于我错过了上述错误的云的任何想法吗?

最佳答案

消息卷尚未添加到卷的节点卷状态中的 VolumesInUse 列表中。 表示该节点的附加/分离操作仅委托(delegate)给 Controller 管理器。 Kubelet 等待 Controller 建立附件,但卷未达到适当的状态,因为 Controller 尚未启动。 解决方案是设置 kubelet 标志 --enable-controller-attach-detach=false 让 kubelet 附加、挂载等。由于以下原因,此标志默认设置为 true reasons

  • 如果节点丢失,则可以分离附加到该节点的卷 由 Controller 重新连接到其他地方。

  • 不需要制作附加和分离的凭据 存在于每个节点上,提高安全性。

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

关于kubernetes - 如何将 OpenStack 卷附加到 Kubernetes 静态 Pod?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126941/

相关文章:

python - OpenStackSDK在特定项目下创建实例

elasticsearch - 如何安装stackdriver elasticsearch插件来监视在GKE上的k8s v1.11中运行的ES实例?

java - 如何获取 Kubernetes 中 POD 中的特定应用程序(在多个正在运行的应用程序中)提供的特定请求?

kubernetes - 从 kubernetes pod 中获取环境变量并将其存储在数组中

kubernetes - Kubelet 停止发布节点状态 (Kubernetes)

docker - kubernetes 1.12.2 加载 Kubelet 配置文件/var/lib/kubelet/config.yaml 失败

kubernetes - 如何保护 Google Kubernetes Engine (GKE) 中的只读端口 10255?

amazon-web-services - 如何将Kubernetes与现有的AWS ALB集成?

python - openstack 无法从 API 检索身份验证 token

python - NoneType' 对象没有属性 '__getitem__'