K8S有狀態服務-OSS存儲使用最佳實踐

OSS介紹:

阿里雲對象存儲服務(OSS)提供海量、安全、低成本、高可靠的雲存儲服務。適用於配置文件、圖片、小視頻等共享業務;

容器服務訪問OSS 數據是通過 ossfs 把 bucket 掛載到本地文件系統中,容器中的應用通過本地文件系統操作OSS上的數據,實現數據的訪問、共享。

使用OSS卷掛載時:

隨機或者追加寫文件會導致整個文件的重寫。

元數據操作,例如list directory,性能較差,因爲需要遠程訪問OSS服務器。

多個客戶端掛載同一個bucket時,用戶自行處理併發。例如:避免多個客戶端寫同一個文件。

不適合用在高併發讀/寫的場景,這樣會讓系統的load升高。

創建OSS存儲卷

創建OSS Bucket

  1. 在OSS控制檯創建一個Bucket,根據需求配置bucket的讀寫權限;
  2. 在概覽頁查詢訪問bucket的Endpoint;
  3. 可以在集羣中一個節點掛載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
NAME                          READY     STATUS    RESTARTS   AGE
oss-static-5d8cd48d96-9gc6c   1/1       Running   0          3s

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
NAME                          READY     STATUS        RESTARTS   AGE
oss-static-5d8cd48d96-bfwb2   1/1       Running       0          14s

# kubectl exec oss-static-5d8cd48d96-bfwb2 ls /data | grep tmpfile
tmpfile

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章