在 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. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify 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:"

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

本指南中的步驟取自 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.35.100-gke.72
    

    對於 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-2204-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 網路中建立 L2 連線。 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
    gcloud storage 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