K8S有狀態服務-OSS儲存使用最佳實踐
OSS介紹:
阿里雲物件儲存服務(OSS)提供海量、安全、低成本、高可靠的雲端儲存服務。適用於配置檔案、圖片、小視訊等共享業務;
容器服務訪問OSS 資料是通過 ossfs 把 bucket 掛載到本地檔案系統中,容器中的應用通過本地檔案系統操作OSS上的資料,實現資料的訪問、共享。
使用OSS卷掛載時:
隨機或者追加寫檔案會導致整個檔案的重寫。
元資料操作,例如list directory,效能較差,因為需要遠端訪問OSS伺服器。
多個客戶端掛載同一個bucket時,使用者自行處理併發。例如:避免多個客戶端寫同一個檔案。
不適合用在高併發讀/寫的場景,這樣會讓系統的load升高。
建立OSS儲存卷
建立OSS Bucket
- 在OSS控制檯建立一個Bucket,根據需求配置bucket的讀寫許可權;
- 在概覽頁查詢訪問bucket的Endpoint;
- 可以在叢集中一個節點掛載OSS Bucket測試是否可行;
建立PV
通過OSS卷建立PV資源型別,配置PV唯一性標籤alicloud-pvname: pv-oss,“pv-oss”為PV Name;
配置storageClassName: oss,標識此PV為oss儲存型別,只會與oss型別的PVC繫結;
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" url: "oss-cn-hangzhou.aliyuncs.com" akId: "***" akSecret: "***" otherOpts: "-o max_stat_cache_size=0 -o allow_other"
options支援的引數:
bucket:目前只支援掛載 Bucket,不支援掛載 Bucket 下面的子目錄或檔案。
url: OSS Bucket的endpoint,掛載 OSS 的接入域名。
akId: 使用者的 access id 值。
akSecret:使用者的 access secret 值。
otherOpts: 掛載 OSS 時支援定製化引數輸入,格式為: -o* *。參考文件
建立應用
PVC通過配置selector,指定與建立的oss PV進行繫結;
配置storageClassName: oss,表示至於OSS型別儲存卷繫結;
OSS為共享儲存,可以同時由多個Pod掛載一個bucket;
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-oss spec: accessModes: - ReadWriteMany storageClassName: oss resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-oss --- 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
健康檢查使用說明
OSSFS通過s3fs進行bucket掛載,是在使用者態掛載的檔案系統(FUSE);OSSFS在網路出現重連的時候會重新啟動,這時容器內部的bind目錄已經不可用,需要重啟容器;配置健康檢查能保證容器內oss目錄不可用時重啟容器,進而重新bind oss目錄;
以下情況會導致網路重置:
升級叢集;
重啟kubelet;
主機網路重啟;
livenessProbe 引數說明:
command:sh -c cd /oss-path;語法如上面示例所示,目錄為容器內部的oss對應目錄,多個目錄時寫一個即可; initialDelaySeconds:容器啟動後開始檢查的時間; periodSeconds:檢查時間週期;
高可用驗證
建立服務:
# kubectl create -f oss.yaml persistentvolume "pv-oss" created persistentvolumeclaim "pvc-oss" created deployment.apps "oss-static" created # kubectl get pod NAMEREADYSTATUSRESTARTSAGE oss-static-5d8cd48d96-9gc6c1/1Running03s
OSS Bucket上建立臨時檔案:
# kubectl exec oss-static-5d8cd48d96-9gc6c ls /data | grep tmpfile # kubectl exec oss-static-5d8cd48d96-9gc6c touch /data/tmpfile # kubectl exec oss-static-5d8cd48d96-9gc6c ls /data/ | grep tmpfile tmpfile
刪除Pod,檢視新建立Pod資料:
# kubectl delete pod oss-static-5d8cd48d96-9gc6c # kubectl get pod NAMEREADYSTATUSRESTARTSAGE oss-static-5d8cd48d96-bfwb21/1Running014s # kubectl exec oss-static-5d8cd48d96-bfwb2 ls /data | grep tmpfile tmpfile