当容器发生宕机故障时,有状态服务容器存储的业务数据存在丢失和不可靠等风险。使用持久化存储可以解决该问题。本文介绍如何使用OSS实现持久化存储。
背景信息
阿里云对象存储服务(OSS)提供海量、安全、低成本、高可靠的云存储服务。OSS支持同时被多个Pod挂载。
OSS使用场景:
对磁盘I/O要求低。
配置文件、图片、小视频等共享业务。
OSS使用方式:
手动创建Bucket。
获取AccessKey ID和AccessKey Secret。
通过Secret方式创建PV,创建PVC。
前提条件
您已在OSS管理控制台创建Bucket,请参见控制台创建存储空间。
注意事项
容器服务Kubernetes集群升级会重启kubelet,ossfs驱动也会随之重启,导致OSS目录不可用。这时使用OSS的Pod需要重建,可在YAML文件中增加健康检查的配置,在容器内OSS目录不可用时自动重启Pod,重新挂载OSS。
通过最新版本挂载的OSS已经解决了此问题。
创建PV
执行以下命令,创建Secret。
替换以下
<your AccessKey ID>
和<your AccessKey Secret>
为您的AccessKey ID和AccessKey Secret信息。在容器服务管理控制台,鼠标悬浮右上角,选择AccessKey,获取AccessKey ID和AccessKey Secret信息。
kubectl create secret generic osssecret --from-literal=akId='<your AccessKey ID>' --from-literal=akSecret='<your AccessKey Secret>' --type=alicloud/oss -n default
osssecret
:Secret的名称,可以自行配置。akId
:AccessKey ID。akSecret
:AccessKey Secret。--type
:Secret类型:配置为alicloud/oss
的命名空间,需要与应用Pod在相同的命名空间。使用pv-oss.yaml文件创建PV。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-oss labels: alicloud-pvname: pv-oss spec: capacity: storage: 5Gi accessModes: - ReadWriteMany storageClassName: oss flexVolume: driver: "alicloud/oss" secretRef: name: "osssecret" # 替换为上一步创建的Secret名称。 options: bucket: "docker" //请替换为您的Bucket名称。 path: /path //请替换为您的子目录相对路径。 url: "oss-cn-hangzhou.aliyuncs.com" //请替换为您的URL。 otherOpts: "-o max_stat_cache_size=0 -o allow_other" //请替换为您的otherOpts。
参数解释:
alicloud-pvname
:PV的名称,与PVC中的selector
配合使用。bucket
:Bucket名称。path
:表示挂载时相对Bucket根文件的目录结构,默认为/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。url
:OSS Bucket的访问域名(Endpoint),获取方法如下:登录OSS管理控制台。
单击Bucket列表,然后单击目标Bucket名称。
在左侧导航栏,单击概览。
在访问端口区域,查看Bucket的Endpoint。
otherOpts
:挂载OSS时支持定制化参数,格式为:-o *** -o ***
。
执行以下命令,创建PV。
kubectl create -f pv-oss.yaml
预期结果:
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储卷页面,可以看到刚刚创建的存储卷PV。
创建PVC
创建OSS存储声明PVC,使用selector
筛选PV,精确配置PVC和PV的绑定关系。使用storageClassName
,表示PVC只与OSS类型的PV绑定。
创建pvc-oss.yaml文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-oss spec: accessModes: - ReadWriteMany storageClassName: oss resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-oss
执行以下命令,创建PVC。
kubectl create -f pvc-oss.yaml
预期结果:
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储声明页面,可以看到刚创建的存储声明PVC。
创建应用
创建oss-static.yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: name: oss-static labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-oss mountPath: "/data" - name: pvc-oss mountPath: "/data1" livenessProbe: exec: command: - sh - -c - cd /data initialDelaySeconds: 30 periodSeconds: 30 volumes: - name: pvc-oss persistentVolumeClaim: claimName: pvc-oss
说明健康检查
livenessProbe
的详细内容及解释,请参见OSS存储卷。执行以下命令,创建Deployment。
kubectl create -f oss-static.yaml d
预期结果:
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面,可以看到刚刚创建的Deployment。
OSS的持久化存储
执行以下命令,查看部署的deployment所在Pod的名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-dqbl2 1/1 Running 0 1h
执行以下命令,查看/data路径下的文件。
kubectl exec oss-static-66fbb85b67-dqbl2 -- ls /data | grep tmpfile
说明/data路径下为空,没有文件。
执行以下命令,在/data路径下创建文件tmpfile。
kubectl exec oss-static-66fbb85b67-dqbl2 -- touch /data/tmpfile
执行以下命令,查看/data路径下的文件。
kubectl exec oss-static-66fbb85b67-dqbl2 -- ls /data | grep tmpfile
预期输出:
tmpfile
执行以下命令,删除名称为oss-static-66fbb85b67-dqbl2的Pod。
kubectl delete pod oss-static-66fbb85b67-dqbl2
预期输出:
pod "oss-static-66fbb85b67-dqbl2" deleted
同时在另一个窗口中,执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。
kubectl get pod -w -l app=nginx
预期输出:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-dqbl2 1/1 Running 0 78m oss-static-66fbb85b67-dqbl2 1/1 Terminating 0 78m oss-static-66fbb85b67-zlvmw 0/1 Pending 0 <invalid> oss-static-66fbb85b67-zlvmw 0/1 Pending 0 <invalid> oss-static-66fbb85b67-zlvmw 0/1 ContainerCreating 0 <invalid> oss-static-66fbb85b67-dqbl2 0/1 Terminating 0 78m oss-static-66fbb85b67-dqbl2 0/1 Terminating 0 78m oss-static-66fbb85b67-dqbl2 0/1 Terminating 0 78m oss-static-66fbb85b67-zlvmw 1/1 Running 0 <invalid>
执行以下命令,查看Kubernetes重建的Pod的名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-zlvmw 1/1 Running 0 40s
执行以下命令,查看/data路径下的文件,刚刚创建的文件tmpfile并未被删除,说明OSS上的数据可持久保存。
kubectl exec oss-static-66fbb85b67-zlvmw -- ls /data | grep tmpfile
预期输出:
tmpfile