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

在 Compute Engine 虛擬機器 (VM) 上設定 Google Distributed Cloud 軟體,即可在高可用性 (HA) 模式中部署混合式叢集,不需專用硬體。這項設定提供功能測試環境,可讓您探索叢集管理和工作負載部署。

這項部署作業僅供評估之用。請勿在正式環境的 Compute Engine VM 上執行 Google Distributed Cloud 軟體。如要在正式環境中部署 Google Distributed Cloud,請按照「建立基本叢集」中的步驟操作。

在本教學課程中,您將設定六個 Compute Engine VM、透過 vxlan 疊加網路建立第 2 層連線能力、安裝必要條件,以及部署和驗證混合式叢集。

事前準備

  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,因為您需要設定環境變數,才能使用本頁中的指令碼和指令。如果選取現有專案,請確認您是專案擁有者或編輯者。
  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 叢集上執行工作負載所需的兩個 worker 節點。
  1. 設定環境變數:

    export PROJECT_ID=PROJECT_ID
    export ZONE=ZONE
    export CLUSTER_NAME=CLUSTER_NAME
    export BMCTL_VERSION=1.36.200-gke.118
    

    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. 為避免需要多個服務帳戶來處理不同的 API 和服務,請授予 baremetal-gcr 服務帳戶額外權限:

    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-cp1、abm-cp2、abm-cp3:控制層節點的 VM。
    • abm-w1、abm-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 之間建立 L2 連線

使用 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
  • 執行 worker 節點的 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. 在管理員工作站上產生新的安全殼層金鑰。
    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. 現在可以透過 Connect 閘道執行 kubectl 指令:

    kubectl get nodes
    kubectl get namespaces
    

從 Google Cloud 控制台登入叢集

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

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

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

    前往 GKE 叢集

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

  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