假设我在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计算实例。
--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上(当群集实际上尚未就绪时)?我对错过的哪个云有任何错误的想法?
答案 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
如果节点丢失,则可以分离附加到该节点的卷 由控制器重新安装到其他位置。
不需要附加和分离的凭据 出现在每个节点上,从而提高了安全性。
在这种情况下,将此标志设置为false是合理的,因为这是实现所需目标的唯一方法。