云容器引擎支持使用天翼云对象存储持久卷。当前cstor-csi插件支持使用对象存储动态存储卷和静态存储卷,通过将存储卷挂载到容器指定目录下,以实现数据持久化需求。
前提条件
- 已创建容器集群
- 已在插件市场安装存储插件cstor-csi,且插件正常运行
- 容器集群所在资源池已开通对象存储服务
使用限制
参见“对象存储概述”——“使用限制”
通过控制台使用对象存储动态存储卷
1 、创建保密字典
- 进入天翼云对象存储控制台,进入Access Key管理;
- 查看对象存储密钥,并记录;
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“配置管理”——“保密字典”,选择命名空间,单击左上角“创建”。
- 输入名称、内容,内容项变量名分别是AK、SK(变量名大写),变量值分别对象上一步中获取到的密钥;点击提交;
2 、创建存储类( StorageClass )
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“存储”——“存储类”,单击左上角“创建”;
- 在创建对话框,配置存储类StorageClass的相关参数。配置项说明如下:
配置项 | 说明 |
---|---|
名称 | StorageClass的名称。 |
存储类型 | 当前支持云盘、弹性文件和对象存储,这里选择对象存储。 具体创建页中展示的存储类型由当前资源池支持情况决定。 |
存储驱动 | 对应StorageClass yaml中provisioner,值为zos.csi.cstor.com |
回收策略 | 回收策略,默认为Deleted。 1、 Retained(保留):用户可以手动回收资源。当PVC对象被删除时,PV卷仍然存在,对应的数据卷被视为"已释放(released)"。 2、 Deleted(删除):对于支持Delete回收策略的卷插件,删除动作会将PV对象从Kubernetes中移除,同时也会从外部基础设施中移除所关联的存储资产。 如果对数据安全性要求高,推荐使用Retain方式,以免误删数据。 |
绑定策略 | 绑定策略,默认为Immediate。 1、Immediate模式:表示一旦创建了PVC,也就完成了卷绑定和动态供应。对于由于拓扑限制而非集群所有节点可达的存储后端,PV会在不知道Pod调度要求的情况下绑定或者制备。 · 2、WaitForFirstConsumer模式:该模式将延迟PV的绑定和制备,直到使用该PVC的Pod被创建。PV会根据Pod调度约束指定的拓扑来选择或供应。 |
参数 | 对象存储类型:参数键为type,支持参数值如下: 1、STANDARD:标准存储 2、STANDARD_IA:低频存储 AZ策略:当前支持单可用区(默认值)、多可用区。参数键为azpolicy,支持参数值为single-az(默认值)、multi-az 访问证书:命名空间、名称分别选择步骤1中保密字典所属命名空间及名称。对应StorageClass中参数键分别为csi.storage.k8s.io/node-publish-secret-namespace、csi.storage.k8s.io/node-publish-secret-name |
挂载选项 | 挂载参数,用户可根据自己的情况实际定制相关参数。 |
- 参数配置完成后,点击“确定”。创建成功后,可以在存储类列表查看。
3 、创建持久卷声明( PVC )
- 进入主菜单“存储”——“持久卷声明”,单击左上角“创建持久卷声明”;
- 在创建对话框,配置持久卷声明PVC的相关参数。配置项说明如下:
配置项 | 说明 |
---|---|
名称 | PVC的名称 |
存储声明类型 | 当前支持云盘、弹性文件和对象存储,这里选择对象存储。 具体创建页中展示的存储类型由当前资源池支持情况决定。 |
分配模式 | 当前支持“使用存储类”和“已有存储卷” 这里选择“使用存储类” |
StorageClass名称 | 选择上一步创建的StorageClass |
容量 | 可以根据需求自定义容量 |
访问模式 | 1、ReadWriteOnce:卷可以被一个节点以读写方式挂载 2、ReadOnlyMany:卷可以被多个节点以只读方式挂载 3、ReadWriteMany:卷可以被多个节点以读写方式挂载 |
- 参数配置完成后,点击“确定”。创建成功后,可以在持久卷声明列表查看。
- 进入持久卷声明列表页,等待PVC状态为“已绑定” 。此时,进入主菜单“存储”——“持久卷“,可以看到对应的PV创建。
PV创建后,可以在“天翼云对象存储”管理控制台看到对应名称的bucket
如果PVC一直未绑定,可以查看进入对应PVC详情页查看事件,或者查看cstor-csi日志进行定位。
4 、创建工作负载
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“工作负载”——“有状态”,单击左上角“创建SatefulSet”;
- 在创建对话框,数据卷栏中,选择添加数据卷,卷类型选择“使用已有PVC”,操作栏选择“添加已有PVC”;
- 在实例内容器栏,为容器设置挂载点。选择添加挂载点,选择数据卷为上一步创建,根据需要配置容器路径和权限;
说明数据卷子路径:对象存储支持配置卷内子路径,实现一个共享卷挂载多个路径。
- 所有的信息都配置完成后,单击“提交”。
创建成功后,您就可以正常使用数据卷。
通过kubectl命令行使用对象存储动态存储卷
1 、创建存储类( StorageClass )
- 使用kubectl连接集群,创建示例yaml文件sc-example.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: cstor-csi-zos-standard-sc
provisioner: zos.csi.cstor.com
parameters:
# 标准存储
type: STANDARD
# 使用bucket所使用的AK/SK的secret
csi.storage.k8s.io/node-publish-secret-name: obs-secret
csi.storage.k8s.io/node-publish-secret-namespace: default
# 对象存储的AZ策略,不填默认为single-az
azpolicy: single-az
reclaimPolicy: Delete
allowVolumeExpansion: true
- 执行以下命令,创建StorageClass
kubectl apply -f sc-example.yaml
- 查看创建的StorageClass:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”——“存储类”,在存储类列表查看。
2 、创建持久卷声明( PVC )
- 使用kubectl连接集群,创建示例yaml文件pvc-example.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cstor-pvc-zos
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: cstor-csi-zos-standard-sc
- 执行以下命令,创建PVC
kubectl apply -f pvc-example.yaml
- 查看创建的PVC:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”——“持久卷声明”,在列表查看。
3 、创建工作负载
- 使用kubectl连接集群,创建示例yaml文件sts-example.yaml:
apiVersion: "apps/v1"
kind: "StatefulSet"
metadata:
name: "zos-test"
namespace: "default"
spec:
podManagementPolicy: "OrderedReady"
replicas: 1
revisionHistoryLimit: 10
template:
spec:
containers:
- image: "nginx:1.25-alpine"
imagePullPolicy: "IfNotPresent"
name: "container1"
resources:
limits:
cpu: "100m"
memory: "256Mi"
requests:
cpu: "100m"
memory: "256Mi"
terminationMessagePath: "/dev/termination-log"
terminationMessagePolicy: "File"
volumeMounts:
- mountPath: "/tmp"
name: "volume1"
subPath: "ccsetest"
dnsPolicy: "ClusterFirst"
restartPolicy: "Always"
schedulerName: "default-scheduler"
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: "volume1"
persistentVolumeClaim:
claimName: "cstor-pvc-zos"
updateStrategy:
rollingUpdate:
partition: 0
type: "RollingUpdate"
- 执行以下命令,创建StatefulSet
kubectl apply -f sts-example.yaml
- 查看创建的有状态负载:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“工作负载”——“有状态”,在列表查看。
- 验证数据持久化
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“工作负载”——“有状态”,进入负载详情;
- 在Pod列表页,选择“远程登录”,进入到容器内执行以下命令:
- 向/tmp 目录下写一个文件,执行echo "Hello World" > /tmp/test.log
- 查看/tmp目录下文件,执行ls /tmp,预期结果如下:
lost+found test.log
- 退出“远程登录”,对上一步中的Pod执行“销毁重建”,等待Pod重新运行正常;
- 对新建Pod,继续执行“远程登录”,进入到容器内查看数据。执行cat /tmp/test.log,预期结果如下:
Hello World
- 登录“天翼云对象存储”管理控制台,根据PV名称查看bucket,进入bucket——文件管理,可以看到在容器内创建的文件:
下载文件并查看内容,预期结果与容器内写入数据一致。
- 以上步骤说明,pod删除重建后,重新挂载对象存储卷,数据仍然存在;从对象存储下载数据并与写入数据一致,说明对象存储中的数据可持久化保存。