管理虛擬機器

本頁說明如何管理 Google Distributed Cloud connected 部署作業中的虛擬機器,這些虛擬機器執行 Google Distributed Cloud 的 VM 執行階段。完成本頁的步驟前,請務必先熟悉 GDC 上的 VM 執行階段。如需支援的客層作業系統清單,請參閱 GDC 上 VM 執行階段的已驗證客層作業系統

如要瞭解虛擬機器如何做為 Distributed Cloud connected 平台的重要元件,請參閱「擴充 GKE Enterprise,管理內部部署邊緣 VM」。

Distributed Cloud 連線叢集支援虛擬機器 Webhook。這項功能可讓 Distributed Cloud 連線驗證向本機 Kubernetes API 伺服器發出的使用者要求。遭拒的要求會產生詳細資訊,說明遭拒原因。

設定 Symcloud Storage

Google Distributed Cloud connected 使用 Rakuten Symcloud Storage 做為儲存空間解決方案。Symcloud Storage 是第三方解決方案,可做為每個 Distributed Cloud connected 節點上的本機儲存空間抽象層,並讓其他 Distributed Cloud connected 節點上執行的工作負載使用本機儲存空間。

Symcloud Storage 是從 Google Cloud Marketplace 部署,並受其中所述條款約束。Google 僅提供有限的支援,協助您搭配使用 Symcloud Storage 與 Distributed Cloud Connected,並可能會聘僱第三方供應商提供協助。Distributed Cloud 連線軟體更新包含 Symcloud Storage 的軟體更新。

請按照下列步驟設定 Google Distributed Cloud connected 叢集,為虛擬機器啟用 Symcloud Storage。詳情請參閱「在 Distributed Cloud 連線節點上安裝 Symcloud Storage」。

  1. 使用下列指令建立 robin-admin 命名空間:

    kubectl create ns robin-admin
    
  2. 取得 Symcloud Storage 授權檔案,並使用下列指令套用至叢集:

    kubectl apply LICENSE_FILE
    
  3. 執行下列指令,確認 Symcloud Storage 正常運作:

    kubectl describe robincluster
    

    指令會傳回類似以下內容的輸出結果:

     Name:         robin
     Namespace:
     Labels:       app.kubernetes.io/instance=robin
                   app.kubernetes.io/managed-by=robin.io
                   app.kubernetes.io/name=robin
     Annotations:  <none>
     API Version:  manage.robin.io/v1
     Kind:         RobinCluster
     Metadata:
       
     Spec:
       
     Status:
       
       Phase:             Ready
       
    
  4. 將下列設定套用至叢集,建立 robin-block-immediate 儲存空間類別:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: robin-block-immediate
    parameters:
      faultdomain: host
      replication: "3"
      blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    
  5. 將下列設定套用至叢集,建立 robin-snapshotclass 磁碟區快照類別:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: robin-snapshotclass
      labels:
        app.kubernetes.io/instance: robin
        app.kubernetes.io/managed-by: robin.io
        app.kubernetes.io/name: robin
      annotations:
        snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete
    
  6. 使用下列內容修改 robin-block-immediate 儲存空間類別的 storageprofile,然後套用至叢集:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: robin-block-immediate
    spec:
      claimPropertySets:
        accessModes:
          ReadWriteMany
      volumeMode: Block

安裝 virtctl 管理工具

您需要 virtctl 用戶端工具,才能管理 Distributed Cloud connected 叢集中的虛擬機器。如要安裝這項工具,請完成下列步驟:

  1. virtctl 用戶端工具安裝為 kubectl 外掛程式:

    export VERSION=GDC_SO_VERSION
    gcloud storage cp gs://anthos-baremetal-release/virtctl/${VERSION}/linux-amd64/virtctl ./virtctl
    sudo mv ./virtctl /usr/local/bin/virtctl
    cd /usr/local/bin
    sudo ln -s virtctl kubectl-virt
    sudo chmod a+x virtctl
    cd -

    GDC_SO_VERSION 替換為 Distributed Cloud 軟體專屬的目標版本。

  2. 確認已安裝 virt 外掛程式:

    kubectl plugin list

    如果外掛程式安裝成功,指令輸出內容會將 kubectl-virt 列為外掛程式之一。

建立 VM 映像檔的 Cloud Storage bucket

完成本節中的步驟,為虛擬機器映像檔建立 Cloud Storage bucket。儲存空間會使用 Workload Identity Federation,將 Kubernetes 服務帳戶繫結至對應的 Google Cloud 服務帳戶,以存取儲存空間;換句話說,Kubernetes 服務帳戶會模擬 Google Cloud服務帳戶。如果您已有映像檔存放區,請略過本節。

如要降低多叢集機群中身分相同的風險,請按照本節步驟操作時,遵循「機群 Workload Identity 聯盟最佳做法」的指引。

  1. 完成「建立值區」一文中的步驟,建立值區。

  2. 建立服務帳戶來存取 bucket: Google Cloud

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud iam service-accounts create ${GSA_NAME}

    更改下列內容:

    • GSA_NAME:這個 Google Cloud 服務帳戶的名稱。
    • GSA_PROJECT_ID:託管目標 Google Cloud 服務帳戶的Google Cloud 專案 ID。
  3. 授予 Google Cloud 服務帳戶存取 bucket 的權限:

    export BUCKET_PROJECT_ID=BUCKET_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_PROJECT_ID}-vm-images \
       --member="serviceAccount:${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/storage.objectViewer" \
       --project=${BUCKET_PROJECT_ID}

    更改下列內容:

    • GSA_NAME:目標 Google Cloud 服務帳戶的名稱。
    • BUCKET_PROJECT_ID:託管值區的 Google Cloud 專案 ID。
    • GSA_PROJECT_ID:託管目標 Google Cloud 服務帳戶的Google Cloud 專案 ID。
  4. 在目標虛擬機器的命名空間中建立 Kubernetes 服務帳戶,以便繫結至您的 Google Cloud 服務帳戶:

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export VM_NAMESPACE=NAMESPACE
    export KSA_NAME=KSA_NAME
    export GSA_EMAIL=${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com
    kubectl create serviceaccount ${KSA_NAME} -n ${VM_NAMESPACE}
    kubectl annotate serviceaccount ${KSA_NAME} gsaEmail=${GSA_EMAIL} -n ${VM_NAMESPACE}

    更改下列內容:

    • GSA_PROJECT_ID:託管目標 Google Cloud 服務帳戶的Google Cloud 專案 ID。
    • NAMESPACE:目標虛擬機器的命名空間。
    • KSA_NAME:這個 Kubernetes 服務帳戶的有意義名稱。
    • GSA_NAME:對應 Google Cloud 服務帳戶的名稱。
  5. 找出叢集的workload identity pool 和身分識別提供者名稱:

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"

    更改下列內容:

    • MEMBERSHIP_ID:叢集的艦隊成員名稱。這通常是叢集名稱。
    • FLEET_PROJECT_ID:機群主機 Google Cloud 專案的 ID。

    指令會傳回類似以下內容的輸出結果:

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    

    在輸出中,記下下列值:

  6. 將 Kubernetes 服務帳戶繫結至 Google Cloud 服務帳戶,以設定模擬:

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    export KSA_NAME=KSA_NAME
    export VM_NAMESPACE=NAMESPACE
    export WI_POOL=WORKLOAD_IDENTITY_POOL
    gcloud iam service-accounts add-iam-policy-binding ${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com \
       --project=${GSA_PROJECT_ID} \
       --role=roles/iam.workloadIdentityUser \
       --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]"
       --condition="IAM_CONDITION"
       --condition-from-file="IAM_CONDITION_FILE"

    更改下列內容:

    • GSA_PROJECT_ID:託管目標 Google Cloud 服務帳戶的Google Cloud 專案 ID。
    • GSA_NAME:對應 Google Cloud 服務帳戶的名稱。
    • KSA_NAME:目標 Kubernetes 服務帳戶的名稱。
    • NAMESPACE:目標虛擬機器的命名空間。
    • WORKLOAD_IDENTITY_POOL:叢集工作負載身分集區的名稱。
    • IAM_CONDITION:選用;指定要使用的 IAM 條件,限制存取機群內的特定叢集。如果省略或設為 None,系統不會套用任何 IAM 條件。
    • IAM_CONDITION_FILE:選用;指定包含 IAM 條件的檔案,用於限制機群內特定叢集的存取權。如果省略,除非指定 --condition 旗標並設為 None 以外的值,否則不會套用任何 IAM 條件。
  7. 將圖片儲存在值區中。

您也可以使用舊版方法,也就是透過 Google 服務帳戶的有效金鑰產生的密碼。詳情請參閱「為虛擬機器映像檔建立 Cloud Storage bucket」。

使用 IAM 條件限制對 Bucket 的存取權

IAM 條件可讓您指定機群中哪些叢集可以存取值區。如果未指定 IAM 條件,機群中所有命名空間內具有相同 Kubernetes 服務帳戶的叢集,都能存取該儲存空間,造成身分相同性風險。如未指定 IAM 條件,您也可以改用舊版存取機制,該機制會使用 Google 服務帳戶有效金鑰產生的密碼。以下範例說明如何設定及套用 IAM 條件,限制對 Bucket 的存取權:

  1. 建立 IAM 條件檔案:

    cat <<EOF > iam_condition.yaml
    > expression: request.auth.claims.google.providerId == '$IDENTITY_PROVIDER'
    title: allow_only_this_cluster
    > EOF
  2. 將 GSA 繫結至 KSA 時,請套用 IAM 條件檔案。在 GSA Google Cloud 專案中執行下列指令:

    gcloud iam service-accounts add-iam-policy-binding "${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
      --project="${GSA_PROJECT_ID}" \
      --role=roles/iam.workloadIdentityUser \
      --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]" \
      --condition-from-file=iam_condition.yaml

從虛擬機器映像檔建立虛擬機器磁碟

完成本節中的步驟,從虛擬機器映像檔建立虛擬機器磁碟。

從儲存在 Cloud Storage 中的映像檔建立磁碟

將下列設定套用至叢集,從儲存在 Cloud Storage bucket 中的虛擬機器建立虛擬機器磁碟:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   source:
     gcs:
       url: gs://${BUCKET_PROJECT_ID}-vm-images/IMAGE_FILE_PATH
       serviceAccount: KSA_NAME
   size: DISK_SIZE
   storageClassName: robin-block-immediate

更改下列內容:

  • DISK_NAME:這個虛擬機器磁碟的名稱。
  • NAMESPACE:目標虛擬機器的命名空間。
  • IMAGE_FILE_PATH:虛擬機器映像檔的完整路徑和名稱。 在控制台中對圖片按一下滑鼠右鍵,然後選取「複製 gsutil URI」即可取得這個路徑。 Google Cloud
  • KSA_NAME:用於下載您先前建立的虛擬機器映像檔的 Kubernetes 服務帳戶。
  • DISK_SIZE:目標磁碟大小。這個值必須大於虛擬機器映像檔的 virtual-size 值。您可以使用 qemu-img info DISK_SIZE 指令找出這個值。

如未指定 storageClassName 值,系統會使用 VMRuntime 資源中指定的預設值。

從第三方服務儲存的映像檔建立磁碟

您也可以使用 httphttpsS3 或映像檔登錄檔,儲存虛擬機器映像檔。如果儲存空間服務需要憑證才能存取,請將憑證轉換為密鑰,然後使用 secretRef 欄位指定該密鑰。例如:

source:
    http/s3/registry:
       url: 
       secretRef: "SECRET_NAME" # optional

SECRET_NAME 替換為密鑰名稱。

詳情請參閱「HTTP/S3/GCS/Registry 來源」。

建立空白磁碟

將下列設定套用至叢集,建立空白虛擬機器磁碟:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   size: DISK_SIZE
   storageClassName: robin-block-immediate

更改下列內容:

  • DISK_NAME:這個虛擬機器磁碟的名稱。
  • NAMESPACE:目標命名空間。
  • DISK_SIZE:以 GiB 為單位的所需磁碟大小。這個值必須大於虛擬機器映像檔的 virtual-size 值。您可以使用 qemu-img info DISK_SIZE 指令找出這個值。

如未指定 storageClassName 值,系統會使用 VMRuntime 資源中指定的預設值。

設定虛擬網路

按照「網路」一節的步驟,為虛擬機器設定虛擬網路。

建立虛擬機器

完成本節中的步驟,在 Distributed Cloud 連線伺服器部署作業中建立虛擬機器。本節的指示僅為範例,旨在說明不同情境的設定。如要進一步瞭解如何設定虛擬機器,請參閱「使用 GDC 上的 VM 執行階段,建立具有特定 CPU 和記憶體資源的 VM」。

使用 Google Cloud 控制台建立虛擬機器

如要使用 Google Cloud 控制台建立虛擬機器,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。

    前往「Clusters」(叢集) 頁面

  2. 選取目標 Google Cloud 專案。

  3. (選用) 如果尚未登入目標叢集,請登入:

    1. 按一下左側導覽窗格中的「叢集」

    2. 在「Anthos Managed Clusters」(Anthos 代管叢集) 清單中,按一下目標叢集。

    3. 在右側的資訊窗格中,按一下「登入」

    4. 在隨即顯示的彈出式對話方塊中,選取偏好的驗證方式,輸入憑證,然後按一下「登入」

  4. 前往「Virtual Machines」(虛擬機器) 頁面。

    前往虛擬機器

  5. 點選「建立」。

  6. 在「Basics」(基本) 部分,執行下列操作:

    1. 在「Name」(名稱) 欄位中,輸入虛擬機器的有意義名稱。

    2. 在「選取叢集」欄位中,選取虛擬機器的目標叢集。

    3. 在「命名空間」欄位中,選取目標命名空間。

    4. 在「OS Type」(作業系統類型) 欄位中,選取目標作業系統。

    5. (選用) 如要為這個虛擬機器的設定新增一或多個標籤,請按一下「新增標籤」

  7. 在「機器設定」部分,執行下列任一操作:

    • 如要為這部虛擬機器指定 vCPU 數量和記憶體容量,請選取「自訂設定」,然後輸入目標值,再按一下「下一步」

    • 如要為這部虛擬機器使用預先決定的 vCPU 數量和記憶體容量,請選取「標準設定」,然後從「機器類型」下拉式清單中選取機器設定,再按一下「下一步」

  8. 在「儲存空間」專區中,執行下列任一操作:

    • 如要為這部虛擬機器建立新的虛擬磁碟,請選取「新增磁碟」,然後在「名稱」欄位中輸入有意義的名稱、「GiB」欄位中輸入大小 (以 GB 為單位),以及「映像檔」欄位中輸入網址。

    • 如要為這部虛擬機器使用現有的虛擬磁碟,請選取「選取現有磁碟」,然後從「選取磁碟」下拉式清單中選取目標磁碟映像檔。

    • 使用「唯讀」和「自動刪除」核取方塊,指定磁碟是否為唯讀,以及是否要在刪除這個虛擬機器時自動刪除磁碟。

    • 在「Driver」(驅動程式) 下拉式清單中指定虛擬磁碟驅動程式。

    • 如要為這部虛擬機器新增其他磁碟,請在「Additional disks」(其他磁碟) 區段中,按一下「ADD A DISK」(新增磁碟)

    • 點按「下一步」

  9. 在「網路」部分,執行下列操作:

    1. 在「Default network interface」(預設網路介面) 子區段的「Interface name」(介面名稱) 欄位中,指定這個虛擬機器的主要網路介面名稱。

    2. 從「網路類型」下拉式清單中選取對應的網路類型。

    3. 使用「允許外部存取」核取方塊,指定是否允許外部存取這個網路介面。如果啟用這個選項,您必須在「Exposed ports」(公開連接埠) 欄位中,輸入以半形逗號分隔的連接埠清單,以便對外公開。

    4. 如要為這個虛擬機器新增一或多個次要網路介面,請按一下「新增網路介面」

    5. 點按「下一步」

  10. 在「進階選項」部分,使用「更新後自動重新啟動」核取方塊,指定在目標叢集上的 Distributed Cloud 連線軟體更新後,是否要重新啟動這個虛擬機器。

  11. 在「韌體」部分,執行下列操作:

    1. 在「系統啟動載入程式類型」欄位中,選取目標韌體類型。如果選取 UEFI 韌體,可以勾選「安全啟動」核取方塊,啟用安全啟動功能。

    2. 在「序號」欄位中,為這部虛擬機器指定序號。

    3. 在「UUID」UUID欄位中,指定這部虛擬機器的通用唯一識別碼 (UUID)。

  12. 在「Cloud-init」部分,執行下列操作:

    • 在「網路資料 Secret」欄位中指定網路資料 Secret 值。

    • 在「使用者資料密鑰」欄位中指定使用者資料密鑰值。

  13. 按一下「CREATE VM」(建立 VM) 建立虛擬機器。

從 YAML 檔案建立虛擬機器

如要從 YAML 設定檔建立虛擬機器,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。

    前往「Clusters」(叢集) 頁面

  2. 選取目標 Google Cloud 專案。

  3. (選用) 如果尚未登入目標叢集,請登入:

    1. 按一下左側導覽窗格中的「叢集」

    2. 在「Anthos Managed Clusters」(Anthos 代管叢集) 清單中,按一下目標叢集。

    3. 在右側的資訊窗格中,按一下「登入」

    4. 在隨即顯示的彈出式對話方塊中,選取偏好的驗證方式,輸入憑證,然後按一下「登入」

  4. 前往「Virtual Machines」(虛擬機器) 頁面。

    前往虛擬機器

  5. 按一下「使用 YAML 建立」

  6. 在「選取叢集」欄位中,選取虛擬機器的目標叢集。

  7. 將 YAML 格式的虛擬機器設定貼到 YAML 欄位。

  8. 點選「建立」。

從可開機的磁碟映像檔建立虛擬機器

如要從可開機的磁碟映像檔建立虛擬機器,請對叢集套用下列設定:

kind: VirtualMachine
metadata:
  name: my-virtual-machine
  namespace: my-vm-namespace
spec:
  osType: Linux/Windows
  guestEnvironment: {} // comment out this line to enable guest environment for access management
  compute:
    cpu:
      vcpus: 6
    memory:
      capacity: 8Gi
  interfaces:
      - name: eth0
        networkName: network-410
        ipAddresses:
        - 10.223.237.10/25
  disks:
    - virtualMachineDiskName: my-boot-disk
      boot: true
    - virtualMachineDiskName: my-data-disk

更改下列內容:

  • DISK_NAME:這個虛擬機器磁碟的名稱。
  • NAMESPACE:目標命名空間。

從 ISO 光碟映像檔建立虛擬機器

如要從 ISO 光碟映像檔建立虛擬機器,請完成「在 Google Distributed Cloud 中使用 ISO 映像檔建立 Windows VM」一文中的步驟。

建立支援 GPU 的虛擬機器

完成本頁所述步驟,建立符合業務需求的虛擬機器,然後完成「設定虛擬機器以使用 GPU 資源」中的步驟。

存取虛擬機器

完成本節中的步驟,即可存取在 Distributed Cloud 連線伺服器部署作業中執行的虛擬機器。

取得存取憑證

如果您還沒有存取虛擬機器的憑證,請完成本節中的步驟,使用 Linux 訪客環境功能取得憑證。

  1. 將下列設定套用至叢集,為目標虛擬機器啟用 Linux 訪客環境:

    kind: VirtualMachine
    metadata:
     name: my-virtual-machine
     namespace: my-vm-namespace
    spec:
     osType: Linux
     guestEnvironment: // enabled by default; disable with guestEnvironment: {}
       accessManagement:
        enable: true
  2. 使用下列指令產生包含 SSH 金鑰組的 id_rsa.pub 檔案:

    ssh-keygen -t rsa
  3. 將下列設定套用至叢集,建立 VirtualMachineAccessRequest 資源:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachineAccessRequest
    metadata:
     name: RESOURCE_NAME
     namespace: NAMESPACE
    spec:
      vm: VM_NAME
      user: USER_NAME
      ssh:
        key: RSA_KEY
        ttl: 2h

更改下列內容:

  • RESOURCE_NAME:這個虛擬機器存取要求資源的說明名稱。
  • NAMESPACE:目標命名空間。
  • VM_NAME:目標虛擬機器的名稱。
  • USER_NAME:要授予存取權的使用者名稱。
  • RSA_KEY:您在上一個步驟中產生的 id_rsa.pub 檔案內容。
  1. 請使用下列指令檢查存取要求狀態:

    kubectl get vmar
    

    如果指令傳回 Configured 狀態,請繼續下一個步驟。

  2. 透過 SSH 或遠端桌面存取虛擬機器:

    • 如果虛擬機器已連上區域網路,可以直接存取。
    • 如果虛擬機器連線至 Pod 網路,您必須建立負載平衡器服務,才能存取所需連接埠。

啟動、重新啟動或停止虛擬機器

使用下列指令啟動、重新啟動或停止虛擬機器:

  • 啟動虛擬機器: kubectl virt start vmVM_NAME-nNAMESPACE
  • 重新啟動虛擬機器: kubectl virt restart vmVM_NAME-nNAMESPACE
  • 停止虛擬機器: kubectl virt stop vmVM_NAME-nNAMESPACE

更改下列內容:

  • VM_NAME:目標虛擬機器的名稱。
  • NAMESPACE:目標命名空間。

使用 Google Cloud 控制台啟動或停止虛擬機器

  1. 前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。

    前往「Clusters」(叢集) 頁面

  2. 選取目標 Google Cloud 專案。

  3. (選用) 如果尚未登入目標叢集,請登入:

    1. 按一下左側導覽窗格中的「叢集」

    2. 在「Anthos Managed Clusters」(Anthos 代管叢集) 清單中,按一下目標叢集。

    3. 在右側的資訊窗格中,按一下「登入」

    4. 在隨即顯示的對話方塊中,選取偏好的驗證方式,輸入憑證,然後按一下「登入」

  4. 前往「Virtual Machines」(虛擬機器) 頁面。

    前往虛擬機器

  5. 在虛擬機器清單中,勾選目標虛擬機器的核取方塊。

  6. 按一下頁面頂端的「開始」或「停止」

使用 Google Cloud 控制台查看虛擬機器的狀態

  1. 前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。

    前往「Clusters」(叢集) 頁面

  2. 選取目標 Google Cloud 專案。

  3. (選用) 如果尚未登入目標叢集,請登入:

    1. 按一下左側導覽窗格中的「叢集」

    2. 在「Anthos Managed Clusters」(Anthos 代管叢集) 清單中,按一下目標叢集。

    3. 在右側的資訊窗格中,按一下「登入」

    4. 在隨即顯示的彈出式對話方塊中,選取偏好的驗證方式,輸入憑證,然後按一下「登入」

  4. 前往「Virtual Machines」(虛擬機器) 頁面。

    前往虛擬機器

  5. 按一下目標虛擬機器。

  6. 在隨即顯示的頁面中,按一下「詳細資料」、「事件」和「YAML」分頁標籤,即可查看這部虛擬機器的相關資訊。

修改虛擬機器

如要修改虛擬機器,請先刪除再使用更新的設定重新建立。

使用 Google Cloud 控制台刪除虛擬機器

  1. 前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。

    前往「Clusters」(叢集) 頁面

  2. 選取目標 Google Cloud 專案。

  3. (選用) 如果尚未登入目標叢集,請登入:

    1. 按一下左側導覽窗格中的「叢集」

    2. 在「Anthos Managed Clusters」(Anthos 代管叢集) 清單中,按一下目標叢集。

    3. 在右側的資訊窗格中,按一下「登入」

    4. 在隨即顯示的對話方塊中,選取偏好的驗證方式,輸入憑證,然後按一下「登入」

  4. 前往「Virtual Machines」(虛擬機器) 頁面。

    前往虛擬機器

  5. 在虛擬機器清單中,勾選目標虛擬機器的核取方塊。

  6. 按一下頁面頂端的「刪除」

  7. 在隨即顯示的確認對話方塊中,輸入虛擬機器的名稱,然後按一下「刪除」

備份虛擬機器

本節說明如何設定環境來備份虛擬機器工作負載,以及如何管理備份。如要啟用這項功能,請與 Google 代表聯絡。

必要條件

  1. 如果尚未建立 robin-block-immediate 自訂資源,請建立類型為 StorageClass 的自訂資源,內容如下,並將其套用至叢集:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: robin-block-immediate
     annotations:
       storageclass.kubernetes.io/is-default-class: "true"
    parameters:
     faultdomain: host
     replication: "3"
     blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
  2. 如果尚未建立自訂資源,請建立類型為 robin-snapshotclass 的自訂資源,VolumeSnapshotClass內容如下,並將其套用至叢集:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
     name: robin-snapshotclass
     labels:
       app.kubernetes.io/instance: robin
       app.kubernetes.io/managed-by: robin.io
       app.kubernetes.io/name: robin
     annotations:
       snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete

建立線上備份存放區

線上備份儲存庫是與 S3 相容的線上儲存空間位置,用於存放虛擬機器備份檔。此外,備份保存庫也會儲存備份、備份方案和還原方案的記錄,並做為還原虛擬機器備份的目標位置。

請完成下列步驟,為虛擬機器建立線上備份存放區:

  1. 建立值區一文所述,建立 Cloud Storage 值區。

  2. 使用下列指令建立服務帳戶和金鑰,以便存取值區:

    export PROJECT_ID=$(gcloud config get-value project)
    export SVC_ACCOUNT=backup-access
    gcloud iam service-accounts create $SVC_ACCOUNT
    gcloud projects add-iam-policy-binding $PROJECT_ID \ 
       --member="serviceAccount:${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/backupdr.cloudStorageOperator"
    gcloud storage hmac create  ${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com > hmac_temp_key_file
    awk 'NR==1{print "ACCESS_ID=" $NF} NR==2{print "SECRET=" $NF}' < hmac_temp_key_file > hmac_key_file
  3. 使用下列指令,設定用來存取備份值區的密碼:

    source ./hmac_key_file
    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=$SECRET \
       --from-literal=access-key-id=$ACCESS_ID -n NAMESPACE
    

    更改下列內容:

    • SECRET_NAME:這個密鑰的說明名稱。
    • NAMESPACE:目標命名空間。
  4. 建立 BackupRepository 資源,並將下列設定套用至叢集:

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: "REPOSITORY_NAME"
    spec:
      secretReference:
        namespace: NAMESPACE
        name: gcs-hmac-secret
      endpoint: "https://storage.googleapis.com"
      type: "S3"
      s3Options:
        bucket: "BUCKET_NAME"
        region: "REGION"
        forcePathStyle: true
      importPolicy: "ReadWrite"
    # Force attachment for convenience.
    force: true

    更改下列內容:

    • REPOSITORY_NAME:存放區的說明名稱。
    • BUCKET_NAME:備份 bucket 的名稱。
    • NAMESPACE:目標命名空間。
    • REGION:建立目標 Distributed Cloud 叢集的 Google Cloud 區域。
  5. 使用下列指令,確認叢集是否可以存取備份儲存庫:

    kubectl get BackupRepository
    

建立本機備份存放區

本機備份存放區是與 S3 相容的儲存空間位置,用於存放虛擬機器備份檔,位於 Distributed Cloud connected 叢集本機。本機備份存放區的功能與線上備份存放區完全相同。

  1. 產生 AES256 加密金鑰,用於應用程式層級的設定加密:

    openssl rand -base64 32
    

    這項指令會輸出 base64 編碼的隨機 256 位元金鑰。例如:

    aBcD_eFgH1iJkLmN0pQrStUvWxFyZgAhIjKlMnOpQ=
    
  2. 將金鑰雙重編碼,做為 BackupRepository 資源的 YAML 設定檔中的酬載:

    echo -n "AES_KEY" | base64
    

    AES_KEY 替換為您在上一個步驟中產生的 base64 編碼 AES256 金鑰。將這個金鑰儲存在本機檔案中。

  3. 使用下列指令設定密碼,以存取備份存放區:

    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=ENCODED_AES_KEY \
       --namespace NAMESPACE
    

    更改下列內容:

    • ENCODED_AES_KEY:您在上一個步驟中產生的雙重編碼 AES256 金鑰。
    • SECRET_NAME:這個密鑰的說明名稱。
    • NAMESPACE:目標命名空間。
  4. 將下列設定套用至叢集,即可設定 BackupRepository

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: REPOSITORY_NAME
    spec:
      force: true
      importPolicy: ReadWrite
      localOptions:
        encryptionKey:
          name: SECRET_NAME
          namespace: NAMESPACE
      type: Local
  5. 使用下列指令,確認叢集是否可以存取備份儲存庫:

    kubectl get BackupRepository
    

    更改下列內容:

    • REPOSITORY_NAME:存放區的說明名稱。
    • SECRET_NAME:您在上一個步驟中建立的 Kubernetes Secret 名稱。
    • NAMESPACE:您建立 Kubernetes Secret 的命名空間。

建立備份方案

備份方案會定義虛擬機器備份的自動排程。建立 VirtualMachineBackupPlan 資源,其中包含下列內容,並套用至叢集:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachineBackupPlan
metadata:
  name: BACKUP_PLAN_NAME
  namespace: NAMESPACE
spec:
  backupConfig:
    backupRepository: REPOSITORY_NAME
    backupScope:
      selectedVirtualMachines:
      - resourceName: VM_NAME
    volumeStrategy: LocalSnapshotOnly
  backupSchedule:
    cronSchedule: "CRON_SCHEDULE"
    paused: PAUSED
  retentionPolicy:
    backupDeleteLockDays: PLAN_LOCK_LENGTH
    backupRetainDays: 4
    locked: RETENTION_POLICY_LOCKED
  numBackupsToRetain: BACKUPS_RETAINED

更改下列內容:

  • BACKUP_PLAN_NAME:備份方案的說明名稱。
  • NAMESPACE:目標命名空間的名稱。
  • REPOSITORY_NAME:目標備份存放區。
  • CRON_SCHEDULEcron - 執行備份的標準時間表。備份間隔下限為 10 分鐘。
  • PAUSED:指定是否暫停這項備份方案。有效值為 truefalse
  • VM_NAME:指定要透過這項備份計畫備份的虛擬機器工作負載。每個備份方案可指定多個虛擬機器資源。
  • * BACKUP_LOCK_LENGTH:指定備份建立後的天數,在此期間無法刪除備份。
  • * BACKUP_RETENTION_LENGTH:指定保留這項備份的天數。保留期限結束後,備份就會遭到刪除。如果省略此屬性,系統會預設為 4
  • * RETENTION_POLICY_LOCKED:指定是否鎖定這項備份方案的保留政策。有效值為 truefalse
  • * BACKUPS_RETAINED/var>:指定要在這個備份方案中保留的備份數量。達到這個門檻後,系統會依從舊到新的順序刪除備份。

列出現有備份方案

如要列出現有備份方案,請使用下列指令:

kubectl get VirtualMachineBackupPlans -A

指令會傳回類似以下內容的輸出結果:

NAMESPACE      NAME                                LASTBACKUPTIME   LASTBACKUPSTATE   NEXTBACKUPTIME   PAUSED
vm-workloads   bkp-template-vm-windows-vm-local
vm-workloads   sched-snapshotonly-bkp-plan-10min                                                       false

手動備份虛擬機器

如要手動備份虛擬機器,請完成本節的步驟。

  1. 在目標虛擬機器所在的命名空間中建立 VirtualMachineBackupPlanTemplate 資源,方法是將下列設定套用至叢集:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupPlanTemplate
    metadata:
      name: TEMPLATE_NAME
      namespace: NAMESPACE
    spec:
      backupRepository: REPOSITORY_NAME

    更改下列內容:

    • TEMPLATE_NAME:這個備份範本的說明名稱。
    • REPOSITORY_NAME:目標備份存放區的名稱。
    • NAMESPACE:目標命名空間。
  2. 建立具有下列設定的 VirtualMachineBackupRequest 資源,並套用至叢集,即可觸發備份作業:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupRequest
    metadata:
      name: BACKUP_REQUEST_NAME
      namespace: NAMESPACE
    spec:
      vmBackupPlanTemplate: TEMPLATE_NAME
      virtualMachine: VM_NAME
      vmBackupName: BACKUP_NAME

    更改下列內容:

    • BACKUP_REQUEST_NAME:這項備份要求的說明名稱。
    • TEMPLATE_NAME:您在上一個步驟中建立的備份範本名稱。
    • NAMESPACE:目標命名空間的名稱。
    • VM_NAME:目標虛擬機器的名稱。
    • BACKUP_NAME:這個備份作業的說明名稱。
  3. 使用下列指令驗證備份的完整性:

    kubectl get vmbackup BACKUP_NAME -n NAMESPACE
    

    更改下列內容:

    • BACKUP_NAME:目標備份的名稱。
    • NAMESPACE:目標命名空間。

    指令會傳回類似以下內容的輸出結果:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackup
    metadata:
      creationTimestamp: "2024-04-09T17:57:44Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-backup-finalizer
      generation: 1
      name: vmt13-backup-0409-2
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Backup
        name: vmt13-backup-0409-2
        uid: 0ee0b92c-1e27-48cc-8f8f-5606ea925e88
      resourceVersion: "36192759"
      uid: e471f8c7-637c-485f-acda-108017a5638f
    spec:
      backupConfig:
        backupRepository: default
        backupScope:
          selectedVirtualMachines:
          - resourceName: vm-t13
        volumeStrategy: Portable
      vmBackupPlan: MyVmPlan-vm-vm-t13-portable
    status:
      backedUpVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      backedUpVirtualMachines:
      - vm-t13
      backup: vmt13-backup-0409-2
      backupStatus:
        clusterMetadata:
          k8sVersion: "1.28"
        completeTime: "2024-04-09T18:07:36Z"
        createTime: "2024-04-09T17:57:44Z"
        jobCreated: true
        resourceCount: 849
        sizeBytes: 1948672
        state: Succeeded
    

列出虛擬機器備份

如要查看現有的虛擬機器備份,請使用下列指令:

kubectl get VirtualMachineBackups -A

指令會傳回類似以下內容的輸出結果:

NAMESPACE      NAME        STATE       CREATETIME
vm-workloads   vm-backup   Succeeded   2025-04-08T04:37:32Z

從備份還原虛擬機器

完成本節中的步驟,從備份還原虛擬機器。

  1. 建立 VirtualMachineRestoreRequest 資源並套用至叢集,即可觸發還原程序,設定如下:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestoreRequest
    metadata:
      name: restore-req
      namespace: NAMESPACE
    spec:
      vmBackup: BACKUP_NAME
      restoreName: RESTORE_NAME
      restoredResourceName: RESTORED_VM_NAME
      restoredResourceDescription: RESTORE_DESCRIPTION

    更改下列內容:

    • BACKUP_NAME:目標備份的名稱。
    • RESTORE_NAME:這項還原作業的說明名稱。
    • NAMESPACE:目標命名空間。
    • RESTORED_VM_NAME:還原期間為虛擬機器指定的名稱。 這個名稱不得與叢集上已有的任何虛擬機器衝突。
    • RESTORE_DESCRIPTION:這項還原作業的說明。
  2. 使用下列指令檢查還原作業的進度:

    kubectl get virtualmachinerestores.vm.cluster.gke.io RESTORE_NAME -n NAMESPACE
    

    更改下列內容:

    • RESTORE_NAME:目標還原作業的名稱。
    • NAMESPACE:目標命名空間。

    指令會傳回類似以下內容的輸出結果:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestore
    metadata:
      creationTimestamp: "2024-04-09T18:09:51Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-restore-finalizer
      generation: 1
      name: vmt13-restore-0409-2-1
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Restore
        name: vmt13-restore-0409-2-1
        uid: 4ce1ca83-eba0-4cc3-bad3-af6cf9185d7d
      resourceVersion: "36194596"
      uid: aba50b59-e18d-4687-ad11-47baa45478b4
    spec:
      targetVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      targetVirtualMachines:
      - vm-t13
      vmBackup: vmt13-backup-0409-2
    status:
      restore: vmt13-restore-0409-2-1
      restoreStatus:
        completeTime: "2024-04-09T18:10:00Z"
        jobCreated: true
        resourcesRestoredCount: 5
        restoredVolumesCount: 2
        startTime: "2024-04-09T18:09:51Z"
        state: Succeeded
        stateReason: restore is successful
    

查看還原作業

如要查看目前為止啟動的還原作業,請使用下列指令:

kubectl get VirtualMachineRestore.vm.cluster.gke.io -A

指令會傳回類似以下內容的輸出結果:

NAMESPACE      NAME        STARTTIME              RESTORE     STATE
vm-workloads   restore-1   2025-04-08T04:41:04Z   restore-1   Succeeded

刪除虛擬機器備份

如要刪除虛擬機器備份,請建立具有下列設定的 VirtualMachineDeleteBackupRequest 資源,並將其套用至叢集:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDeleteBackupRequest
    metadata:
      name: vmdbr
      namespace: BACKUP_NAME
    spec:
      vmBackup: NAMESPACE
   

更改下列內容:

  • NAMESPACE:目標命名空間的名稱。
  • BACKUP_NAME:目標備份的名稱。

查看「AppArmor」沙箱稽核記錄

Distributed Cloud Connected 會自動使用 audit-mode 中的 AppArmor 政策,將虛擬機器工作負載放入沙箱。發生政策違規時,系統會發出稽核記錄項目。 例如:

{
  "jsonPayload": {
    "_SOURCE_REALTIME_TIMESTAMP": "1734596844149104",
    "SYSLOG_TIMESTAMP": "Dec 19 08:27:24 ",
    "MESSAGE": "type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"",
    "PRIORITY": "6",
    ...
    "SYSLOG_RAW": "<14>Dec 19 08:27:24 audisp-syslog: type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"\n",
    "SYSLOG_IDENTIFIER": "audisp-syslog",
    "_GID": "0",
  },
  "timestamp": "2024-12-19T08:27:24.149109Z",
  "labels": {
    "gke.googleapis.com/log_type": "system"
  },
  "receiveTimestamp": "2024-12-19T08:27:24.721842807Z"
  ...
  ...
}

後續步驟