华为云上的K8S怎么使用对象存储配置pod文件持久化。

1.通过kubectl命令行使用已有对象存储

使用kubectl连接集群。

1.1创建PV。

创建pv-obs.yaml文件。

复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: everest-csi-provisioner
    everest.io/reclaim-policy: retain-volume-only      # 可选字段,删除PV,保留底层存储卷
  name: pv-obs       # PV的名称
spec:
  accessModes:
  - ReadWriteMany    # 访问模式,对象存储必须为ReadWriteMany
  capacity:
    storage: 1Gi     # 存储容量大小,此处仅为校验需要(不能为空和0),设置的大小不起作用
  csi:
    driver: obs.csi.everest.io        # 挂载依赖的存储驱动
    fsType: obsfs                     # 实例类型
    volumeHandle: <your_volume_id>    # 对象存储的名称
    volumeAttributes:
      storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner
      everest.io/obs-volume-type: STANDARD
      everest.io/region: <your_region>                        # 对象存储的区域
      everest.io/enterprise-project-id: <your_project_id>     # 可选字段,企业项目ID,如果指定企业项目,则创建PVC时也需要指定相同的企业项目,否则PVC无法绑定PV。
    nodePublishSecretRef:            # 设置对象存储的自定义密钥
      name: <your_secret_name>       # 自定义密钥的名称
      namespace: <your_namespace>    # 自定义密钥的命名空间
  persistentVolumeReclaimPolicy: Retain    # 回收策略
  storageClassName: csi-obs               # 存储类名称
  mountOptions: []                         # 挂载参数

1.2关键参数说明

参数 是否必填 描述
everest.io/reclaim-policy: retain-volume-only 可选字段 目前仅支持配置"retain-volume-only" everest插件版本需 >= 1.2.9且回收策略为Delete时生效。如果回收策略是Delete且当前值设置为"retain-volume-only"删除PVC回收逻辑为:删除PV,保留底层存储卷。
fsType 实例类型,支持"obsfs"与"s3fs"。 * obsfs:并行文件系统。 * s3fs:对象桶。
volumeHandle 对象存储的名称。
everest.io/obs-volume-type 对象存储类型。 * fsType设置为s3fs时,支持STANDARD(标准桶)、WARM(低频访问桶)。 * fsType设置为obsfs时,该字段不起作用。
everest.io/region OBS存储区域。 Region对应的值请参见地区和终端节点
everest.io/enterprise-project-id 表示对象存储的企业项目ID,仅限于已开通企业项目的企业客户账号使用。了解更多企业项目相关信息,请查看企业管理。 如果指定企业项目,则创建PVC时也需要指定相同的企业项目,否则PVC无法绑定PV。 获取方法:在对象存储服务控制台,单击左侧栏目树中的"桶列表"或"并行文件系统",单击要对接的对象存储名称进入详情页,在"概览 > 基本信息"页签下找到企业项目,单击并进入对应的企业项目控制台,复制对应的ID值即可获取对象存储所属的企业项目的ID。
nodePublishSecretRef 对象存储卷挂载支持设置自定义访问密钥(AK/SK),您可以使用AK/SK创建一个Secret,然后挂载到PV。详细说明请参见对象存储卷挂载设置自定义访问密钥(AK/SK)。 示例如下: nodePublishSecretRef: name: secret-demo namespace: default
mountOptions 挂载参数,具体请参见设置对象存储挂载参数
persistentVolumeReclaimPolicy 集群版本号>=1.19.10且everest插件版本>=1.2.9时正式开放回收策略支持。 支持Delete、Retain回收策略,详情请参见PV回收策略。多个PV使用同一个对象存储时建议使用Retain,避免级联删除底层卷。 Delete: * Delete且不设置everest.io/reclaim-policy:删除PVC,PV资源与存储均被删除。 * Delete且设置everest.io/reclaim-policy=retain-volume-only:删除PVC,PV资源被删除,存储资源会保留。 Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为"已释放(Released)",不能直接再次被PVC绑定使用。
storage 存储容量,单位为Gi。 对于对象存储来说,此处仅为校验需要(不能为空和0),设置的大小不起作用,此处设定为固定值1Gi。
storageClassName 对象存储对应的存储类名称为csi-obs。
[ ]

执行以下命令,创建PV。

复制代码
kubectl apply -f pv-obs.yaml

2.创建PVC。

2.1创建pvc-obs.yaml文件。

复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-obs
  namespace: default
  annotations:
    volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
    everest.io/obs-volume-type: STANDARD
    csi.storage.k8s.io/fstype: obsfs
    csi.storage.k8s.io/node-publish-secret-name: <your_secret_name>  # 自定义密钥的名称
    csi.storage.k8s.io/node-publish-secret-namespace: <your_namespace>        # 自定义密钥的命名空间
    everest.io/enterprise-project-id: <your_project_id>     # 可选字段,企业项目ID,如果创建PV时已指定企业项目,则创建PVC时也需要指定相同的企业项目,否则PVC无法绑定PV。
spec:
  accessModes:
  - ReadWriteMany                  # 对象存储必须为ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-obs       # 存储类名称,必须与PV的存储类一致。
  volumeName: pv-obs    # PV的名称

2.2关键参数说明

参数 是否必填 描述
csi.storage.k8s.io/node-publish-secret-name PV中指定的自定义密钥的名称。
csi.storage.k8s.io/node-publish-secret-namespace PV中指定的自定义密钥的命名空间。
everest.io/enterprise-project-id 表示对象存储的企业项目ID,仅限于已开通企业项目的企业客户账号使用。了解更多企业项目相关信息,请查看企业管理。 获取方法:在对象存储服务控制台,单击左侧栏目树中的"桶列表"或"并行文件系统",单击要对接的对象存储名称进入详情页,在"概览 > 基本信息"页签下找到企业项目,单击并进入对应的企业项目控制台,复制对应的ID值即可获取对象存储所属的企业项目的ID。
storage PVC申请容量,单位为Gi。 对于对象存储来说,此处仅为校验需要(不能为空和0),设置的大小不起作用,此处设定为固定值1Gi。
storageClassName 存储类名称,必须与1中PV的存储类一致。 对象存储对应的存储类名称为csi-obs。
volumeName PV的名称,必须与1中PV名称

2.3执行以下命令,创建PVC。

复制代码
kubectl apply -f pvc-obs.yaml

3.创建应用。

3.1创建web-demo.yaml文件,本示例中将对象存储挂载至/data路径。

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-demo
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: container-1
        image: nginx:latest
        volumeMounts:
        - name: pvc-obs-volume    #卷名称,需与volumes字段中的卷名称对应
          mountPath: /data  #存储卷挂载的位置
      imagePullSecrets:
        - name: default-secret
      volumes:
        - name: pvc-obs-volume    #卷名称,可自定义
          persistentVolumeClaim:
            claimName: pvc-obs    #已创建的PVC名称

3.2执行以下命令,创建一个挂载对象存储的应用。

复制代码
kubectl apply -f web-demo.yaml

工作负载创建成功后,您可以尝试验证数据持久化及共享性

验证数据持久化及共享性
  1. 查看部署的应用及文件。

    1. 执行以下命令,查看已创建的Pod。

      复制代码
      kubectl get pod | grep web-demo

      预期输出如下:

      复制代码
      web-demo-846b489584-mjhm9   1/1     Running   0             46s
      web-demo-846b489584-wvv5s   1/1     Running   0             46s
    2. 依次执行以下命令,查看Pod的/data路径下的文件。

      复制代码
      kubectl exec web-demo-846b489584-mjhm9 -- ls /data
      kubectl exec web-demo-846b489584-wvv5s -- ls /data

      两个Pod均无返回结果,说明/data路径下无文件。

  2. 执行以下命令,在/data路径下创建static文件。

    复制代码
    kubectl exec web-demo-846b489584-mjhm9 --  touch /data/static
  3. 执行以下命令,查看/data路径下的文件。

    复制代码
    kubectl exec web-demo-846b489584-mjhm9 -- ls /data

    预期输出如下:

    复制代码
    static
  4. 验证数据持久化

    1. 执行以下命令,删除名称为web-demo-846b489584-mjhm9的Pod。

      复制代码
      kubectl delete pod web-demo-846b489584-mjhm9

      预期输出如下:

      复制代码
      pod "web-demo-846b489584-mjhm9" deleted

      删除后,Deployment控制器会自动重新创建一个副本。

    2. 执行以下命令,查看已创建的Pod。

      复制代码
      kubectl get pod | grep web-demo

      预期输出如下,web-demo-846b489584-d4d4j为新建的Pod:

      复制代码
      web-demo-846b489584-d4d4j   1/1     Running   0             110s
      web-demo-846b489584-wvv5s    1/1     Running   0             7m50s
    3. 执行以下命令,验证新建的Pod中/data路径下的文件是否更改。

      复制代码
      kubectl exec web-demo-846b489584-d4d4j -- ls /data

      预期输出如下:

      复制代码
      static

      static文件仍然存在,则说明数据可持久化保存。

  5. 验证数据共享性

    1. 执行以下命令,查看已创建的Pod。

      复制代码
      kubectl get pod | grep web-demo

      预期输出如下:

      复制代码
      web-demo-846b489584-d4d4j   1/1     Running   0             7m
      web-demo-846b489584-wvv5s   1/1     Running   0             13m
    2. 执行以下命令,在任意一个Pod的/data路径下创建share文件。本例中选择名为web-demo-846b489584-d4d4j的Pod。

      复制代码
      kubectl exec web-demo-846b489584-d4d4j --  touch /data/share

      并查看该Pod中/data路径下的文件。

      复制代码
      kubectl exec web-demo-846b489584-d4d4j -- ls /data

      预期输出如下:

      复制代码
      share
      static
    3. 由于写入share文件的操作未在名为web-demo-846b489584-wvv5s的Pod中执行,在该Pod中查看/data路径下是否存在文件以验证数据共享性。

      复制代码
      kubectl exec web-demo-846b489584-wvv5s -- ls /data

      预期输出如下:

      复制代码
      share
      static

      如果在任意一个Pod中的/data路径下创建文件,其他Pod下的/data路径下均存在此文件,则说明两个Pod共享一个存储卷。

相关推荐
饺子大魔王的男人1 小时前
Docker环境下FileRise私有云盘在飞牛NAS的部署与穿透实践
运维·docker·容器
Lw老王要学习3 小时前
Linux容器篇、第一章_02Rocky9.5 系统下 Docker 的持久化操作与 Dockerfile 指令详解
linux·运维·docker·容器·云计算
Just_Paranoid3 小时前
华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手
华为云·知识库·maas·deepseek·flexusx
云上艺旅4 小时前
centos部署k8s v1.33版本
linux·云原生·kubernetes·centos
颜淡慕潇5 小时前
【K8S系列】Kubernetes 中 Pod(Java服务)启动缓慢的深度分析与解决方案
容器·kubernetes·pod
955.5 小时前
k8s从入门到放弃之DaemonSet控制器
云原生·容器·kubernetes
CloudPilotAI5 小时前
详解K8s 1.33原地扩缩容功能:原理、实践、局限与发展
kubernetes
藥瓿亭5 小时前
K8S认证|CKS题库+答案| 10. Trivy 扫描镜像安全漏洞
linux·运维·服务器·云原生·容器·kubernetes·cks