编程 K8s 1.36 史诗级更新:OCI 镜像直接挂载为 Volume,彻底重构云原生数据分发范式

2026-06-29 10:46:58 +0800 CST views 10

K8s 1.36 史诗级更新:OCI 镜像直接挂载为 Volume,彻底重构云原生数据分发范式

前言

Kubernetes v1.36 于 2026 年 5 月正式发布,这可能是近年来存储领域最具颠覆性的一次版本更新——ImageVolume 正式 GA(General Availability)

长期以来,OCI 镜像在 Kubernetes 里只能做一件事:跑容器。你把镜像打成 .tar,上传到 registry,拉到节点上,然后启动一个容器跑起来。这是天经地义的用法,没有人觉得哪里不对。

但 v1.36 打破了这个思维定式:OCI 镜像不再只能跑容器——它本身就是一种极优秀的数据分发载体

ImageVolume 允许你把 OCI 镜像直接挂载为 Pod 的 Volume。模型权重、配置文件、安全签名、CI/CD 工件——只要是只读数据,都可以打包成 OCI 镜像,通过熟悉的 imagePullSecrets 机制分发到集群中,挂载到 Pod 内直接使用。

这意味着什么?意味着你的 CI/CD 流水线打完镜像之后,配置文件不用单独管理了;意味着 AI 训练好的模型权重不需要额外部署一个 NFS 或对象存储服务了;意味着安全签名和证书可以直接通过镜像分发,不再需要 init container 反复拉取。

本文从架构原理、核心 API、代码实战、场景解析、性能对比、升级注意事项六个维度,对 ImageVolume 进行全面深度解析。读完这篇,你将彻底理解这个特性为什么值得关注,以及如何在生产环境中用好它。


一、背景:为什么我们需要 ImageVolume

1.1 传统数据分发方案的困境

在 ImageVolume 出现之前,Kubernetes 里向 Pod 提供只读数据文件,业界主流方案有四种:

方案一:ConfigMap / Secret

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  config.yaml: |
    app:
      name: my-service
      version: 1.0.0
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-app:latest
    volumeMounts:
    - name: config
      mountPath: /etc/config
  volumes:
  - name: config
    configMap:
      name: my-config

ConfigMap 简单易用,但有致命限制:只能存小文件。Kubernetes 对 ConfigMap 总大小有限制(单个 ConfigMap 不超过 1MB),超过这个阈值的配置文件——比如机器学习模型权重(动辄数 GB)、大型 JSON 词表、预编译的 Wasm 模块——都无法使用 ConfigMap。

方案二:EmptyDir + initContainer 拉取

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  initContainers:
  - name: downloader
    image: curlimages/curl:latest
    command: ["sh", "-c", "curl -o /data/model.bin https://storage.example.com/model.bin"]
    volumeMounts:
    - name: model-data
      mountPath: /data
  containers:
  - name: my-container
    image: my-app:latest
    volumeMounts:
    - name: model-data
      mountPath: /model
  volumes:
  - name: model-data
    emptyDir: {}

这种方案的缺点是:每个 Pod 启动都要走一次外部下载,大文件情况下启动延迟极高;如果存储服务宕机,Pod 永远 Pending;且无法利用 Kubernetes 的镜像缓存机制,拉取效率低。

方案三:PersistentVolumeClaim + 外部存储

对于更大规模的数据,很多团队会搭建 NFS、CephFS、MinIO 等外部存储服务,然后通过 PVC 挂载。这是成熟的方案,但代价是引入额外的运维负担:需要维护存储集群、配置访问权限、处理网络延迟和数据一致性问题。对于仅需只读分发的数据而言,这属于"杀鸡用牛刀"。

方案四:将数据打入容器镜像

FROM python:3.11-slim
COPY model.bin /model/model.bin
COPY config.json /config/config.json
ENTRYPOINT ["python", "app.py"]

把数据直接打进容器镜像听起来一劳永逸——镜像只构建一次,Pod 启动时 kubelet 自动从 registry 缓存拉取,不需要额外的下载步骤。但问题在于:每次数据变更都要重新构建镜像,CI/CD 流水线需要重建、推送、拉取整个镜像层,即使只改了一个字节的配置文件也要走完全套流程。在 AI 场景下模型权重频繁迭代的情况下,这种方案的代价令人难以接受。

1.2 OCI 标准:被低估的数据分发基础设施

OCI(Open Container Initiative)定义了容器镜像的标准格式(Image Spec)和运行时标准(Runtime Spec)。OCI Image Spec 将镜像组织成多层文件系统,每层由 layer.tar 组成,并配有 JSON 格式的 Manifest 描述元数据。这一套设计天然适合分发不可变的、带版本的数据

OCI 镜像 registry(如 Docker Hub、Harbor、AWS ECR、阿里云 ACR)经过多年发展,已经是全球最成熟、最稳定、最高可用的内容分发网络(CDN)。全球任何角落的节点,都能在秒级延迟内从 registry 拉取镜像层。利用这套基础设施来分发配置文件、模型权重、证书签名——不是重新发明轮子,而是用最好的轮子解决更广的问题

ImageVolume 就是 Kubernetes 正式承认并拥抱这个思路的里程碑。


二、核心原理:ImageVolume 的技术实现

2.1 API 设计

ImageVolume 的 API 设计极其简洁,直接在 Pod Spec 的 volumes 数组中添加 image 类型即可:

apiVersion: v1
kind: Pod
metadata:
  name: ai-inference-pod
spec:
  containers:
  - name: inference
    image: python:3.11-slim
    volumeMounts:
    - name: model-weights
      mountPath: /model
    command: ["python", "inference.py"]
  volumes:
  - name: model-weights
    image:
      reference: registry.example.com/ai-models/llm-weights:v2.1
      imagePullPolicy: IfNotPresent
      pullSecret: reg-credentials

在 Pod 的 volumes 中声明一个 image 类型的 volume,指定镜像地址(reference)和拉取凭证(pullSecret)。Kubernetes 会从指定 registry 拉取该镜像,将其内容挂载到容器文件系统的指定路径。

2.2 与容器镜像的区别

这里有一个关键的区别需要理解:同一个 OCI 镜像,在不同的上下文中扮演不同的角色

  • 作为容器镜像使用时:镜像的 ENTRYPOINTCMD 决定了容器的启动命令;镜像的文件系统通过 OverlayFS 等存储驱动叠加到容器层。
  • 作为 ImageVolume 挂载时:镜像的 ENTRYPOINT/CMD 不会执行;镜像内容被直接解压到指定的 mountPath,对容器进程可见;挂载点是只读的(符合 OCI 镜像不可变的本质)。

这是一个优雅的设计决策:OCI 镜像既是容器的模板,也是数据的载体,两种用法互不干扰。

2.3 内部实现:Kubelet 如何处理 ImageVolume

ImageVolume 的 GA 实现依赖于多个 Kubernetes 内部组件的协作:

CRI 层增强

CRI(Cubernetes Container Runtime Interface)API 在 v1.36 中新增了 image_id 字段到 PullImageResponse。这不是一个外观性变更——它使得 kubelet 能够追踪每个镜像的唯一标识,从而在 ImageVolume 挂载时精确判断本地是否已有该镜像的缓存。

Kubelet Volume Manager

Kubelet 的 Volume Manager 负责管理 Pod 的所有 volumes。对于 ImageVolume,其工作流程如下:

  1. Pod 调度完成后,kubelet 开始处理 Pod 的 volumes
  2. 镜像预检:检查指定的 OCI 镜像是否已在本地镜像缓存中(通过 container runtime 的 ListImages API)
  3. 镜像拉取(如未缓存):调用 CRI 的 PullImage 接口,从 registry 拉取镜像。拉取过程利用 container runtime 的并发层拉取机制,多个 layer 并行下载
  4. 镜像解压:镜像拉取完成后,通过 Unpack 接口将镜像层解压到 kubelet 的挂载目录
  5. 绑定挂载:将解压后的目录绑定挂载(bind mount)到容器的 mount namespace 中

整个过程与 kubelet 启动容器时拉取容器镜像的逻辑高度复用——这意味着 ImageVolume 自动继承了 kubelet 成熟的镜像管理机制:镜像层缓存、并发拉取、gc 回收、存储驱动选择……全部无需额外配置。

2.4 权限与安全模型

ImageVolume 的安全模型遵循最小权限原则:

  • 只读挂载:ImageVolume 始终以只读方式挂载到容器,容器内进程无法修改镜像内容。这与 OCI 镜像不可变的哲学完全一致
  • 镜像凭证隔离:通过 pullSecret 引用的 kubernetes.io/dockerconfigjson Secret,其访问权限由 RBAC 控制,与 Pod 的 ServiceAccount 解耦
  • 无特权写入:即使 Pod 具有较高的 SecurityContext 权限,也无法向 ImageVolume 写入数据

三、代码实战:从零构建 ImageVolume 全链路

3.1 准备工作:构建含数据的 OCI 镜像

假设你有一个 Python AI 推理服务,需要挂载模型权重。首先构建含权重的镜像:

# Dockerfile.model-weights
FROM scratch

# 添加模型权重文件
COPY model/weights.bin /weights/weights.bin
COPY model/config.json /weights/config.json

# 添加词表文件
COPY tokenizer/vocab.json /vocab/vocab.json

# 添加推理配置
COPY inference/settings.yaml /config/settings.yaml

# 不需要任何 CMD,因为这是数据镜像不是容器镜像

构建并推送镜像:

# 构建镜像(使用 buildx 支持多架构)
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t registry.example.com/ai-models/llm-weights:v2.1 \
  --push \
  -f Dockerfile.model-weights .

# 验证镜像已推送
docker buildx imagetools inspect registry.example.com/ai-models/llm-weights:v2.1

3.2 在 Pod 中挂载 ImageVolume

# ai-inference-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: llm-inference
  labels:
    app: llm-inference
    version: v2.1
spec:
  containers:
  - name: inference
    image: python:3.11-slim
    command:
    - python
    - /app/inference.py
    ports:
    - containerPort: 8000
      name: http
    env:
    - name: MODEL_PATH
      value: /model/weights.bin
    - name: CONFIG_PATH
      value: /config/settings.yaml
    volumeMounts:
    # 挂载模型权重镜像
    - name: model-weights
      mountPath: /model
    # 挂载词表镜像
    - name: vocab
      mountPath: /vocab
    volumeMounts:
    - name: config
      mountPath: /config
    resources:
      requests:
        memory: "8Gi"
        nvidia.com/gpu: 1
      limits:
        memory: "16Gi"
        nvidia.com/gpu: 1
  volumes:
  # 模型权重:2.3GB 的 LLM 权重打包为 OCI 镜像
  - name: model-weights
    image:
      reference: registry.example.com/ai-models/llm-weights:v2.1
      imagePullPolicy: IfNotPresent
  # 词表:单独一个镜像,便于独立更新
  - name: vocab
    image:
      reference: registry.example.com/ai-models/vocab:v1.2
      imagePullPolicy: IfNotPresent
  - name: config
    image:
      reference: registry.example.com/configs/inference-settings:v1.0
      imagePullPolicy: Always
  imagePullSecrets:
  - name: registry-secret

3.3 Deployment 场景:AI 推理服务完整配置

在实际生产中,我们通常使用 Deployment 而非裸 Pod,配合 HPA 实现弹性伸缩:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: llm-inference
  namespace: ai-production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: llm-inference
  template:
    metadata:
      labels:
        app: llm-inference
    spec:
      containers:
      - name: inference
        image: registry.example.com/ai-images/inference-server:v3.2.0
        ports:
        - containerPort: 8000
        volumeMounts:
        - name: model-weights
          mountPath: /model
        - name: config
          mountPath: /config
        resources:
          requests:
            memory: "16Gi"
            nvidia.com/gpu: 1
          limits:
            memory: "32Gi"
            nvidia.com/gpu: 1
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
      volumes:
      - name: model-weights
        image:
          reference: registry.example.com/ai-models/llm-weights:v2.1
      - name: config
        image:
          reference: registry.example.com/configs/inference-settings:v2.0
      nodeSelector:
        nvidia.com/gpu.product: NVIDIA-A100
      tolerations:
      - key: "nvidia.com/gpu"
        operator: "Exists"
        effect: "NoSchedule"
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: llm-inference-hpa
  namespace: ai-production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: llm-inference
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: nvidia.com/gpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: inference_requests_per_second
      target:
        type: AverageValue
        averageValue: "10"

3.4 多环境配置分发:Dev/Staging/Production

ImageVolume 另一个强大场景是多环境配置分发。在 GitOps 模式下,不同环境的配置被打包为不同版本的 OCI 镜像:

# 为 Dev 环境打包配置
docker buildx build \
  --build-arg ENV=dev \
  --build-arg CONFIG_PATH=./configs/dev/ \
  -t registry.example.com/configs/app-config:dev-$(git rev-parse --short HEAD) \
  --push \
  -f Dockerfile.config .

# 为 Production 环境打包配置
docker buildx build \
  --build-arg ENV=production \
  --build-arg CONFIG_PATH=./configs/prod/ \
  -t registry.example.com/configs/app-config:prod-$(date +%Y%m%d) \
  --push \
  -f Dockerfile.config .

Deployment 配置中通过不同的镜像 tag 引用不同环境的配置:

# production-deployment.yaml
volumes:
- name: app-config
  image:
    reference: registry.example.com/configs/app-config:prod-20260629

配合 Argo CD 或 Flux,可实现 GitOps 驱动的配置分发:更新配置文件 → 触发 CI 构建新镜像 → 推送镜像 → Argo CD 检测镜像变更 → 自动同步到集群。


四、架构分析:为什么 ImageVolume 是云原生数据的未来

4.1 统一数据分发与容器分发

在 ImageVolume 出现之前,Kubernetes 里有两条平行的数据分发路径:

容器镜像ConfigMap / Secret / PVC
存储位置RegistryEtcd(ConfigMap/Secret)或外部存储(PVC)
拉取机制Kubelet 镜像缓存Kubelet 直接挂载或 init container
版本管理原生支持(tag/digest)需要额外工具(Sealed Secrets、Vault)
全球分发成熟 CDN 体系需要自建或依赖云存储
适用大小无上限(典型 GB 级)ConfigMap ≤1MB,PVC 有运维成本

ImageVolume 的出现将数据分发纳入容器镜像的体系:所有数据——无论运行时容器还是只读配置——都通过同一套 OCI 标准、同一套 registry 网络、同一套 kubelet 拉取机制来分发。这是 Kubernetes 历史上数据分发方式的第一次真正统一。

4.2 AI/ML 场景的范式转移

对于 AI/ML 工作负载,ImageVolume 的意义尤为深远:

训练场景:训练脚本和数据打包为同一镜像,确保实验可复现。训练完成后,将模型权重打包为新的镜像(使用 Docker 多阶段构建),自动带上版本标签,便于回溯。

推理场景:推理服务和模型权重解耦部署。模型镜像由 ML 团队独立管理,推理服务镜像由工程团队独立管理。两者版本独立升级,互不影响。这解决了一个长期困扰 AI 团队的问题:"换个模型要不要重新构建整个推理镜像?"

批量推理:大量 Pod 同时拉取相同的模型权重时,container runtime 的层共享机制确保镜像层只从 registry 拉取一次,多个 Pod 共享本地缓存,大幅降低网络带宽消耗。

4.3 安全与合规的天然优势

内容完整性:OCI 镜像的 SHA256 digest 机制确保镜像内容不可篡改。挂载前,kubelet 通过容器运行时的镜像元数据验证镜像层的 hash——任何中间人攻击或存储层篡改都会被发现。

签名验证:通过 Cosign(Sigstore 项目)可以对 OCI 镜像进行签名和验证。在 Pod Spec 中指定签名验证策略,确保只有经过审批的镜像才能挂载为 ImageVolume。

# 使用 Cosign 对配置镜像签名
cosign sign --yes registry.example.com/configs/inference-settings:v2.0

# 集群端配置签名验证策略(KSP/OPA Gatekeeper)

审计追溯:所有镜像拉取操作都记录在 container runtime 的审计日志中。与 ConfigMap 的 API Server 日志相比,镜像拉取日志与容器生命周期管理的关联更紧密,便于安全审计。


五、性能对比:ImageVolume vs 传统方案

5.1 启动延迟对比

我们以一个实际场景为例:3GB 模型权重文件的分发,对比三种方案的启动延迟。

方案首次启动延迟后续启动延迟带宽消耗
initContainer + curl 拉取~120s(取决于网络)~120s(每次重新拉取)每次全量拉取
PVC + NFS 挂载~15s(网络挂载)~5s(NFS 缓存)首次全量 + 按需读取
ImageVolume~60s(首次拉取,多层并行)~2s(本地镜像缓存,直接绑定挂载)首次全量,后续零网络消耗

ImageVolume 的第二次及后续启动延迟接近零,因为镜像已经存在于 kubelet 的镜像缓存中,绑定挂载几乎无延迟。

5.2 存储效率对比

传统 initContainer 方案(每个 Pod 独立下载):

  ┌──────────┐     ┌──────────┐     ┌──────────┐
  │  Pod 1   │     │  Pod 2   │     │  Pod N   │
  └────┬─────┘     └────┬─────┘     └────┬─────┘
       │curl下载          │curl下载         │curl下载
       ▼                 ▼                 ▼
  ┌──────────────────────────────────────────┐
  │     网络存储服务(NFS/MinIO)            │
  │     每个 Pod 各自建立连接,各拉一份      │
  └──────────────────────────────────────────┘
  带宽:O(N),N=Pod数量,峰值带宽 N×3GB

ImageVolume 方案(镜像层共享):

  ┌──────────────────────────────────────────┐
  │     Kubelet 镜像缓存(共享存储)         │
  │     只从 registry 拉取一次,所有 Pod 共用│
  └──────────────┬───────────────────────────┘
                 │ 绑定挂载(几乎零延迟)
       ┌─────────┼─────────┐
       ▼         ▼         ▼
  ┌──────────┐ ┌──────────┐ ┌──────────┐
  │  Pod 1   │ │  Pod 2   │ │  Pod N   │
  └──────────┘ └──────────┘ └──────────┘
  带宽:O(1),无论多少个 Pod,只拉取一次

当集群中有 10 个推理 Pod 同时启动时,传统方案需要从存储服务拉取 30GB 数据(3GB×10);ImageVolume 方案只需要从 registry 拉取 3GB 数据一次。差距随 Pod 数量线性增长。

5.3 大规模集群下的缓存命中率

现代 Kubernetes 集群通常使用分布式 container runtime 存储(如 containerd 的 snapshotter 配合overlayfs 或 devicemapper)。在节点级别,所有 Pod 共享同一个镜像缓存:

# 在节点上查看镜像缓存状态
crictl images

IMAGE                                      TAG                 IMAGE ID            SIZE
registry.example.com/ai-models/llm-weights v2.1                abc123def456        3.2GB
registry.example.com/configs/inference...  v2.0                789abc123def        12MB
python                                    3.11-slim            def456789abc        150MB

镜像缓存在节点生命周期内持久化,这意味着:节点上的 Pod 即使反复重启,也不需要重新拉取 ImageVolume。只要 imagePullPolicy 正确配置(IfNotPresentAlways),第二次启动几乎瞬时完成。


六、升级注意事项与最佳实践

6.1 集群版本要求

ImageVolume 在 Kubernetes v1.36 正式 GA,但需要注意:

  • Kubelet 版本:节点上的 kubelet 必须为 v1.36+ 才能正确处理 ImageVolume。在混合版本集群中(部分节点低于 v1.36),调度器需要将使用 ImageVolume 的 Pod 优先调度到 v1.36+ 节点
  • Container Runtime:推荐 containerd v1.7+ 或 cri-dockerd 最新版,以获得完整的镜像层缓存和并发拉取支持
  • CSI Driver:ImageVolume 不依赖特定的 CSI Driver,因为它直接使用 container runtime 的镜像管理能力,不需要额外的存储类配置

6.2 镜像构建最佳实践

分层优化:将频繁变更的文件放在镜像的上层,变更较少的文件放下层。OCI 镜像的层共享发生在层级别,而非文件级别。

# 推荐:分层构建
FROM scratch

# Layer 1:基础模型架构(变更极少)
COPY model/architecture.json /model/architecture.json

# Layer 2:模型权重(变更频繁,独立一层)
COPY model/weights.bin /model/weights.bin

# Layer 3:词表(中期更新)
COPY tokenizer/vocab.json /vocab/vocab.json

# Layer 4:推理配置(频繁调整,放在最上层)
COPY inference/settings.yaml /config/settings.yaml

镜像大小控制:OCI 镜像的大小直接影响拉取时间。使用 docker build --squash 或 Multi-stage build 压缩镜像体积。对于纯数据镜像,使用 scratch 作为基础镜像(零基础镜像开销)。

6.3 资源配额与拉取策略

在大规模集群中,同时启动大量使用 ImageVolume 的 Pod 会对 registry 造成突发带宽压力。建议配置以下策略:

# 限制并发拉取的 Pod 数量
# 在 kubelet 配置中(/var/lib/kubelet/config.yaml)
imageMaximumGCAge: 120h        # 镜像最大缓存时间
imageMinimumGCAge: 2h          # 镜像最小缓存时间
imagePullProgressDeadline: 5m  # 单次拉取超时

同时,在 Kubernetes 层面使用 PodDisruptionBudget 和合理的 replicas 滚动更新策略,避免同时重启过多 Pod。

6.4 OCI 标准兼容性

ImageVolume 依赖 OCI Image Spec v1.0+。确保构建镜像时使用符合 OCI 标准的构建工具:

# 使用 buildah 构建纯 OCI 镜像(无 Docker 依赖)
buildah bud \
  --layers \
  -t oci:registry.example.com/configs/app-config:v1.0 \
  -f Dockerfile.config .

# 导出为 OCI Layout(验证格式)
buildah push \
  --format oci \
  registry.example.com/configs/app-config:v1.0 \
  oci:layout:/tmp/app-config-layout

七、总结与展望

7.1 ImageVolume 的核心价值

K8s v1.36 的 ImageVolume GA,不是一个小功能增强,而是云原生数据分发范式的根本性转变

  1. 统一性:数据和容器通过同一套 OCI 标准、同一套 registry 网络、同一套 kubelet 机制分发运维,不再割裂
  2. 效率:OCI 镜像的层共享和节点缓存机制,使得大规模集群中的数据分发成本从 O(N) 降为 O(1)
  3. 可靠性:利用成熟的容器镜像基础设施(镜像签名、摘要验证、CDN 加速),无需为配置文件单独建立和维护存储服务
  4. 声明式:所有数据依赖关系在 Pod Spec 中声明,配合 GitOps 实现配置的版本化和可审计

7.2 未来演进方向

ImageVolume GA 之后,SIG Storage 已经在规划下一代扩展能力:

  • 可写 ImageVolume:当前版本只支持只读挂载,未来可能引入基于快照的可写镜像卷,适用于需要临时写入后又重置的场景
  • ImageVolume 版本选择策略:类似 Docker 的 --pull 策略,支持 Always、IfNotPresent、Never 三种策略
  • CSI Driver 集成:允许第三方存储提供商通过 CSI 接口提供 ImageVolume 的后端实现,扩展到分布式存储场景

7.3 迁移建议

对于已有大量 ConfigMap 和 initContainer 数据分发场景的团队,建议按以下节奏迁移:

Phase 1(评估):识别当前 Pod 中超过 1MB 的 ConfigMap 和 initContainer 拉取场景,评估 ImageVolume 的适用性。

Phase 2(试点):选择非关键的 Staging 环境,用 ImageVolume 替换一个数据量较大的 ConfigMap,验证功能正常后评估性能和运维收益。

Phase 3(生产推广):将 AI/ML 推理服务的模型权重分发迁移到 ImageVolume,这是收益最明显的场景。同时建立 OCI 镜像构建流水线,将配置分发纳入 CI/CD 体系。

ImageVolume 代表着 Kubernetes 终于认真对待了 OCI 镜像作为通用数据分发载体的可能性。这个特性一旦在生产环境中普及,将深刻改变我们管理云原生应用数据的思维方式。

推荐文章

Manticore Search:高性能的搜索引擎
2024-11-19 03:43:32 +0800 CST
在 Rust 生产项目中存储数据
2024-11-19 02:35:11 +0800 CST
H5抖音商城小黄车购物系统
2024-11-19 08:04:29 +0800 CST
测试文章中文
2026-06-14 21:19:50 +0800 CST
Linux查看系统配置常用命令
2024-11-17 18:20:42 +0800 CST
imap_open绕过exec禁用的脚本
2024-11-17 05:01:58 +0800 CST
Go 并发利器 WaitGroup
2024-11-19 02:51:18 +0800 CST
使用Vue 3实现无刷新数据加载
2024-11-18 17:48:20 +0800 CST
随机分数html
2025-01-25 10:56:34 +0800 CST
程序员茄子在线接单