Skip to main content

Command Palette

Search for a command to run...

Csi 的内联暂存卷

Updated
2 min read

原文:CSI Ephemeral Inline Volumes

作者:Patrick Ohly

Kubernetes 利用外部存储驱动提供出来的存储卷一般来说都是持久化的,它的生命周期可以完全独立于 Pod,(特定情况下)也可以和第一个用到该卷的 Pod(后绑定模式)有着宽松的耦合关系。在 Kubernetes 中使用 PVC 和 PV 对象完成了存储卷的申请和供给机制。起初,容器存储接口(CSI)支持的存储卷只能用于 PVC/PV 的场合。

但有些情况下,数据卷的内容和生命周期是和 Pod 紧密相关的。例如有的驱动会使用动态的创建 Secret 生成卷,这个 Secret 是为了运行在 Pod 中的应用特意创建的。这种卷需要和 Pod 一起生成,并且作为 Pod 的一部分,和 Pod 一起终结。可以在 Pod Spec 中(用内联/inline 的方式)定义这种卷。

从 Kubernetes 1.15 开始,CSI 驱动也能用于这种内联暂存卷了。这个功能还处于 Alpha 阶段,因此在 1.15 中需要打开 CSIInlineVolume 特性开关 才能尝试使用这一新功能。而 1.16 中,该功能升级为 Beta 阶段,因此是缺省打开的。

虽说这个功能用到了两个现存的 gRPC 调用(NodePublishVolumeNodeUnpublishVolume),但是其中的用法和 CSI 规范并不一致:在暂存卷中,Kubelet 在向 CSI 驱动请求卷时,只调用了 NodePublishVolume。跳过了其他的(例如 CreateVolumeNodeStageVolume)调用,所以要对 CSI 驱动进行一些改变。Pod Spec 中写明了卷参数,这个参数会被拷贝给 NodePublishVolumeRequest.volume_context。目前没有标准化的参数,即使是容量这种参数也是定义在 CSI 驱动之中的。类似地,在 Pod 结束需要释放存储卷时,只调用了 NodeUnpublishVolume

起初有考虑分别为持久化和暂存卷编写不同的 CSI 驱动。但是有些驱动提供的存储在两种模式下都可以使用,例如 PMEM-CSI 管理的是由 Intel Optane 技术提供的持久化内存方式的本地存储。这种类型的存储既可以用作一种比普通 SSD 更快的持久化存储,也可以用作比 DRAM 更大容量的暂时性存储。

因此在 Kubernetes 1.16 中产生了变化:用户可以使用 CSIDrivervolumeLifecycleModes 字段来确定该驱动支持的卷类型。启用加载时 Pod 信息功能之后,驱动程序能够获取卷模式的信息,并在 NodePublishRequest.volume_context 加入 csi.storage.k8s.io/ephemeral

关于 CSI 驱动支持内联暂存卷的更多信息,可以浏览 Kubernetes CSI 文档 及其原始设计文档

后续内容中包含了真实的示例以及内容总结。

示例

PMEM-CSI

v0.6.0 中加入了内联暂存的支持。在使用 Intel Optane 技术的主机上可以使用这种驱动,GCE 的特定类型服务器或者 QEMU 的硬件模拟上都是可用的。QEMU 方式已经集成到了 Makefile,只需要 Go、Docker 和 KVM 即可,所以示例中用了这种方式:

git clone --branch release-0.6 https://github.com/intel/pmem-csi
cd pmem-csi
TEST_DISTRO=clear TEST_DISTRO_VERSION=32080 TEST_PMEM_REGISTRY=intel make start

启动四节点集群需要一些时间:

The test cluster is ready. Log in with /work/pmem-csi/_work/pmem-govm/ssh-pmem-govm, run kubectl once logged in.
Alternatively, KUBECONFIG=/work/pmem-csi/_work/pmem-govm/kube.config can also be used directly.

To try out the pmem-csi driver persistent volumes:
...

To try out the pmem-csi driver ephemeral volumes:
   cat deploy/kubernetes-1.17/pmem-app-ephemeral.yaml | /work/pmem-csi/_work/pmem-govm/ssh-pmem-govm kubectl create -f -

deploy/kubernetes-1.17/pmem-app-ephemeral.yaml 定义了一个卷:

kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app-inline-volume
spec:
  containers:
    - name: my-frontend
      image: busybox
      command: [ "sleep", "100000" ]
      volumeMounts:
      - mountPath: "/data"
        name: my-csi-volume
  volumes:
  - name: my-csi-volume
    csi:
      driver: pmem-csi.intel.com
      fsType: "xfs"
      volumeAttributes:
        size: "2Gi"
        nsmode: "fsdax"

Pod 启动之后,可以观察一下:

$ kubectl describe pods/my-csi-app-inline-volume
Name:         my-csi-app-inline-volume
...
Volumes:
  my-csi-volume:
    Type:              CSI (a Container Storage Interface (CSI) volume source)
    Driver:            pmem-csi.intel.com
    FSType:            xfs
    ReadOnly:          false
    VolumeAttributes:      nsmode=fsdax
                           size=2Gi
$ kubectl exec my-csi-app-inline-volume -- df -h /data
Filesystem                Size      Used Available Use% Mounted on
/dev/ndbus0region0fsdax/d7eb073f2ab1937b88531fce28e19aa385e93696
                          1.9G     34.2M      1.8G   2% /data

Image Populator

自动解包容器镜像,并以暂存卷的方式访问内容。这个驱动还在开发之中,但是可以用下面的方式安装试用镜像:

kubectl create -f https://github.com/kubernetes-csi/csi-driver-image-populator/raw/master/deploy/kubernetes-1.16/csi-image-csidriverinfo.yaml
kubectl create -f https://github.com/kubernetes-csi/csi-driver-image-populator/raw/master/deploy/kubernetes-1.16/csi-image-daemonset.yaml

下面这个 Pod 会运行一个 Nginx,并从 kfox1111/misc:test 镜像中获取数据提供服务:

$ kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.13-alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - name: data
      mountPath: /usr/share/nginx/html
  volumes:
  - name: data
    csi:
      driver: image.csi.k8s.io
      volumeAttributes:
          image: kfox1111/misc:test
EOF

测试一下读取数据:

$ kubectl exec nginx -- cat /usr/share/nginx/html/test
testing

cert-manager-csi

这个驱动和 cert-manager 协同工作,其目的是无缝地为 Pod 完成证书的请求和加载。这对于 mTLS 或者其它需要使用可信、有效证书的 Pod 间安全连接的工作是很有意义的。这个项目还在实验之中。

下一步

提出这个功能的原因之一就是,Kubernetes 把一个 Pod 调度到节点上时,对节点的存储情况是无知的。Pod 被调度之后,CSI 必须在该节点上创建卷。如果失败,Pod 无法启动,这个过程会一直持续到存储卷可用。存储能力跟踪的 KEP 是一个解决问题的尝试。

另外还有一个相关的 用于标准化容量参数的 KEP

相关链接

  • CSI Ephemeral Inline Volumes:https://kubernetes.io/blog/2020/01/21/csi-ephemeral-inline-volumes/
  • Patrick Ohly:https://github.com/pohly
  • 后绑定模式:https://kubernetes.io/docs/concepts/storage/storage-classes/#volume-binding-mode
  • CSIInlineVolume 特性开关:https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/
  • PMEM-CSI:https://github.com/intel/pmem-csi
  • CSIDriverhttps://kubernetes-csi.github.io/docs/csi-driver-object.html#what-fields-does-the-csidriver-object-have
  • 加载时 Pod 信息:https://kubernetes-csi.github.io/docs/pod-info.html
  • Kubernetes CSI 文档:https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html
  • 原始设计文档:https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20190122-csi-inline-volumes.md
  • v0.6.0:https://github.com/intel/pmem-csi/releases/tag/v0.6.0
  • GCE 的特定类型服务器:https://github.com/intel/pmem-csi/blob/v0.6.0/examples/gce.md
  • QEMU 方式已经集成到了 Makefile:https://github.com/intel/pmem-csi/tree/v0.6.0#qemu-and-kubernetes
  • cert-manager:https://github.com/jetstack/cert-manager
  • 存储能力跟踪的 KEP:https://github.com/kubernetes/enhancements/pull/1353
  • 用于标准化容量参数的 KEP:https://github.com/kubernetes/enhancements/pull/1409

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts