在 Compute Engine VM 中建立混合式叢集

本頁說明如何使用在 Compute Engine 上執行的虛擬機器 (VM),以高可用性 (HA) 模式設定混合式叢集。

您可以快速試用 Google Distributed Cloud 軟體,不必準備任何硬體。完成本頁的步驟後,您就能取得在 Compute Engine 上執行的測試環境。

如要在 Compute Engine VM 上試用 Google Distributed Cloud 軟體,請完成下列步驟:

  1. 在 Compute Engine 中建立六部 VM
  2. 在所有具備 L2 連線的 VM 之間建立 vxlan 網路
  3. 安裝 Google Distributed Cloud 的必要條件
  4. 部署混合式叢集
  5. 驗證叢集

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 請記下專案 ID,因為您需要這個 ID 來設定環境變數,以供本頁面的指令碼和指令使用。如果您選取現有專案,請確認您是專案擁有者或編輯者。
  7. 在 Linux 工作站上,請務必安裝最新版 Google Cloud CLI,這是與 Google Cloud互動的指令列工具。如果您已安裝 gcloud CLI,請執行下列指令更新元件:
    gcloud components update

    視 gcloud CLI 的安裝方式而定,您可能會看到下列訊息:

    "You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation. You can run the following command to achieve the same result for this installation:"

    按照操作說明複製並貼上指令,更新元件。

  8. 本指南中的步驟取自 anthos-samples 存放區的安裝指令碼。如要進一步瞭解如何自訂這個指令碼,使其適用於某些常見的變化版本,請參閱常見問題部分

    在 Compute Engine 中建立六部 VM

    請完成下列步驟,建立下列 VM:

    • 管理員工作站專用的 VM。管理員工作站:用於託管指令列介面 (CLI) 工具和設定檔,以便在安裝期間佈建叢集。另外,這類工作站也會託管其他 CLI 工具,方便您在安裝後與已佈建的叢集互動。管理員工作站將可透過 SSH 存取叢集中的所有其他節點。
    • 三個 VM,分別對應執行 Google Distributed Cloud 控制層所需的三個控制層節點。
    • 兩個 VM,分別對應在 Google Distributed Cloud 叢集上執行工作負載所需的兩個工作站節點。
    1. 設定環境變數:

      export PROJECT_ID=PROJECT_ID
      export ZONE=ZONE
      export CLUSTER_NAME=CLUSTER_NAME
      export BMCTL_VERSION=1.32.100-gke.106
      

      對於 ZONE,您可以使用 us-central1-a 或任何其他 Compute Engine 區域

    2. 執行下列指令,使用 Google 帳戶登入並將專案設為預設專案:

      gcloud auth login
      gcloud config set project $PROJECT_ID
      gcloud config set compute/zone $ZONE
      
    3. 建立 baremetal-gcr 服務帳戶和金鑰:

      gcloud iam service-accounts create baremetal-gcr
      
      gcloud iam service-accounts keys create bm-gcr.json \
          --iam-account=baremetal-gcr@"${PROJECT_ID}".iam.gserviceaccount.com
    4. 啟用 Google Cloud API 和服務:

      gcloud services enable \
          anthos.googleapis.com \
          anthosaudit.googleapis.com \
          anthosgke.googleapis.com \
          cloudresourcemanager.googleapis.com \
          connectgateway.googleapis.com \
          container.googleapis.com \
          gkeconnect.googleapis.com \
          gkehub.googleapis.com \
          serviceusage.googleapis.com \
          stackdriver.googleapis.com \
          monitoring.googleapis.com \
          logging.googleapis.com \
          opsconfigmonitoring.googleapis.com \
          compute.googleapis.com \
          gkeonprem.googleapis.com \
          iam.googleapis.com \
          kubernetesmetadata.googleapis.com
    5. 授予 baremetal-gcr 服務帳戶額外權限,避免需要多個服務帳戶才能使用不同 API 和服務:

      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/gkehub.connect" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/gkehub.admin" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/logging.logWriter" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.dashboardEditor" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/stackdriver.resourceMetadata.writer" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/opsconfigmonitoring.resourceMetadata.writer" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
          --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
          --role="roles/kubernetesmetadata.publisher" \
          --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.viewer" \
        --no-user-output-enabled
      
      gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/serviceusage.serviceUsageViewer" \
        --no-user-output-enabled
    6. 建立本頁所有指令所需的變數和陣列:

      MACHINE_TYPE=n1-standard-8
      VM_PREFIX=abm
      VM_WS=$VM_PREFIX-ws
      VM_CP1=$VM_PREFIX-cp1
      VM_CP2=$VM_PREFIX-cp2
      VM_CP3=$VM_PREFIX-cp3
      VM_W1=$VM_PREFIX-w1
      VM_W2=$VM_PREFIX-w2
      declare -a VMs=("$VM_WS" "$VM_CP1" "$VM_CP2" "$VM_CP3" "$VM_W1" "$VM_W2")
      declare -a IPs=()
    7. 使用下列迴圈建立六部 VM:

      for vm in "${VMs[@]}"
      do
          gcloud compute instances create "$vm" \
            --image-family=ubuntu-2004-lts --image-project=ubuntu-os-cloud \
            --zone="${ZONE}" \
            --boot-disk-size 200G \
            --boot-disk-type pd-ssd \
            --can-ip-forward \
            --network default \
            --tags http-server,https-server \
            --min-cpu-platform "Intel Haswell" \
            --enable-nested-virtualization \
            --scopes cloud-platform \
            --machine-type "$MACHINE_TYPE" \
            --metadata "cluster_id=${CLUSTER_NAME},bmctl_version=${BMCTL_VERSION}"
          IP=$(gcloud compute instances describe "$vm" --zone "${ZONE}" \
               --format='get(networkInterfaces[0].networkIP)')
          IPs+=("$IP")
      done

      這個指令會建立下列名稱的 VM 執行個體:

      • abm-ws:管理員工作站的 VM。
      • abm-cp1abm-cp2abm-cp3:控制平面節點的 VM。
      • abm-w1abm-w2:執行工作負載的節點 VM。
    8. 使用下列迴圈,確認所有 VM 都已準備好使用 SSH:

      for vm in "${VMs[@]}"
      do
          while ! gcloud compute ssh root@"$vm" --zone "${ZONE}" --command "printf 'SSH to $vm succeeded\n'"
          do
              printf "Trying to SSH into %s failed. Sleeping for 5 seconds. zzzZZzzZZ" "$vm"
              sleep  5
          done
      done

    建立 vxlan 網路,在 VM 之間提供第 2 層連線

    使用 Linux 的標準 vxlan 功能建立網路,將所有 VM 連線至 L2 連線。

    下列指令包含兩個迴圈,會執行下列動作:

    1. 使用 SSH 存取每個 VM。
    2. 更新及安裝所需套件。
    3. 執行必要指令,使用 vxlan 設定網路。

      i=2 # We start from 10.200.0.2/24
      for vm in "${VMs[@]}"
      do
          gcloud compute ssh root@"$vm" --zone "${ZONE}" << EOF
              apt-get -qq update > /dev/null
              apt-get -qq install -y jq > /dev/null
              set -x
              ip link add vxlan0 type vxlan id 42 dev ens4 dstport 0
              current_ip=\$(ip --json a show dev ens4 | jq '.[0].addr_info[0].local' -r)
              printf "VM IP address is: \$current_ip"
              for ip in ${IPs[@]}; do
                  if [ "\$ip" != "\$current_ip" ]; then
                      bridge fdb append to 00:00:00:00:00:00 dst \$ip dev vxlan0
                  fi
              done
              ip addr add 10.200.0.$i/24 dev vxlan0
              ip link set up dev vxlan0
      
      EOF
          i=$((i+1))
      done

    您現在已在 10.200.0.0/24 網路中建立第 2 層連線。VM 的 IP 位址如下:

    • 管理員工作站 VM:10.200.0.2
    • 執行控制層節點的 VM:
      • 10.200.0.3
      • 10.200.0.4
      • 10.200.0.5
    • 執行工作站節點的 VM:
      • 10.200.0.6
      • 10.200.0.7

    安裝 Google Distributed Cloud 的必要條件

    在管理員工作站上安裝 Google Distributed Cloud 之前,請先安裝下列工具:

    • bmctl
    • kubectl
    • Docker

    如要安裝工具並準備安裝 Google Distributed Cloud,請執行下列操作:

    1. 執行下列指令,將服務帳戶金鑰下載至管理工作站,並安裝必要工具:

      gcloud compute ssh root@$VM_WS --zone "${ZONE}" << EOF
      set -x
      
      export PROJECT_ID=\$(gcloud config get-value project)
      BMCTL_VERSION=\$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/bmctl_version -H "Metadata-Flavor: Google")
      export BMCTL_VERSION
      
      gcloud iam service-accounts keys create bm-gcr.json \
        --iam-account=baremetal-gcr@\${PROJECT_ID}.iam.gserviceaccount.com
      
      curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
      
      chmod +x kubectl
      mv kubectl /usr/local/sbin/
      mkdir baremetal && cd baremetal
      gsutil cp gs://anthos-baremetal-release/bmctl/$BMCTL_VERSION/linux-amd64/bmctl .
      chmod a+x bmctl
      mv bmctl /usr/local/sbin/
      
      cd ~
      printf "Installing docker"
      curl -fsSL https://get.docker.com -o get-docker.sh
      sh get-docker.sh
      EOF
    2. 執行下列指令,確保 root@10.200.0.x 正常運作。這些指令會執行下列工作:

      1. 在管理員工作站上產生新的 SSH 金鑰。
      2. 將公開金鑰新增至部署作業中的所有其他 VM。
      gcloud compute ssh root@$VM_WS --zone "${ZONE}" << EOF
      set -x
      ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
      sed 's/ssh-rsa/root:ssh-rsa/' ~/.ssh/id_rsa.pub > ssh-metadata
      for vm in ${VMs[@]}
      do
          gcloud compute instances add-metadata \$vm --zone ${ZONE} --metadata-from-file ssh-keys=ssh-metadata
      done
      EOF

    部署混合式叢集

    下列程式碼區塊包含完成下列工作所需的所有指令和設定:

    1. 為所需的混合式叢集建立設定檔。
    2. 執行預檢。
    3. 部署叢集。
    gcloud compute ssh root@$VM_WS --zone "${ZONE}" <<EOF
    set -x
    export PROJECT_ID=$(gcloud config get-value project)
    CLUSTER_NAME=\$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster_id -H "Metadata-Flavor: Google")
    BMCTL_VERSION=\$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/bmctl_version -H "Metadata-Flavor: Google")
    export CLUSTER_NAME
    export BMCTL_VERSION
    bmctl create config -c \$CLUSTER_NAME
    cat > bmctl-workspace/\$CLUSTER_NAME/\$CLUSTER_NAME.yaml << EOB
    ---
    gcrKeyPath: /root/bm-gcr.json
    sshPrivateKeyPath: /root/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath: /root/bm-gcr.json
    gkeConnectRegisterServiceAccountKeyPath: /root/bm-gcr.json
    cloudOperationsServiceAccountKeyPath: /root/bm-gcr.json
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-\$CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: \$CLUSTER_NAME
      namespace: cluster-\$CLUSTER_NAME
    spec:
      type: hybrid
      anthosBareMetalVersion: \$BMCTL_VERSION
      gkeConnect:
        projectID: \$PROJECT_ID
      controlPlane:
        nodePoolSpec:
          clusterName: \$CLUSTER_NAME
          nodes:
          - address: 10.200.0.3
          - address: 10.200.0.4
          - address: 10.200.0.5
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.168.0.0/16
        services:
          cidrBlocks:
          - 172.26.232.0/24
      loadBalancer:
        mode: bundled
        ports:
          controlPlaneLBPort: 443
        vips:
          controlPlaneVIP: 10.200.0.49
          ingressVIP: 10.200.0.50
        addressPools:
        - name: pool1
          addresses:
          - 10.200.0.50-10.200.0.70
      clusterOperations:
        # might need to be this location
        location: us-central1
        projectID: \$PROJECT_ID
      storage:
        lvpNodeMounts:
          path: /mnt/localpv-disk
          storageClassName: node-disk
        lvpShare:
          numPVUnderSharedPath: 5
          path: /mnt/localpv-share
          storageClassName: local-shared
      nodeConfig:
        podDensity:
          maxPodsPerNode: 250
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: node-pool-1
      namespace: cluster-\$CLUSTER_NAME
    spec:
      clusterName: \$CLUSTER_NAME
      nodes:
      - address: 10.200.0.6
      - address: 10.200.0.7
    EOB
    
    bmctl create cluster -c \$CLUSTER_NAME
    EOF

    驗證叢集

    您可以在根帳戶的 bmctl-workspace 目錄中,找到叢集的 kubeconfig 檔案。如要驗證部署作業,請完成下列步驟。

    1. 使用 SSH 以 root 身分存取管理工作站:

      gcloud compute ssh root@abm-ws --zone ${ZONE}
      

      您可以忽略任何有關更新 VM 的訊息,並完成本教學課程。如果您打算將 VM 做為測試環境,建議按照 Ubuntu 說明文件所述,更新 OS 或升級至下一個版本。

    2. 使用叢集設定檔的路徑設定 KUBECONFIG 環境變數,以便在叢集上執行 kubectl 指令。

      export clusterid=CLUSTER_NAME
      export KUBECONFIG=$HOME/bmctl-workspace/$clusterid/$clusterid-kubeconfig
      kubectl get nodes
      
    3. 在環境變數中設定目前的內容:

      export CONTEXT="$(kubectl config current-context)"
      
    4. 執行下列 gcloud CLI 指令。此指令會執行下列作業:

      • 在叢集上授予使用者帳戶 Kubernetes clusterrole/cluster-admin 角色。
      • 設定叢集,讓您可以在本機執行 kubectl 指令,不必透過 SSH 連線至管理員工作站。

      GOOGLE_ACCOUNT_EMAIL 替換為與帳戶相關聯的電子郵件地址。 Google Cloud 例如:--users=alex@example.com

      gcloud container fleet memberships generate-gateway-rbac  \
          --membership=CLUSTER_NAME \
          --role=clusterrole/cluster-admin \
          --users=GOOGLE_ACCOUNT_EMAIL \
          --project=PROJECT_ID \
          --kubeconfig=$KUBECONFIG \
          --context=$CONTEXT\
          --apply
      

      這項指令會輸出類似以下的結果,為方便閱讀,以下只列出部分內容:

      Validating input arguments.
      Specified Cluster Role is: clusterrole/cluster-admin
      Generated RBAC policy is:
      --------------------------------------------
      ...
      
      Applying the generate RBAC policy to cluster with kubeconfig: /root/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig, context: CLUSTER_NAME-admin@CLUSTER_NAME
      Writing RBAC policy for user: GOOGLE_ACCOUNT_EMAIL to cluster.
      Successfully applied the RBAC policy to cluster.
      
    5. 探索完成後,請輸入 exit 登出管理工作站。

    6. 取得可透過 Connect 閘道存取叢集的 kubeconfig 項目。

      gcloud container fleet memberships get-credentials CLUSTER_NAME
      

      輸出結果會與下列內容相似:

      Starting to build Gateway kubeconfig...
      Current project_id: PROJECT_ID
      A new kubeconfig entry "connectgateway_PROJECT_ID_global_CLUSTER_NAME" has been generated and set as the current context.
      
    7. 現在您可以透過連線閘道執行 kubectl 指令:

      kubectl get nodes
      kubectl get namespaces
      

    從 Google Cloud 控制台登入叢集

    如要在 Google Cloud 控制台中觀察叢集上的工作負載,您必須登入叢集。首次登入主控台前,請先設定驗證方法。最容易設定的驗證方法是 Google 身分。您可以使用與Google Cloud 帳戶相關聯的電子郵件地址登入。

    您在上一個章節中執行的 gcloud container fleet memberships generate-gateway-rbac 指令會設定叢集,讓您可以使用 Google 身分登入。

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

      前往 GKE 叢集

    2. 按一下已註冊叢集旁的 「動作」,然後按一下「登入」

    3. 選取「使用 Google 帳戶登入」

    4. 按一下 [Login] (登入)。

    清除所用資源

    1. 連線至管理員工作站,將叢集 VM 重設為安裝前的狀態,並從 Google Cloud專案取消註冊叢集:

      gcloud compute ssh root@abm-ws --zone ${ZONE} << EOF
      set -x
      export clusterid=CLUSTER_NAME
      bmctl reset -c \$clusterid
      EOF
      
    2. 列出名稱中含有 abm 的所有 VM:

      gcloud compute instances list | grep 'abm'
      
    3. 確認您是否要刪除名稱含有 abm 的所有 VM。

      驗證完成後,即可執行下列指令刪除 abm VM:

      gcloud compute instances list --format="value(name)" | grep 'abm'  | xargs gcloud \
          --quiet compute instances delete