如何将 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 卷:
CSI OpenStack cinder 驱动程序,这是管理卷的全新方式。它不符合我的要求,因为在静态 pods 清单中我只能声明 Pods 而不能声明 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.
before-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 清单,如下所示:
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 in-tree 支持,它应该从 at least 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 收到以下错误:
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 是合理的,因为这是实现您想要的结果的唯一方法。
假设我在 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 卷:
CSI OpenStack cinder 驱动程序,这是管理卷的全新方式。它不符合我的要求,因为在静态 pods 清单中我只能声明 Pods 而不能声明 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.
before-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 清单,如下所示:
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 in-tree 支持,它应该从 at least 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 收到以下错误:
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
如果节点丢失,附加到它的卷可以分离 由控制器重新连接到别处。
不需要创建用于附加和分离的凭据 出现在每个节点上,提高安全性。
在您的情况下,将此标志设置为 false 是合理的,因为这是实现您想要的结果的唯一方法。