使用对象存储静态存储卷,即使用预先在对象存储控制台已创建Bucket,通过手动创建PV指定已有Bucket,创建PVC时使用已有PV的方式,实现容器内挂载对象存储。
该模式下需要用户自建对象存储Bucket及PV资源,一定程度上增加操作和管理复杂性。
前提条件
确保您已经创建Serverless集群,具体操作请参阅创建Serverless集群。若已有Serverless集群,无需重复操作。
已在插件市场安装存储插件cstor-csi,且插件正常运行。
容器集群所在资源池已开通对象存储服务。
已在对象存储控制台创建Bucket。
确保kubectl工具已经连接目标集群。
使用对象存储静态存储卷(kubectl)
步骤一:创建保密字典
创建示例yaml文件zos-test.yaml:
apiVersion: v1
data:
AK: xxxxxxxxxxxx #填写base64编码后的AK
SK: xxxxxxxxxxxx #填写base64编码后的SK
kind: Secret
metadata:
name: zos-test
namespace: default
type: Opaque
执行以下命令,创建secret:
kubectl apply -f zos-test.yaml
步骤二:创建持久卷(PV)
创建示例yaml文件pv-static-zos.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/provisioned-by: zos.csi.cstor.com
name: pvc-{PV-NAME} #pv名称,以pvc-开头
spec:
accessModes:
- ReadWriteOnce #访问模式
capacity:
storage: 5Gi #容量
csi:
driver: zos.csi.cstor.com
nodePublishSecretRef:
name: {SECRET-NAME} #保密字典名称
namespace: {SECRET-NAMESPACE} #保密字典命名空间
volumeAttributes:
bucket: {BUCKET-NAME} #bucket名称
mountEndpoint: http://100.123.xxx.xx:80 #挂载地址,在存储控制台可查
driverType: zos.csi.cstor.com
type: STANDARD #产品类型
volumeHandle: 0105-{PV-NAME-LENTH}-{PV-NAME} #PV-NAME-LENTH为PV-NAME长度的十六进制表示,比如PV-NAME是"pv-static-zos",则PV-NAME-LENTH为0D
volumeMode: Filesystem
执行以下命令,创建pv:
kubectl apply -f pv-static-zos.yaml
步骤三:创建持久卷声明(PVC)
创建示例yaml文件pvc-static-zos.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/storage-provisioner: zos.csi.cstor.com
name: pvc-static-zos
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
volumeMode: Filesystem
volumeName: {YOUR-PV-NAME} #替换PV名称
执行以下命令,创建pvc:
kubectl apply -f pvc-static-zos.yaml
步骤四:创建工作负载
创建示例yaml文件pod-pvc-static-zos.yaml:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-pvc-static-zos
labels:
app: nginx-pvc-static-zos
spec:
replicas: 1
serviceName: ""
selector:
matchLabels:
app: nginx-pvc-static-zos
template:
metadata:
labels:
app: nginx-pvc-static-zos
spec:
containers:
- image: "registry-huadong1.crs-internal.ctyun.cn/open-source/nginx:1.26-alpine-slim"
imagePullPolicy: "IfNotPresent"
name: "nginx"
resources:
limits:
cpu: "100m"
memory: "256Mi"
requests:
cpu: "100m"
memory: "256Mi"
volumeMounts:
- mountPath: "/mnt/data"
name: "volume1"
subPath: "scetest"
volumes:
- name: "volume1"
persistentVolumeClaim:
claimName: {YOUR-PVC-NAME} #替换为步骤3中的PVC名称
执行以下命令,创建StatefulSet:
kubectl apply -f pod-pvc-static-zos.yaml
步骤五:验证数据持久化
登录弹性容器服务管理控制台。
在容器组列表页点击刚才创建的实例。
点击“远程连接”页签,进入到容器内。
向/mnt/data 目录下写一个文件,执行:
echo "Hello World" > /mnt/data/test.log
查看/mnt/data 目录下文件,执行:
cat /mnt/data/test.log
预期结果如下:
退出“远程连接”,使用kubectl删除pod,会触发pod自动重建,等待Pod重新运行正常。
kubectl delete po nginx-pvc-static-zos-0
对新建Pod,登录“弹性容器服务”管理控制台,继续执行“远程连接”,进入到容器内查看数据。执行:
cat /mnt/data/test.log
预期结果如下:
登录天翼云对象存储管理控制台,根据PV名称查看bucket,进入bucket中的文件管理,可以看到在容器内创建的文件:
下载文件并查看内容,预期结果与容器内写入数据一致。
以上步骤说明,pod删除重建后,重新挂载对象存储卷,数据仍然存在;从对象存储下载数据并与写入数据一致, 说明对象存储中的数据可持久化保存。