华为云上的K8S怎么使用对象存储配置pod文件持久化。
1.通过kubectl命令行使用已有对象存储
使用kubectl连接集群。
1.1创建PV。
创建pv-obs.yaml文件。
apiVersion: v1
kind: PersistentVolume
metadata:annotations:pv.kubernetes.io/provisioned-by: everest-csi-provisionereverest.io/reclaim-policy: retain-volume-only # 可选字段,删除PV,保留底层存储卷name: pv-obs # PV的名称
spec:accessModes:- ReadWriteMany # 访问模式,对象存储必须为ReadWriteManycapacity:storage: 1Gi # 存储容量大小,此处仅为校验需要(不能为空和0),设置的大小不起作用csi:driver: obs.csi.everest.io # 挂载依赖的存储驱动fsType: obsfs # 实例类型volumeHandle: <your_volume_id> # 对象存储的名称volumeAttributes:storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisionereverest.io/obs-volume-type: STANDARDeverest.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”。
|
volumeHandle | 是 | 对象存储的名称。 |
everest.io/obs-volume-type | 是 | 对象存储类型。
|
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-demonamespace: default |
mountOptions | 否 | 挂载参数,具体请参见设置对象存储挂载参数。 |
persistentVolumeReclaimPolicy | 是 | 集群版本号>=1.19.10且everest插件版本>=1.2.9时正式开放回收策略支持。 支持Delete、Retain回收策略,详情请参见PV回收策略。多个PV使用同一个对象存储时建议使用Retain,避免级联删除底层卷。 Delete:
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-obsnamespace: defaultannotations:volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisionereverest.io/obs-volume-type: STANDARDcsi.storage.k8s.io/fstype: obsfscsi.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 # 对象存储必须为ReadWriteManyresources:requests:storage: 1GistorageClassName: 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-demonamespace: default
spec:replicas: 2selector:matchLabels:app: web-demotemplate:metadata:labels:app: web-demospec:containers:- name: container-1image: nginx:latestvolumeMounts:- name: pvc-obs-volume #卷名称,需与volumes字段中的卷名称对应mountPath: /data #存储卷挂载的位置imagePullSecrets:- name: default-secretvolumes:- name: pvc-obs-volume #卷名称,可自定义persistentVolumeClaim:claimName: pvc-obs #已创建的PVC名称
3.2执行以下命令,创建一个挂载对象存储的应用。
kubectl apply -f web-demo.yaml
工作负载创建成功后,您可以尝试验证数据持久化及共享性。
验证数据持久化及共享性
- 查看部署的应用及文件。
- 执行以下命令,查看已创建的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
- 依次执行以下命令,查看Pod的/data路径下的文件。
kubectl exec web-demo-846b489584-mjhm9 -- ls /data kubectl exec web-demo-846b489584-wvv5s -- ls /data
两个Pod均无返回结果,说明/data路径下无文件。
- 执行以下命令,查看已创建的Pod。
- 执行以下命令,在/data路径下创建static文件。
kubectl exec web-demo-846b489584-mjhm9 -- touch /data/static
- 执行以下命令,查看/data路径下的文件。
kubectl exec web-demo-846b489584-mjhm9 -- ls /data
预期输出如下:
static
- 验证数据持久化
- 执行以下命令,删除名称为web-demo-846b489584-mjhm9的Pod。
kubectl delete pod web-demo-846b489584-mjhm9
预期输出如下:
pod "web-demo-846b489584-mjhm9" deleted
删除后,Deployment控制器会自动重新创建一个副本。
- 执行以下命令,查看已创建的Pod。
预期输出如下,web-demo-846b489584-d4d4j为新建的Pod:kubectl get pod | grep web-demo
web-demo-846b489584-d4d4j 1/1 Running 0 110s web-demo-846b489584-wvv5s 1/1 Running 0 7m50s
- 执行以下命令,验证新建的Pod中/data路径下的文件是否更改。
kubectl exec web-demo-846b489584-d4d4j -- ls /data
预期输出如下:
static
static文件仍然存在,则说明数据可持久化保存。
- 执行以下命令,删除名称为web-demo-846b489584-mjhm9的Pod。
- 验证数据共享性
- 执行以下命令,查看已创建的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
- 执行以下命令,在任意一个Pod的/data路径下创建share文件。本例中选择名为web-demo-846b489584-d4d4j的Pod。
并查看该Pod中/data路径下的文件。kubectl exec web-demo-846b489584-d4d4j -- touch /data/share
kubectl exec web-demo-846b489584-d4d4j -- ls /data
预期输出如下:
share static
- 由于写入share文件的操作未在名为web-demo-846b489584-wvv5s的Pod中执行,在该Pod中查看/data路径下是否存在文件以验证数据共享性。
kubectl exec web-demo-846b489584-wvv5s -- ls /data
预期输出如下:
share static
如果在任意一个Pod中的/data路径下创建文件,其他Pod下的/data路径下均存在此文件,则说明两个Pod共享一个存储卷。
- 执行以下命令,查看已创建的Pod。