云存储网关CSG(Cloud Storage Gateway)以阿里云对象存储OSS为后端存储,给云上和云下应用提供业界标准的NFS和CIFS文件存储服务,以及iscsi块存储服务。
云存储网关的挂载方式支持共享存储;只支持静态存储卷,不支持动态存储卷。目前容器服务ACK控制台尚未集成云存储网关类型的存储卷,本文将详细介绍如何在ACK控制台云存储网关持久化存储卷。
一、前提条件
- 使用云存储网关需要开通对象存储bucket作为后端存储,可以参考:创建存储空间。
- 开通云存储网关,并创建NFS协议共享,可以参考:在云控制台上使用文件网关。
- 创建ACK集群。需要已创建一个ACK集群,且存储插件选择为CSI。创建ACK集群可以参考:创建Kubernetes托管版集群。
- 已使用kubectl连接Kubernetes集群。具体操作参考:通过kubectl工具连接集群。
二、通过控制台挂载
登录网关控制台->点击网关列表->点击需要挂载的网关id->记录下共享挂载点信息。格式为ip:/路径,如172.0.0.1:/share。
2.1 创建存储卷(PV)
在ack控制台,对应的ack集群中,选择存储-存储卷-创建。在“创建存储卷”对话框中选择NAS,挂载点域名选择自定义,填写前面记下的共享ip以及路径。
2.2 创建存储卷声明(PVC)
选择存储声明,并创建。在“创建存储声明”对话框,选择NAS,分配模式选择已有存储卷。选择2.1步骤中创建的存储卷即可。
2.3 创建应用
新建应用,在数据卷中选择增加云存储声明,挂载源选择刚才创建的pvc,容器路径则是自定义,将数据卷挂载容器的哪个路径下。
2.4 验证存储
2.4.1 查看部署应用和文件
1)在kubectl客户端机器上,执行:
kubectl get pod
结果预期(pod的名称使用pod-1xxx等代替):
NAME READY STATUS RESTARTS AGE pod-1xxx 1/1 Running 0 16h pod-2xxx 1/1 Running 0 16h pod-2xxx 1/1 Running 0 16h
2)查看任意一个pod下的挂载项,可以看到/tmp路径成功挂载了云存储网关共享。
3)查看挂载路径/tmp下的文件,可以看到为空,说明暂时没有文件。
2.4.2 创建文件
1)执行下面的命令,创建文件aaa
kubectl exec pod-1xxx --touch /tmp/aaa
2)执行下面的命令:
kubectl exec pod-1xxx --ls /tmp
预期结果:
aaa
说明在挂载路径下成功创建了文件aaa。
另外,还可以登录OSS控制台,去对应的bucket中查看创建的aaa文件。
2.4.3 验证持久化存储
1)执行以下命令,删除pod-1xxx。
kubectl delete pod pod-1xxx
结果预期:
pod "pod-1xxx" deleted
2)执行以下命令,查看重建的pod名称(下文中记为pod-1new):
kubectl get pod
3)执行以下命令,查看文件是否还在:
kubectl exec pod-1new --ls /tmp
预期结果:
aaa
说明文件是持久化存储的,pod删除并不会导致文件被删除。
2.4.4 验证共享存储
执行以下命令:
kubectl exec pod-2xxx --ls /tmp
预期结果:
aaa
说明不同pod之间可以共享存储。
三、通过kubectl命令行挂载
3.1 创建存储卷(PV)
创建一个yaml文件pv-csg.yaml,内容参考下面:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-csg labels: alicloud-pvname: pv-csg spec: capacity: storage: 40Gi storageClassName: nas accessModes: - ReadWriteOnce csi: driver: nasplugin.csi.alibabacloud.com volumeAttributes: path: #共享挂载路径,如: /share server: xxx.xxx.xxx.xxx volumeHandle: pv-csg persistentVolumeReclaimPolicy: Retain volumeMode: Filesystem # 如果有其他的nfs挂载参数,可以再添加下面的字段: mountoptions: -# 部分挂载参数示例:nolock,proto=tcp,noresvport -vers=3# 3 或 4.0
在kubectl客户端执行下面的命令:
kubectl create -f pv-csg.yaml
预期结果:
persistentvolume/pv-csg created
登录控制台,可以看到存储-存储卷中新增了一项pv-csg。
3.2 创建存储卷声明(PVC)
创建一个yaml文件pvc-csg.yaml,内容参考下面:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-csg spec: accessModes: - ReadWriteOnce resources: requests: storage: 40Gi selector: matchLabels: alicloud-pvname: pv-csg # 3.1节中的pv name storageClassName: nas volumeMode: Filesystem volumeName: pv-csg
在kubectl客户端执行下面的命令:
kubectl create -f pvc-csg.yaml
预期结果:
persistentvolumeclaim/pvc-csg created
登录控制台,可以看到存储-存储声明中新增了一项pvc-csg。
3.3 创建应用
以魔方游戏为例创建一个无状态应用ack-cube。创建一个yaml文件cube.yaml,内容参考下面:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: ack-cube name: ack-cube namespace: default spec: replicas: 3# pod副本数量 selector: matchLabels: app: ack-cube template: metadata: labels: app: ack-cube spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube:1.0' imagePullPolicy: IfNotPresent name: ack-cube ports: - containerPort: 80 volumeMounts: - mountPath: /tmp # 容器存储卷挂载路径 name: volume-pvc-csg volumes: - name: volume-pvc-csg persistentVolumeClaim: claimName: pvc-csg # 3.2节中存储卷的名称
在kubectl客户端执行下面的命令:
kubectl create -f cube.yaml
预期结果:
deployment.apps/ack-cube created
登录控制台,可以看到工作负载-无状态中新增了一项ack-cube。
3.4 验证存储
验证存储可以采用和2.4节同样的方法。