本文說明如何建立及使用憑證,透過 GDC 上的 VM 執行階段存取 Cloud Storage。Cloud Storage 外掛程式可讓您使用容器化資料匯入工具 (CDI),從 Cloud Storage 值區匯入 VM 映像檔。然後,您可以在 Cloud Storage 中從這些映像檔建立虛擬磁碟,並將其附加至叢集中執行的 VM。在 GDC 上執行 VM Runtime 的叢集會自動啟用 CDI。
事前準備
如要完成這份文件,您必須存取下列資源:
- 存取 Google Distributed Cloud 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 以上版本的叢集。您可以使用任何可執行工作負載的叢集類型。 如有需要,請在 Compute Engine 上試用 Google Distributed Cloud,或參閱叢集建立總覽。 - 您要用於 Cloud Storage 存取的服務帳戶和服務帳戶金鑰。如有需要,請設定可存取 Cloud Storage 值區的服務帳戶。
憑證總覽
如要存取 Cloud Storage,請使用提供儲存空間值區憑證的服務帳戶。服務帳戶需要不同權限,才能成功存取儲存空間值區:
- 公開儲存空間值區:您可以使用服務帳戶進行自我識別,但不需要任何特定權限。
- 私人儲存空間 bucket:儲存空間帳戶必須具備儲存空間 bucket 的檢視者或管理員權限。
您可以透過兩種方式向 CDI 提供服務帳戶憑證:
- 在叢集中的節點上設定 Google 應用程式預設憑證 (ADC)。詳情請參閱「為內部部署環境或其他雲端服務供應商設定 ADC」。
- 提供包含服務帳戶金鑰的 Secret,以存取 Cloud Storage。本文其餘部分將說明如何建立服務帳戶金鑰和密碼。
建立 Secret
您可以使用在資料磁碟區命名空間中建立的 Secret,將服務帳戶金鑰傳遞至 Kubernetes。Secret 的 data
區段包含 creds-gcp.json
的項目。這個值是服務帳戶金鑰檔案的 Base64 編碼資料。CLI 會為您建立這項 Base64 編碼資料。如果您使用 YAML 資訊清單建立 Secret,請先建立服務帳戶金鑰檔案內容的 base64 雜湊。
CLI
使用
kubectl
建立 Secret:kubectl create secret generic SECRET_NAME \ --from-file=creds-gcp.json=SERVICE_ACCOUNT_KEY_PATH \ --namespace NAMESPACE_NAME
替換下列值:
SECRET_NAME
:密鑰的名稱。SERVICE_ACCOUNT_KEY_PATH
:服務帳戶金鑰檔案的路徑。NAMESPACE_NAME
:Secret 的命名空間。- 在 CDI 執行的叢集中建立 Secret,並與資料磁碟區位於相同命名空間。在 GDC 上執行 VM Runtime 的叢集中,系統會自動啟用 CDI。
資訊清單
在所選編輯器中建立
Secret
資訊清單,例如 my-secret.yaml:nano my-secret.yaml
複製並貼上下列 YAML 資訊清單:
apiVersion: v1 data: creds-gcp.json: BASE64_SERVICE_ACCOUNT_FILE kind: Secret metadata: name: SECRET_NAME namespace: NAMESPACE_NAME type: Opaque
替換下列值:
BASE64_SERVICE_ACCOUNT_FILE
:服務帳戶金鑰檔案內容的 base64 雜湊值。SECRET_NAME
:密鑰的名稱。NAMESPACE_NAME
:Secret 的命名空間。- 在 CDI 執行的叢集中建立 Secret,並與資料磁碟區位於相同命名空間。在 GDC 上執行 VM Runtime 的叢集中,系統會自動啟用 CDI。
在編輯器中儲存並關閉 Secret 資訊清單。
使用
kubectl
套用 Secret 資訊清單:kubectl apply -f my-secret.yaml
轉送現有密鑰
您可以建立 SecretForwarder
,轉送現有密鑰供使用,不必建立密鑰。SecretForwarder
支援在同一叢集內或跨叢集轉送密鑰,例如從管理員叢集轉送至使用者叢集。
如要使用目標 Secret 存取 Cloud Storage,來源 Secret 的 data
區段必須有 creds-gcp.json
金鑰。
相同叢集
以下範例 SecretForwarder
資訊清單會轉送同一叢集中的密鑰:
apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
name: cdi-gcs
namespace: default
spec:
inClusterTargetSecrets:
name: gcs-sa
namespaces:
- default
sourceSecret:
name: gke-connect
namespace: anthos-creds
這個範例會執行下列操作:
- 在
default
命名空間中建立名為cdi-gcs
的SecretForwarder
。 - 將
anthos-creds
命名空間中名為gke-connect
的密鑰轉送至default
命名空間中名為gcs-sa
的新密鑰。 - 在同一個叢集中建立新密鑰。
如要在同一個叢集中轉送 Secret,請完成下列步驟:
在您選擇的編輯器中建立
SecretForwarder
資訊清單,例如 my-forwarded-secret.yaml:nano my-forwarded-secret.yaml
複製並貼上下列 YAML 資訊清單:
apiVersion: baremetal.cluster.gke.io/v1 kind: SecretForwarder metadata: name: SECRET_FORWARDER_NAME namespace: NAMESPACE_NAME spec: inClusterTargetSecrets: name: TARGET_SECRET_NAME namespaces: - TARGET_NAMESPACE_NAME sourceSecret: name: SOURCE_SECRET_NAME namespace: SOURCE_NAMESPACE_NAME
替換下列值:
SECRET_FORWARDER_NAME
:SecretForwarder 的名稱。NAMESPACE_NAME
:SecretForwarder 的命名空間。TARGET_SECRET_NAME
:新 Secret 的名稱。TARGET_NAMESPACE_NAME
:新密鑰的命名空間。- 在 CDI 執行的叢集中建立 Secret,並與資料磁碟區位於相同命名空間。在 GDC 上執行 VM Runtime 的叢集中,系統會自動啟用 CDI。
SOURCE_SECRET_NAME
:要轉送的來源 Secret 名稱。SOURCE_NAMESPACE_NAME
:要轉送的來源 Secret 命名空間。
在編輯器中儲存並關閉
SecretForwarder
資訊清單。使用
kubectl
套用SecretForwarder
資訊清單:kubectl apply -f my-forwarded-secret.yaml
跨叢集
以下範例 SecretForwarder
資訊清單會轉送叢集間的密鑰:
apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
name: cdi-gcs
namespace: cluster-user1
spec:
RemoteClusterTargetSecrets:
name: gcs-sa
namespaces:
- default
sourceSecret:
name: gke-connect
namespace: anthos-creds
這個範例會執行下列操作:
- 在
cluster-user1
命名空間中建立名為cdi-gcs
的SecretForwarder
。 - 將
anthos-creds
命名空間中名為gke-connect
的密鑰轉送至default
命名空間中名為gcs-sa
的新密鑰。 - 在名為
user1
的叢集中建立新密鑰。
如要在同一個叢集中轉送 Secret,請完成下列步驟:
在您選擇的編輯器中建立
SecretForwarder
資訊清單,例如 my-forwarded-secret.yaml:nano my-forwarded-secret.yaml
複製並貼上下列 YAML 資訊清單:
apiVersion: baremetal.cluster.gke.io/v1 kind: SecretForwarder metadata: name: SECRET_FORWARDER_NAME namespace: NAMESPACE_NAME spec: RemoteClusterTargetSecrets: name: TARGET_SECRET_NAME namespaces: - TARGET_NAMESPACE_NAME sourceSecret: name: SOURCE_SECRET_NAME namespace: SOURCE_NAMESPACE_NAME
替換下列值:
SECRET_FORWARDER_NAME
:遠端叢集中的 SecretForwarder 名稱。NAMESPACE_NAME
:遠端叢集中 SecretForwarder 的命名空間。TARGET_SECRET_NAME
:遠端叢集中新 Secret 的名稱。TARGET_NAMESPACE_NAME
:遠端叢集中新 Secret 的命名空間。- 在 CDI 執行的叢集中建立 Secret,並與資料磁碟區位於相同命名空間。在 GDC 上執行 VM Runtime 的叢集中,系統會自動啟用 CDI。
SOURCE_SECRET_NAME
:要轉送的來源 Secret 名稱。SOURCE_NAMESPACE_NAME
:要轉送的來源 Secret 命名空間。
在編輯器中儲存並關閉
SecretForwarder
資訊清單。使用管理叢集的
KUBECONFIG
,在管理叢集中套用SecretForwarder
資訊清單:kubectl
kubectl apply -f my-forwarded-secret.yaml
使用密鑰匯入圖片
如要在建立虛擬磁碟和 VM 時,使用 Secret 從 Cloud Storage 匯入映像檔,請完成下列步驟:
在您選擇的編輯器中建立資訊清單,定義
VirtualMachineDisk
和VirtualMachine
,例如 my-vm.yaml:nano my-vm.yaml
複製並貼上下列 YAML 定義:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: VM_NAME-boot-dv spec: size: 20Gi source: gcs: url: IMAGE_URL secretRef: SECRET_NAME --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv
替換下列值:
VM_NAME
:您的 VM 名稱。IMAGE_URL
:磁碟映像檔 Cloud Storage 的網址,例如gs://my-images-bucket/disk.qcow2
。SECRET_NAME
- 密鑰名稱。
在編輯器中儲存並關閉資訊清單。
使用
kubectl
建立 VM 和磁碟:kubectl apply -f my-vm.yaml