使用OSS實(shí)現(xiàn)持久化存儲(chǔ)-Flexvolume
當(dāng)容器發(fā)生宕機(jī)故障時(shí),有狀態(tài)服務(wù)容器存儲(chǔ)的業(yè)務(wù)數(shù)據(jù)存在著丟失和不可靠等風(fēng)險(xiǎn)。使用持久化存儲(chǔ)可以解決該問(wèn)題。本文介紹如何使用OSS實(shí)現(xiàn)持久化存儲(chǔ)。
背景信息
阿里云對(duì)象存儲(chǔ)服務(wù)(OSS)提供海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù)。OSS支持同時(shí)被多個(gè)Pod掛載。
OSS使用場(chǎng)景:
對(duì)磁盤(pán)I/O要求低。
配置文件、圖片、小視頻等共享業(yè)務(wù)。
OSS使用方式:
手動(dòng)創(chuàng)建Bucket。
獲取AccessKey ID和AccessKey Secret。
手動(dòng)創(chuàng)建PV及PVC。
前提條件
您已在OSS管理控制臺(tái)創(chuàng)建Bucket,請(qǐng)參見(jiàn)控制臺(tái)創(chuàng)建存儲(chǔ)空間。
注意事項(xiàng)
容器服務(wù)Kubernetes集群升級(jí)會(huì)重啟Kubelet,OSSFS驅(qū)動(dòng)跟隨一起重啟,導(dǎo)致OSS目錄不可用。這時(shí)使用OSS的Pod需要重建,可在YAML文件中增加健康檢查的配置,在容器內(nèi)OSS目錄不可用時(shí)自動(dòng)重啟Pod,重新掛載OSS。
通過(guò)最新版本掛載的OSS已經(jīng)解決了此問(wèn)題。
創(chuàng)建PV
創(chuàng)建pv-oss.yaml文件。
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" options: bucket: "docker" //請(qǐng)?zhí)鎿Q為您的Bucket名稱。 path: /path //請(qǐng)?zhí)鎿Q為您的子目錄相對(duì)路徑。 url: "oss-cn-hangzhou.aliyuncs.com" //請(qǐng)?zhí)鎿Q為您的URL。 akId: "***" //請(qǐng)?zhí)鎿Q為您的AccessKey ID。 akSecret: "***" //請(qǐng)?zhí)鎿Q為您的AccessKey Secret。 otherOpts: "-o max_stat_cache_size=0 -o allow_other" //請(qǐng)?zhí)鎿Q為您的otherOpts。
參數(shù)解釋?zhuān)?/p>
alicloud-pvname
:PV的名稱,與PVC中的selector
配合使用。bucket
:Bucket名稱。path
:表示掛載時(shí)相對(duì)Bucket根文件的目錄結(jié)構(gòu),默認(rèn)為/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。url
:OSS Bucket的訪問(wèn)域名(Endpoint),請(qǐng)參見(jiàn)訪問(wèn)域名和數(shù)據(jù)中心。也可以在OSS管理控制臺(tái)查詢:登錄OSS管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇目標(biāo)Bucket,在概覽頁(yè)面的訪問(wèn)域名區(qū)域,查看Endpoint(地域節(jié)點(diǎn))。akId
:AccessKey ID。在容器服務(wù)管理控制臺(tái),單擊右上角,選擇AccessKey 管理,設(shè)置AccessKey ID和AccessKey Secret。akSecret
:AccessKey Secret。獲取方法同akId
。otherOpts
:掛載OSS時(shí)支持定制化參數(shù),格式為:-o *** -o ***
。
執(zhí)行以下命令,創(chuàng)建PV。
kubectl create -f pv-oss.yaml
預(yù)期結(jié)果:
- 登錄容器服務(wù)管理控制臺(tái)。
在控制臺(tái)左側(cè)導(dǎo)航欄中,單擊集群。
在集群列表頁(yè)面中,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
在集群管理頁(yè)左側(cè)導(dǎo)航欄中,選擇
,可以看到剛剛創(chuàng)建的PV。
創(chuàng)建PVC
創(chuàng)建OSS存儲(chǔ)聲明PVC,使用selector
篩選PV,精確配置PVC和PV的綁定關(guān)系。使用storageClassName
,表示PVC只與OSS類(lèi)型的PV綁定。
創(chuàng)建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
執(zhí)行以下命令,創(chuàng)建PVC。
kubectl create -f pvc-oss.yaml
預(yù)期結(jié)果:
- 登錄容器服務(wù)管理控制臺(tái)。
在控制臺(tái)左側(cè)導(dǎo)航欄中,單擊集群。
在集群列表頁(yè)面中,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
在集群管理頁(yè)左側(cè)導(dǎo)航欄中,選擇
,可以看到剛剛創(chuàng)建的PVC。
創(chuàng)建應(yīng)用
創(chuàng)建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: nginx 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
說(shuō)明健康檢查
livenessProbe
的詳細(xì)內(nèi)容及解釋?zhuān)?qǐng)參見(jiàn)OSS存儲(chǔ)卷概述。執(zhí)行以下命令,創(chuàng)建Deployment。
kubectl create -f oss-static.yaml d
預(yù)期結(jié)果:
- 登錄容器服務(wù)管理控制臺(tái)。
在控制臺(tái)左側(cè)導(dǎo)航欄中,單擊集群。
在集群列表頁(yè)面中,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的應(yīng)用管理。
在集群管理頁(yè)左側(cè)導(dǎo)航欄中,選擇
,可以看到剛剛創(chuàng)建的Deployment。
OSS的持久化存儲(chǔ)
執(zhí)行以下命令,查看部署的deployment所在Pod的名稱。
kubectl get pod
預(yù)期輸出:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-dqbl2 1/1 Running 0 1h
執(zhí)行以下命令,查看/data路徑下的文件。
kubectl exec oss-static-66fbb85b67-dqbl2 -- ls /data | grep tmpfile
說(shuō)明/data路徑下為空,沒(méi)有文件。
執(zhí)行以下命令,在/data路徑下創(chuàng)建文件tmpfile。
kubectl exec oss-static-66fbb85b67-dqbl2 -- touch /data/tmpfile
執(zhí)行以下命令,查看/data路徑下的文件。
kubectl exec oss-static-66fbb85b67-dqbl2 -- ls /data | grep tmpfile
預(yù)期輸出:
tmpfile
執(zhí)行以下命令,刪除名稱為oss-static-66fbb85b67-dqbl2的Pod。
kubectl delete pod oss-static-66fbb85b67-dqbl2
預(yù)期輸出:
pod "oss-static-66fbb85b67-dqbl2" deleted
同時(shí)在另一個(gè)窗口中,執(zhí)行以下命令,查看Pod刪除及Kubernetes重建Pod的過(guò)程。
kubectl get pod -w -l app=nginx
預(yù)期輸出:
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>
執(zhí)行以下命令,查看Kubernetes重建的Pod名稱。
kubectl get pod
預(yù)期輸出:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-zlvmw 1/1 Running 0 40s
執(zhí)行以下命令,查看/data路徑下的文件,剛剛創(chuàng)建的文件tmpfile并沒(méi)有被刪除,說(shuō)明OSS上的數(shù)據(jù)可持久保存。
kubectl exec oss-static-66fbb85b67-zlvmw -- ls /data | grep tmpfile
預(yù)期輸出:
tmpfile