【发布时间】:2018-12-10 03:16:47
【问题描述】:
假设我在 OpenStack 云中使用 kubelet v1.10.3 引导单个主节点,并且我希望将 k8s 必需品的“自托管”单个 etcd 节点作为 pod。
在启动kube-apiserver 组件之前,您需要一个工作的etcd 实例,但当然您不能只执行kubectl apply -f 或将清单放入addon-manager 文件夹,因为集群根本没有准备好。
有一种方法可以通过 kubelet 启动 pod,而无需准备好 apiserver。它被称为 static pod(yaml Pod 定义通常位于/etc/kubernetes/manifests/)。这也是我启动“系统”pod 的方式,比如 apiserver、调度程序、控制器管理器和 etcd 本身。以前我只是从节点挂载一个目录来保存 etcd 数据,但现在我想使用 OpenStack 块存储资源。问题来了:如何附加、挂载和使用 OpenStack cinder 卷来持久化静态 pod 中的 etcd 数据?
据我今天了解到,至少有 3 种附加 OpenStack 卷的方法:
-
CSI OpenStack cinder 驱动程序,这是一种管理卷的新方法。而且它不符合我的要求,因为在静态 Pod 清单中我只能声明 Pod 而不能声明 PVC/PV 等其他资源,而 CSI 文档说:
csi 卷类型不支持直接从 Pod 引用,只能通过 PersistentVolumeClaim 对象在 Pod 中引用。
-
before-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 in-tree 支持,它应该从 at least k8s 1.5 开始工作,并且除了
--cloud-provider=openstack和--cloud-configkubelet 选项之外没有任何特殊要求。
用于声明静态 pod 卷的 yaml 清单部分如下所示:
volumes:
- name: html-volume
cinder:
# Enter the volume ID below
volumeID: "$VOLUME_ID"
fsType: ext4
不幸的是,当我尝试这种方法时,我从 kubelet 收到以下错误:
卷尚未添加到卷的节点卷状态中的 VolumesInUse 列表中。
不知道是什么意思,但是听起来节点状态无法更新(当然,目前还没有etcd和apiserver)。可悲的是,这对我来说是最有希望的选择。
是否有任何其他方法可以将 OpenStack cinder 卷附加到仅依赖 kubelet 的静态 pod(当集群实际上还没有准备好时)?关于我错过了什么云的任何想法有上述错误吗?
【问题讨论】:
标签: kubernetes openstack kubelet