
本文解析 kubernetes 中 cinder 存储插件的运行机制,说明其如何通过 openstack cinder api 实现持久卷的挂载与管理,并澄清动态供应(provisioner)在早期版本中的缺失现状及后续演进路径。
本文解析 kubernetes 中 cinder 存储插件的运行机制,说明其如何通过 openstack cinder api 实现持久卷的挂载与管理,并澄清动态供应(provisioner)在早期版本中的缺失现状及后续演进路径。
Kubernetes 的 Cinder 卷插件(pkg/volume/cinder/)是一个静态绑定型持久卷(PersistentVolume, PV)插件,用于在 OpenStack 环境中将 Cinder 块存储卷挂载到 Pod 中。它不实现动态供应(即不提供 kubernetes.io/cinder Provisioner),而是依赖管理员预先在 OpenStack 中创建好 Cinder 卷,并在 Kubernetes 中手动定义对应的 PV 对象。
工作流程概览
-
用户声明使用 Cinder 卷:通过
PersistentVolumeClaim(PVC)请求存储,该 PVC 与一个已存在的、类型为cinder的PersistentVolume绑定; -
Kubelet 调用插件:当 Pod 调度到某 Node 后,Kubelet 检测到容器需挂载 Cinder 卷,调用
cinder插件的MountDevice和SetUp方法; -
插件调用 Cinder REST API:插件内部使用 Go SDK(如
gophercloud)或直接构造 HTTP 请求,向 OpenStack Cinder 服务发送认证后的 API 调用,完成以下关键操作:- 查询卷状态(
GET /v3/{project_id}/volumes/{volume_id}); - 附加卷到目标计算节点(
POST /v3/{project_id}/volumes/{volume_id}/action,body:{"os-attach": {"instance_id": "..."}}); - 获取挂载设备路径(如
/dev/vdb),再执行mkfs(可选)和mount操作;
- 查询卷状态(
-
卸载时反向清理:Pod 删除时,插件调用
TearDown和UnmountDevice,并发送os-detach请求解除卷绑定。
关键代码逻辑示意(简化)
// 示例:cinder.go 中 Attach 操作核心片段(源自 v1.20 前源码)
func (plugin *cinderPlugin) NewAttacher() volume.Attacher {
return &cinderAttacher{
host: plugin.host,
}
}
func (a *cinderAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string, error) {
// 1. 解析 spec 获取 volumeID、availabilityZone 等
// 2. 初始化 OpenStack 连接(读取 cloud-config)
client, err := openstack.NewBlockStorageV3(a.cloud, gophercloud.EndpointOpts{})
if err != nil {
return "", err
}
// 3. 调用 Cinder API 附加卷
attachOpts := volumes.AttachOpts{
InstanceID: string(nodeName),
}
_, err = volumes.Attach(client, volumeID, attachOpts).Extract()
return volumeID, err
}
⚠️ 注意事项:
Kubernetes Skills下载针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 必须配置
--cloud-provider=openstack及有效cloud-config文件,否则插件无法获取 OpenStack 认证凭据与 Endpoint;- Cinder 插件不负责创建/删除卷,仅管理挂载/卸载生命周期;动态供应需依赖外部控制器(如
openstack-cloud-controller-manager+cinder-csi-driver);- 自 Kubernetes v1.11 起,官方推荐迁移到 CSI(Container Storage Interface)架构,即使用
cinder-csi-plugin替代树内(in-tree)插件,以获得更标准、可扩展、支持动态供应与快照的能力。
总结
Cinder 插件本质是 Kubernetes 与 OpenStack Cinder 之间的协议桥接器,其核心是安全、可靠地调用 Cinder REST API 完成卷的附加与文件系统挂载。尽管早期版本缺乏原生 Provisioner 支持,但通过云厂商集成与 CSI 生态的成熟,如今已在生产环境广泛支持全自动卷供给、加密、QoS 与多可用区部署。对于新项目,强烈建议直接采用 cinder-csi-driver 并启用 StorageClass 动态供应能力。











