全部產品
Search
文件中心

Container Service for Kubernetes:使用OSS靜態儲存卷

更新時間:Sep 03, 2024

Object Storage Service(Object Storage Service)是阿里雲提供的海量、安全、低成本、高持久的雲端儲存體服務。您可以通過RRSA鑒權或者RAM使用者AccessKey鑒權的任一方式進行許可權配置並掛載。

前提條件

使用情境

阿里雲Object Storage Service服務(OSS)提供海量、安全、低成本、高可靠的雲端儲存體服務。OSS支援同時被多個Pod掛載。以下為OSS的使用情境:

  • 對磁碟I/O要求低。

  • 設定檔、圖片、小視頻等共用業務。

注意事項

  • OSS不支援動態建立PV,也不建議跨帳號使用。

  • Container ServiceKubernetes叢集升級會重啟kubelet,ossfs驅動跟隨一起重啟,導致OSS目錄不可用。此時使用OSS的Pod需要重建,可在YAML檔案中增加健全狀態檢查的配置,在容器內OSS目錄不可用時自動重啟Pod,重新掛載OSS。

    說明

    如果您使用的是v1.18.8.45及以上版本的csi-plugin和csi-provisioner外掛程式,則不會出現上述問題。

  • 若您在應用模板中配置了securityContext.fsgroup參數,kubelet在儲存卷掛載完成後會執行chmodchown操作,導致掛載時間延長。

    說明

    若您已配置securityContext.fsgroup參數,且需要減少掛載時間,請參見OSS儲存卷掛載時間延長

  • 通過ossfs進行ls等操作時,將發起HTTP請求到OSS擷取檔案的meta資訊,如果ls的目標目錄下檔案較多(超過100,000個,該數值與機器記憶體大小相關),ossfs將消耗大量系統記憶體,可能導致Pod發生OOM(Out Of Memory)事件。您可以通過掛載OSS Bucket的子目錄,或對檔案較多的目錄進行目錄分級解決此問題。

  • ossfs適用於並發讀情境,建議您配置PVC和PV的訪問模式為ReadOnlyMany。若需寫入資料,建議您通過OSS SDK、ossutil工具等方式實現資料讀寫分離。具體操作,請參見OSS儲存讀寫分離最佳實務

    說明

    配置OSS儲存卷的訪問模式為ReadWriteMany,通過ossfs進行寫操作時需要注意以下事項:

    • 在並發寫情境中,ossfs無法保證資料寫入的一致性。

    • 掛載狀態下,登入應用Pod或宿主機,在掛載路徑下刪除或變更檔案,都會直接刪除或變更OSS Bucket中對應的源檔案。您可以通過開啟OSS Bucket的版本控制,避免誤刪除重要資料,請參見版本控制概述

  • 當傳輸的檔案大於10 MB時,可以將檔案切成片段,分區上傳。分區上傳過程中斷後,如您不再需要這些Part,可通過以下方式刪除,以免產生額外儲存費用。

通過RRSA鑒權方式掛載

基於適用於服務賬戶的RAM角色(RAM Roles for Service Accounts,簡稱RRSA)功能,您可以在叢集內實現PV維度OpenAPI許可權隔離,從而實現雲資源存取權限的細粒度隔離,降低安全風險。更多RRSA的背景資訊,請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離

說明

RRSA功能目前僅支援1.26及以上版本的叢集,即ACK叢集基礎版、ACK叢集Pro版、ACK Serverless叢集基礎版和ACK Serverless叢集Pro版,且叢集使用的CSI組件版本為1.30.4及以上版本。若您在1.30.4版本之前使用了RRSA功能,請儘快參考【產品變更】CSI ossfs版本升級與掛載流程最佳化增加RAM角色授權配置。

(可選)步驟一:建立RAM角色

如果您在叢集中首次使用RRSA功能,需要按照以下步驟操作,如果您已經在叢集中使用過RRSA鑒權方式掛載OSS儲存卷,則可以跳過本步驟。

  1. Container Service管理主控台啟用RRSA功能。具體操作,請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離

  2. 為OSS儲存卷RRSA鑒權建立RAM角色,即使用RRSA功能扮演的指定角色。

    建立可信實體類型為身份供應商的RAM角色,以demo-role-for-rrsa為例。

    1. 使用阿里雲帳號登入RAM控制台

    2. 在左側導覽列,選擇身份管理 > 角色,然後在角色頁面,單擊建立角色

    3. 建立角色面板,選擇可信實體類型為身份供應商,然後單擊下一步

    4. 配置角色頁面,配置如下角色資訊後,單擊完成

      本樣本配置如下。

      配置項

      描述

      角色名稱

      demo-role-for-rrsa。

      備忘

      選填有關該角色的備忘資訊。

      身份供應商類型

      OIDC

      選擇身份供應商

      ack-rrsa-<cluster_id>。其中,<cluster_id>為您的叢集ID。

      限制條件

      • oidc:iss:保持預設。

      • oidc:aud:選擇sts.aliyuncs.com

      • oidc:sub:條件判定方式選擇StringEquals,此處需要填入system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs

步驟二:為demo-role-for-rrsa角色授權

  1. 建立如下OSS訪問的自訂權限原則。具體操作,請參見建立自訂權限原則

    以下權限原則中,請替換mybucket為您實際建立的Bucket名稱。

    • OSS唯讀權限原則

      展開查看OSS唯讀權限原則內容

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
    • OSS讀寫權限

      展開查看OSS讀寫權限策略內容

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
  2. (可選)若您使用KMS託管的指定CMK ID加密OSS Object,還需要為該RAM使用者配置KMS許可權。具體操作,請參見為OSS儲存卷加密

  3. 為demo-role-for-rrsa角色授權。具體操作,請參見為RAM角色授權

    說明

    您也可以通過修改RAM角色信任策略的方式使用已有的授權了OSS許可權的RAM角色。具體操作,請參見使用已存在的RAM角色並授權

步驟三:建立PV和PVC

  1. 配置PV使用RRSA鑒權。

    1. 使用以下內容,建立配置RRSA許可權認證的pv-rrsa.yaml樣本檔案。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-oss
        labels:    
          alicloud-pvname: pv-oss
      spec:
        capacity:
          storage: 5Gi
        accessModes:
          - ReadOnlyMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: ossplugin.csi.alibabacloud.com
          volumeHandle: pv-oss # 需要和PV名字一致。
          volumeAttributes:
            bucket: "oss"
            url: "oss-cn-hangzhou.aliyuncs.com"
            otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
            authType: "rrsa"
            roleName: "demo-role-for-rrsa"

      參數

      描述

      name

      PV的名稱。

      labels

      配置PV的標籤。

      storage

      OSS的可使用量。

      accessModes

      配置訪問模式,支援ReadOnlyMany和ReadWriteMany。

      選擇ReadOnlyMany時,ossfs將以唯讀模式掛載OSS Bucket。

      persistentVolumeReclaimPolicy

      PV回收策略。

      driver

      定義驅動類型。取值為ossplugin.csi.alibabacloud.com,表示使用OSS CSI外掛程式。

      volumeHandle

      配置PV的名稱。

      bucket

      需要掛載的OSS Bucket。

      url

      掛載OSS的接入網域名稱。

      • 掛載節點和Bucket相同地區時,請使用私網地址。

      • 掛載節點和Bucket不同地區時,請使用公網地址。

      • 禁止使用VPC網路。

      不同網域名稱訪問格式如下:

      • 內網訪問網域名稱格式:http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

      • 外網訪問網域名稱格式:http://oss-{{regionName}}.aliyuncs.comhttps://oss-{{regionName}}.aliyuncs.com

      otherOpts

      您可以為OSS儲存卷輸入定製化參數,格式為-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

      umask:用於更改ossfs讀檔案的許可權。例如,設定umask=022後,ossfs檔案的許可權都會變更為755。通過SDK、OSS控制台等其他方式上傳的檔案在ossfs中預設許可權均為640。因此,建議您在讀寫分離情境中配置umask許可權。

      max_stat_cache_size:用於指定檔案中繼資料的緩衝空間,可緩衝多少個檔案的中繼資料。中繼資料快取可加快ls操作速度。但若通過其他例如OSS、SDK、控制台、ossutil等方式修改檔案,可能會導致中繼資料未被及時更新。

      allow_other:賦予電腦上其他使用者訪問掛載目錄的許可權,但不包含目錄內的檔案。

      更多選擇性參數,請參見ossfs掛載選項說明

      path

      表示掛載時相對Bucket根檔案的目錄結構,預設為/(v1.14.8.32-c77e277b-aliyun及之後版本支援)。

      ossfs 1.91版本前,該路徑需在OSS側預先建立,詳情請參考ossfs 1.91及以上版本新功能介紹及效能壓測

      authType

      配置為rrsa,聲明使用RRSA方式鑒權。

      roleName

      配置為以上(可選)步驟一:建立RAM角色中已建立或修改的RAM角色名稱。若您需要為不同的PV配置不同的許可權,可以建立不同的RAM角色,在PV中配置不同的roleName。

      說明

      如果您需要在RRSA鑒權方式中使用指定的ARNs或ServiceAccount,相關操作,請參見如何在RRSA鑒權方式中使用指定的ARNs或ServiceAccount?

    2. 執行以下命令,在PV中配置RRSA進行許可權認證。

      kubectl create -f pv-rrsa.yaml
  2. 執行以下命令建立靜態卷PVC。

    kubectl create -f pvc-oss.yaml

    以下為建立靜態卷PVC的pvc-oss.yaml樣本檔案。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-oss
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-oss

    參數

    說明

    name

    PVC的名稱。

    accessModes

    配置訪問模式,支援ReadOnlyMany和ReadWriteMany。

    選擇ReadOnlyMany時,ossfs將以唯讀模式掛載OSS Bucket。

    storage

    聲明應用使用量,不能大於儲存卷的總量。

    alicloud-pvname

    通過標籤關聯PV,與PV標籤保持一致。

    在叢集管理頁左側導覽列選擇儲存 > 儲存聲明,在儲存聲明頁面可以看到建立的PVC。

步驟四:建立應用

建立一個名為oss-static的應用並掛載PVC。

執行以下命令建立oss-static.yaml

kubectl create -f oss-static.yaml

以下為建立應用oss-static.yaml樣本檔案。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: oss-static
  labels:
    app: nginx
spec:
  replicas: 2
  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
  • livenessProbe:配置健全狀態檢查。更多資訊,請參見OSS儲存卷概述

  • mountPath:OSS在容器中掛載的位置。

  • claimName:PVC的名稱,用於綁定PVC。

通過RAM使用者AccessKey鑒權方式掛載

通過控制台方式使用

步驟一:建立具有OSS存取權限的RAM使用者並擷取AccessKey

  1. 建立RAM使用者。具體操作,請參見建立RAM使用者

  2. 建立如下OSS訪問的自訂權限原則。具體操作,請參見建立自訂權限原則

    以下權限原則中,請替換mybucket為您實際建立的Bucket名稱。

    • OSS唯讀權限原則

      展開查看OSS唯讀權限原則內容

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
    • OSS讀寫權限

      展開查看OSS讀寫權限策略內容

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
  3. (可選)若您使用KMS託管的指定CMK ID加密OSS Object,還需要為該RAM使用者配置KMS許可權。具體操作,請參見為OSS儲存卷加密

  4. 為RAM使用者添加OSS許可權。具體操作,請參見為RAM使用者授權

  5. 為RAM使用者建立AccessKey。具體操作,請參見擷取AccessKey

重要
  • 通過控制台方式僅支援使用AccessKey鑒權,如果OSS儲存卷引用的AccessKey失效,或授權被取消,已經掛載該卷的應用將無權訪問OSS並報許可權錯誤。為修複許可權錯誤,您需要修改secret中的AccessKey資訊並重新掛載,此操作將導致應用重啟。AccessKey吊銷後ossfs重掛載流程,請參見OSS儲存掛載許可權問題中情境4的解決方案。

  • 如您有定期輪轉AccessKey的需求,請參見通過RRSA鑒權方式掛載

步驟二:建立PV

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存卷

  3. 儲存卷頁面,單擊右上方的建立

  4. 建立儲存卷對話方塊中配置參數。

    配置項

    說明

    儲存卷類型

    支援雲端硬碟、NAS、OSS三種雲端儲存類型。本文中選擇為OSS

    名稱

    建立的資料卷的名稱。資料卷名在叢集內必須唯一。本例為pv-oss

    總量

    所建立儲存卷的容量。

    訪問模式

    支援ReadOnlyMany和ReadWriteMany,預設為ReadOnlyMany。

    選擇ReadOnlyMany時,ossfs將以唯讀模式掛載OSS Bucket。

    訪問認證

    選擇訪問OSS所需的保密字典,即步驟一擷取的AccessKey ID和AccessKey Secret。

    • 選擇已有保密字典:選擇命名空間保密字典

    • 建立保密字典:配置命名空間名稱AccessKey IDAccessKey Secret

    選擇性參數

    您可以為OSS儲存卷輸入定製化參數,格式為-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

    umask:用於更改ossfs讀檔案的許可權。例如,設定umask=022後,ossfs檔案的許可權都會變更為755。通過SDK、OSS控制台等其他方式上傳的檔案在ossfs中預設許可權均為640。因此,建議您在讀寫分離情境中配置umask許可權。

    max_stat_cache_size:用於指定檔案中繼資料的緩衝空間,可緩衝多少個檔案的中繼資料。中繼資料快取可加快ls操作速度。但若通過其他例如OSS、SDK、控制台、ossutil等方式修改檔案,可能會導致中繼資料未被及時更新。

    allow_other:賦予電腦上其他使用者訪問掛載目錄的許可權,但不包含目錄內的檔案。

    更多選擇性參數,請參見ossfs掛載選項說明

    Bucket ID

    您要使用的OSS Bucket的名稱。單擊選擇 Bucket,在彈出的對話方塊中選擇所需的bucket並單擊選擇

    訪問網域名稱

    您可以參考以下情況選擇需要的訪問網域名稱。

    • 如果Bucket和ECS執行個體位於不同地區(Region),請選擇公網網域名稱

    • 如果Bucket和ECS執行個體位於相同地區,請選擇私網網域名稱

      說明

      通過私網訪問時,預設使用HTTP協議。若您需要指定網路傳輸協議為HTTPS,可使用kubectl命令列方式建立靜態PV。

    標籤

    為該儲存卷添加標籤。

  5. 參數配置完成後,單擊建立

步驟三:建立PVC

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存聲明

  2. 儲存聲明頁面,單擊右上方的建立

  3. 建立儲存聲明頁面中,填寫介面參數。

    配置項

    說明

    儲存宣告類型

    支援雲端硬碟、NAS、OSS三種雲端儲存類型。本文選擇OSS

    名稱

    建立的資料卷的名稱,資料卷名稱在叢集內必須唯一。

    分配模式

    選擇已有儲存卷。

    說明

    若未建立儲存卷,您可以設定分配模式建立儲存卷,配置建立儲存卷參數。具體操作,請參見步驟二:建立PV

    已有儲存卷

    單擊選擇已有儲存類,在目標儲存卷右側操作列,單擊選擇,選擇儲存卷。

    總量

    所建立儲存卷的容量。

    說明

    所建立的儲存卷容量不能超過儲存空間容量。

  4. 單擊建立

    建立成功後可以在列表中看到csi-oss-pvc,並且已綁定相應的儲存卷。

步驟四:建立應用

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  2. 無狀態頁面,單擊使用鏡像建立

  3. 配置建立應用的參數資訊。

    以下主要為您介紹資料卷的配置。關於其他參數的描述,請參見建立無狀態工作負載Deployment

    ACK資料卷支援配置本機存放區和雲端儲存。

    • 本機存放區:支援主機目錄(HostPath)、配置項(ConfigMap)、保密字典(Secret)和臨時目錄,將對應的掛載源掛載到容器路徑中。更多資訊請參見volumes

    • 雲端儲存:支援雲端儲存類型。

    本例中配置了一個OSS類型的資料卷,將該OSS儲存卷掛載到容器中/tmp 路徑下。 資料卷

  4. 所有的資訊都配置完成後,單擊建立

    建立成功後,您就可以正常使用資料卷。

通過kubectl方式使用

步驟一:建立具有OSS存取權限的RAM使用者並擷取AccessKey

  1. 建立RAM使用者。具體操作,請參見建立RAM使用者

  2. 建立如下OSS訪問的自訂權限原則。具體操作,請參見建立自訂權限原則

    以下權限原則中,請替換mybucket為您實際建立的Bucket名稱。

    • OSS唯讀權限原則

      展開查看OSS唯讀權限原則內容

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
    • OSS讀寫權限

      展開查看OSS讀寫權限策略內容

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
  3. (可選)若您使用KMS託管的指定CMK ID加密OSS Object,還需要為該RAM使用者配置KMS許可權。具體操作,請參見為OSS儲存卷加密

  4. 為RAM使用者添加OSS許可權。具體操作,請參見為RAM使用者授權

  5. 為RAM使用者建立AccessKey。具體操作,請參見擷取AccessKey

步驟二:建立PV和PVC

您可以通過以下方式建立PV和PVC。

  • 方式一:使用Secret建立PV及PVC

    通過Secret為CSI組件提供AccessKey資訊。

    重要
    • 使用該方式掛載時,如果OSS儲存卷引用的AccessKey被撤銷或取消授權,已經掛載了儲存卷的應用將無權訪問OSS並報許可權錯誤。您需要修改Secret中的AccessKey資訊並重新掛載,此操作將導致應用重啟。AccessKey吊銷後ossfs重掛載流程,請參見OSS儲存掛載許可權問題中情境4的解決方案。

    • 如果有定期輪轉AccessKey的需求建議您通過RRSA鑒權方式掛載

  • 方式二:配置PV及PVC的AccessKey

    直接在PV中配置AccessKey資訊。

    重要
    • 使用該方式掛載時,如果OSS儲存卷引用的AccessKey被撤銷或取消授權,已經掛載了儲存卷的應用將無權訪問OSS並報許可權錯誤。您需要重建PV中的AccessKey資訊並重新部署應用。

    • 如果有定期輪轉AccessKey的需求建議您通過RRSA鑒權方式掛載

方式一:使用Secret建立靜態卷PV及PVC

  1. 建立Secret。

    以下為通過Secret配置AccessKey資訊的YAML樣本檔案。

    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
      namespace: default
    stringData:
      akId: <yourAccessKey ID>
      akSecret: <yourAccessKey Secret>
    說明

    建立Secret選擇的Namespace需要和應用所在的Namespace一致。

    本樣本中,akIdakSecret需要替換為步驟一擷取的AccessKey ID和AccessKey Secret。

  2. 執行以下命令建立靜態卷PV。

    kubectl create -f pv-oss.yaml

    以下為建立靜態卷PV的pv-oss.yaml樣本檔案。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-oss
      labels:
        alicloud-pvname: pv-oss
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: pv-oss # 需要和PV名字一致。
        nodePublishSecretRef:
          name: oss-secret
          namespace: default
        volumeAttributes:
          bucket: "oss"
          url: "oss-cn-hangzhou.aliyuncs.com"
          otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
          path: "/"

    參數

    描述

    name

    PV的名稱。

    labels

    配置PV的標籤。

    storage

    OSS的可使用量。

    accessModes

    配置訪問模式,支援ReadOnlyMany和ReadWriteMany。

    選擇ReadOnlyMany時,ossfs將以唯讀模式掛載OSS Bucket。

    persistentVolumeReclaimPolicy

    PV回收策略。

    driver

    定義驅動類型。取值為ossplugin.csi.alibabacloud.com,表示使用OSS CSI外掛程式。

    nodePublishSecretRef

    定義掛載PV時通過Secret對象來擷取AccessKey資訊。

    volumeHandle

    配置PV的名稱。

    bucket

    需要掛載的OSS Bucket。

    url

    掛載OSS的接入網域名稱。

    • 掛載節點和Bucket相同地區時,請使用私網地址。

    • 掛載節點和Bucket不同地區時,請使用公網地址。

    • 禁止使用VPC網路。

    不同網域名稱訪問格式如下:

    • 內網訪問網域名稱格式:http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

    • 外網訪問網域名稱格式:http://oss-{{regionName}}.aliyuncs.comhttps://oss-{{regionName}}.aliyuncs.com

    otherOpts

    您可以為OSS儲存卷輸入定製化參數,格式為-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

    umask:用於更改ossfs讀檔案的許可權。例如,設定umask=022後,ossfs檔案的許可權都會變更為755。通過SDK、OSS控制台等其他方式上傳的檔案在ossfs中預設許可權均為640。因此,建議您在讀寫分離情境中配置umask許可權。

    max_stat_cache_size:用於指定檔案中繼資料的緩衝空間,可緩衝多少個檔案的中繼資料。中繼資料快取可加快ls操作速度。但若通過其他例如OSS、SDK、控制台、ossutil等方式修改檔案,可能會導致中繼資料未被及時更新。

    allow_other:賦予電腦上其他使用者訪問掛載目錄的許可權,但不包含目錄內的檔案。

    更多選擇性參數,請參見ossfs掛載選項說明

    path

    表示掛載時相對Bucket根檔案的目錄結構,預設為/(v1.14.8.32-c77e277b-aliyun及之後版本支援)。

    ossfs 1.91版本前,該路徑需在OSS側預先建立,詳情請參考ossfs 1.91及以上版本新功能介紹及效能壓測

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存卷

      儲存卷頁面,可查看已建立的PV。

  3. 執行以下命令建立靜態卷PVC。

    kubectl create -f pvc-oss.yaml

    以下為建立靜態卷PVC的pvc-oss.yaml樣本檔案。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-oss
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-oss

    參數

    說明

    name

    PVC的名稱。

    accessModes

    配置訪問模式,支援ReadOnlyMany和ReadWriteMany。

    選擇ReadOnlyMany時,ossfs將以唯讀模式掛載OSS Bucket。

    storage

    聲明應用使用量,不能大於儲存卷的總量。

    alicloud-pvname

    通過標籤關聯PV,與PV標籤保持一致。

    在叢集管理頁左側導覽列選擇儲存 > 儲存聲明,在儲存聲明頁面可以看到建立的PVC。

方式二:配置PV及PVC的AccessKey

  1. 執行以下命令,直接在PV中配置AccessKey資訊。

    kubectl create -f pv-accesskey.yaml

    以下為配置AccessKey資訊的pv-accesskey.yaml樣本檔案。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-oss
      labels:
        alicloud-pvname: pv-oss
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: pv-oss # 需要和PV名字一致。
        volumeAttributes:
          bucket: "oss"
          url: "oss-cn-hangzhou.aliyuncs.com"
          otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
          akId: "***"
          akSecret: "***"

    參數

    描述

    name

    PV的名稱。

    labels

    配置PV的標籤。

    storage

    OSS的可使用量。

    accessModes

    配置訪問模式,支援ReadOnlyMany和ReadWriteMany。

    選擇ReadOnlyMany時,ossfs將以唯讀模式掛載OSS Bucket。

    persistentVolumeReclaimPolicy

    PV回收策略。

    driver

    定義驅動類型。取值為ossplugin.csi.alibabacloud.com,表示使用OSS CSI外掛程式。

    volumeHandle

    配置PV的名稱。

    bucket

    需要掛載的OSS Bucket。

    url

    掛載OSS的接入網域名稱。

    • 掛載節點和Bucket相同地區時,請使用私網地址。

    • 掛載節點和Bucket不同地區時,請使用公網地址。

    • 禁止使用VPC網路。

    不同網域名稱訪問格式如下:

    • 內網訪問網域名稱格式:http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

    • 外網訪問網域名稱格式:http://oss-{{regionName}}.aliyuncs.comhttps://oss-{{regionName}}.aliyuncs.com

    otherOpts

    您可以為OSS儲存卷輸入定製化參數,格式為-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

    umask:用於更改ossfs讀檔案的許可權。例如,設定umask=022後,ossfs檔案的許可權都會變更為755。通過SDK、OSS控制台等其他方式上傳的檔案在ossfs中預設許可權均為640。因此,建議您在讀寫分離情境中配置umask許可權。

    max_stat_cache_size:用於指定檔案中繼資料的緩衝空間,可緩衝多少個檔案的中繼資料。中繼資料快取可加快ls操作速度。但若通過其他例如OSS、SDK、控制台、ossutil等方式修改檔案,可能會導致中繼資料未被及時更新。

    allow_other:賦予電腦上其他使用者訪問掛載目錄的許可權,但不包含目錄內的檔案。

    更多選擇性參數,請參見ossfs掛載選項說明

    path

    表示掛載時相對Bucket根檔案的目錄結構,預設為/(v1.14.8.32-c77e277b-aliyun及之後版本支援)。

    ossfs 1.91版本前,該路徑需在OSS側預先建立,詳情請參考ossfs 1.91及以上版本新功能介紹及效能壓測

    akId

    配置為上一步擷取的AccessKey ID。

    akSecret

    配置為上一步擷取的AccessKey Secret。

  2. 執行以下命令建立靜態卷PVC。

    kubectl create -f pvc-oss.yaml

    以下為建立靜態卷PVC的pvc-oss.yaml樣本檔案。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-oss
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-oss

    參數

    說明

    name

    PVC的名稱。

    accessModes

    配置訪問模式,支援ReadOnlyMany和ReadWriteMany。

    選擇ReadOnlyMany時,ossfs將以唯讀模式掛載OSS Bucket。

    storage

    聲明應用使用量,不能大於儲存卷的總量。

    alicloud-pvname

    通過標籤關聯PV,與PV標籤保持一致。

    在叢集管理頁左側導覽列選擇儲存 > 儲存聲明,在儲存聲明頁面可以看到建立的PVC。

步驟三:建立應用

建立一個名為oss-static的應用並掛載PVC。

執行以下命令建立oss-static.yaml

kubectl create -f oss-static.yaml

以下為建立應用oss-static.yaml樣本檔案。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: oss-static
  labels:
    app: nginx
spec:
  replicas: 2
  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
  • livenessProbe:配置健全狀態檢查。更多資訊,請參見OSS儲存卷概述

  • mountPath:OSS在容器中掛載的位置。

  • claimName:PVC的名稱,用於綁定PVC。

驗證OSS的持久化儲存和共用儲存

  1. 查看部署oss-static應用的Pod和OSS檔案。

    1. 執行以下命令,查看部署的oss-static應用所在Pod的名稱。

      kubectl get pod

      預期輸出:

      NAME                             READY   STATUS    RESTARTS   AGE
      oss-static-66fbb85b67-d****      1/1     Running   0          1h
      oss-static-66fbb85b67-l****      1/1     Running   0          1h
    2. 建立tmpfile檔案。

      • 若以ReadWriteMany方式掛載,執行以下命令,在/data路徑下建立tmpfile檔案。

        kubectl exec oss-static-66fbb85b67-d**** -- touch /data/tmpfile
        kubectl exec oss-static-66fbb85b67-l**** -- touch /data/tmpfile
      • 若以ReadOnlyMany方式掛載,可通過OSS控制台cp(上傳檔案)等方式上傳tmpfile檔案至OSS Bucket對應路徑。

  2. 執行以下命令,查看oss-static-66fbb85b67-d****中/data路徑,以及oss-static-66fbb85b67-l****中/data1下的檔案。

    kubectl exec oss-static-66fbb85b67-d**** -- ls /data | grep tmpfile
    kubectl exec oss-static-66fbb85b67-l**** -- ls /data1 | grep tmpfile

    預期輸出:

    tmpfile

    預期輸出表明,兩個Pod的掛載路徑下均存在此檔案,說明兩個Pod共用資料。

    說明

    若您無法看到預期輸出,請確認CSI組件版本為v1.20.7及以上版本。更多資訊,請參見csi-plugin

  3. 執行以下命令,刪除名稱為oss-static-66fbb85b67-d****的Pod。

    kubectl delete pod oss-static-66fbb85b67-d****

    預期輸出:

    pod "oss-static-66fbb85b67-d****" deleted
  4. 驗證Pod刪除後,儲存空間裡建立的檔案是否還存在。

    1. 執行以下命令,查看重建的Pod名稱。

      kubectl get pod

      預期輸出:

      NAME                             READY   STATUS    RESTARTS   AGE
      oss-static-66fbb85b67-l****      1/1     Running   0          1h
      oss-static-66fbb85b67-z****      1/1     Running   0          40s
    2. 執行以下命令,查看/data路徑下的檔案。

      kubectl exec oss-static-66fbb85b67-z**** -- ls /data | grep tmpfile

      預期輸出:

      tmpfile

      預期輸出表明,temfile檔案仍然存在,說明OSS的資料可持久化儲存。