假设我在 OpenStack 云中使用 v1.10.3 引导单个主节点,kubelet
并且我希望将 k8s 必需品的“自托管”单个 etcd 节点作为 pod。
在启动kube-apiserver
组件之前,您需要一个工作的 etcd 实例,但当然您不能只执行kubectl apply -f
清单或将清单放入addon-manager
文件夹,因为集群根本没有准备好。有一种方法可以通过 kubelet 启动 pod,而无需准备好 apiserver。它被称为静态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 驱动程序二进制文件必须安装在每个节点(在某些情况下是主节点)上的预定义卷插件路径中。
好的,我将这些二进制文件添加到我的节点(使用此 DS 作为参考),将卷添加到 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 支持,它至少应该从 k8s 1.5
--cloud-provider=openstack
开始工作,并且除了--cloud-config
kubelet 选项之外没有任何特殊要求。
用于声明静态 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(当集群实际上还没有准备好时)?关于我想念的云有什么想法吗?