在 OpenStack 上部署叢集

Distributed Cloud 軟體僅適用於裸機,可讓您在 OpenStack 虛擬機器 (VM) 上部署混合式叢集。這項部署作業可讓您整合 OpenStack 負載平衡即服務 (LBaaS) 和 OpenStack 雲端服務供應商 for Kubernetes,在 OpenStack 環境外公開 Kubernetes 服務。

Google Distributed Cloud 不會自動佈建 OpenStack VM。如要查看 VM 需求並設定雙節點概念驗證環境,請參閱「建立 OpenStack VM 的 Terraform 範例」。雖然這項部署作業示範的是 OpenStack Ussuri,但 Google Distributed Cloud 不需要特定 OpenStack 版本。如需正式環境,請參閱安裝必要條件。

部署範例

本指南提供在 OpenStack 上部署裸機叢集的範例,該叢集會與 OpenStack LBaaS 整合。您必須瞭解並調整指令和設定值,以符合 OpenStack 環境。下圖顯示部署結果:

安裝在 OpenStack 上的 Google Distributed Cloud。

必要條件

  • OpenStack Ussuri 已部署 LBaaS v2 且可正常運作
  • 用於下載 bmctl 工具的服務帳戶
  • 按照範例部署作業所示,設定 OpenStack VM 和網路。如要在 OpenStack 環境中佈建類似的設定,可以選擇下列選項:
    1. 使用這個 Terraform 指令碼自動佈建資源。
    2. 手動佈建資源。
  • 下列 OpenStack VM 必須準備就緒,且可透過 SSH 存取:
名稱 IP 位址 目的
abm-ws 10.200.0.10 (私人 IP)
floating_ip (公開 IP)
做為管理員工作站:用於將 Google Distributed Cloud 部署至其他機器。
abm-cp1 10.200.0.11 叢集控制層:這個主機執行 Kubernetes 控制層和負載平衡器。
abm-w1 10.200.0.12 叢集 worker 節點:這個主機負責執行 Kubernetes 工作負載。

部署 Google Distributed Cloud

本節說明如何完成下列工作:

  1. 在 abm-ws 管理員工作站 VM 上安裝所需工具。
  2. 設定專案 ID 和服務帳戶,安全地完成部署作業
  3. 建立叢集設定檔
  4. 建立叢集

安裝所需工具

  1. 擷取 abm-ws VM 的公開浮動 IP 位址:

    export OPENSTACK_IPS=$(openstack floating ip list --tags=abm_ws_floatingip -f json)
    export FLOATING_IP=$(jq -c '.[]."Floating IP Address"' <<< $OPENSTACK_IPS | tr -d '"')
    
  2. 確認您可以使用 SSH 安全連線至 abm-ws VM,並以 root 使用者身分登入。Terraform 指令碼設定的 root 使用者為 abm。

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  3. 確認您可以使用 SSH 連線至其他節點:

    ssh abm@10.200.0.11 'echo SSH to $HOSTNAME succeeded'
    ssh abm@10.200.0.12 'echo SSH to $HOSTNAME succeeded'
    

    上述指令的預期回應如下:

    SSH to abm-cp1 succeeded
    SSH to abm-w1 succeeded
    
  4. 在 abm-ws VM 下載 kubectl 指令列公用程式。

    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
    sudo mv kubectl /usr/local/sbin/
    
  5. 在 abm-ws VM 上安裝 Docker:

    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    sudo usermod -aG docker abm
    newgrp docker
    

設定 Google Cloud 專案和服務帳戶

  1. 取得使用者帳戶的 Google Cloud CLI 存取憑證。

    這些憑證會用於後續的 gcloud 指令。

    gcloud auth login
    
  2. 確認 Google Cloud CLI 已設為使用要註冊叢集的 Google Cloud 專案。

    gcloud config set project PROJECT_ID
    
  3. 在管理員工作站中,為使用者帳戶設定應用程式預設憑證 (ADC)。使用 bmctl 工具建立叢集時,會用到這個值。

    gcloud auth application-default login
    
  4. 建立 bm-gcr 服務帳戶。您會使用這個服務帳戶從叢集進行驗證。

    gcloud iam service-accounts create bm-gcr
    gcloud iam service-accounts keys create bm-gcr.json \
        --iam-account=bm-gcr@PROJECT_ID.iam.gserviceaccount.com
    
  5. 啟用必要的 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 \
        gkeonprem.googleapis.com \
        iam.googleapis.com \
        logging.googleapis.com \
        monitoring.googleapis.com \
        opsconfigmonitoring.googleapis.com \
        serviceusage.googleapis.com \
        stackdriver.googleapis.com \
        storage.googleapis.com
    
  6. 將額外權限授予 bm-gcr 服務帳戶。新增權限後,您就不必為個別服務建立多個服務帳戶。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.connect"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.admin"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.dashboardEditor"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/stackdriver.resourceMetadata.writer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/opsconfigmonitoring.resourceMetadata.writer"
    

建立叢集設定檔

  1. 下載 bmctl 指令列公用程式。

    mkdir baremetal && cd baremetal
    gcloud storage cp gs://anthos-baremetal-release/bmctl/1.36.200-gke.118/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. 為叢集建立叢集設定檔:

    bmctl create config -c CLUSTER_NAME
    
  3. 更新設定檔,以便與 OpenStack 搭配使用:

    cat > bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME.yaml << EOB
    ---
    gcrKeyPath: /home/abm/bm-gcr.json
    sshPrivateKeyPath: /home/abm/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath: /home/abm/bm-gcr.json
    gkeConnectRegisterServiceAccountKeyPath: /home/abm/bm-gcr.json
    cloudOperationsServiceAccountKeyPath: /home/abm/bm-gcr.json
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: openstack-cluster-ns
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: openstack-cluster-ns
      annotations:
        baremetal.cluster.gke.io/external-cloud-provider: "true"
    spec:
      type: hybrid
      anthosBareMetalVersion: 1.36.200-gke.118
      gkeConnect:
        projectID: PROJECT_ID
      controlPlane:
        nodePoolSpec:
          clusterName: CLUSTER_NAME
          nodes:
          - address: 10.200.0.11
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.168.0.0/16
        services:
          cidrBlocks:
          - 10.96.0.0/20
      loadBalancer:
        mode: manual
        ports:
          controlPlaneLBPort: 443
        vips:
          controlPlaneVIP: 10.200.0.101
          ingressVIP: 10.200.0.102
      clusterOperations:
        location: us-central1
        projectID: PROJECT_ID
      storage:
        lvpNodeMounts:
          path: /mnt/localpv-disk
          storageClassName: node-disk
        lvpShare:
          numPVUnderSharedPath: 5
          path: /mnt/localpv-share
          storageClassName: standard
      nodeAccess:
        loginUser: abm
    
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: node-pool-1
      namespace: openstack-cluster-ns
    spec:
      clusterName: CLUSTER_NAME
      nodes:
      - address: 10.200.0.12
    EOB
    

建立叢集

  1. 建立叢集:

    bmctl create cluster -c CLUSTER_NAME
    

執行 bmctl 指令後,系統會開始設定新的混合式叢集。包括對節點執行預檢、建立管理員和使用者叢集,以及使用連線代理程式向 Google Cloud 註冊叢集。整個設定程序最多可能需要 15 分鐘。建立叢集時,您會看到下列輸出內容:

Please check the logs at bmctl-workspace/CLUSTER_NAME/log/create-cluster-20210926-020741/create-cluster.log
[2021-09-26 02:07:59+0000] Creating bootstrap cluster... ⠦ kind get kubeconfig --name bmctl > ~/.kube/config && k get pods --all-namespaces
[2021-09-26 02:07:59+0000] Creating bootstrap cluster... OK
[2021-09-26 02:10:48+0000] Installing dependency components... OK
[2021-09-26 02:13:42+0000] Waiting for preflight check job to finish... OK
[2021-09-26 02:15:22+0000] - Validation Category: machines and network
[2021-09-26 02:15:22+0000]  - [PASSED] gcp
[2021-09-26 02:15:22+0000]  - [PASSED] node-network
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11-gcp
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12-gcp
[2021-09-26 02:15:22+0000] Flushing logs... OK
[2021-09-26 02:15:23+0000] Applying resources for new cluster
[2021-09-26 02:15:24+0000] Waiting for cluster to become ready OK
[2021-09-26 02:25:04+0000] Writing kubeconfig file
[2021-09-26 02:25:04+0000] kubeconfig of created cluster is at bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig, please run
[2021-09-26 02:25:04+0000] kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig get nodes
[2021-09-26 02:25:04+0000] to get cluster node status.
[2021-09-26 02:25:04+0000] Please restrict access to this file as it contains authentication credentials of your cluster.
[2021-09-26 02:25:04+0000] Waiting for node pools to become ready OK
[2021-09-26 02:25:24+0000] Moving admin cluster resources to the created admin cluster
[2021-09-26 02:25:53+0000] Flushing logs... OK
[2021-09-26 02:25:53+0000] Deleting bootstrap cluster...

驗證叢集並與其互動

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

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

    export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
    kubectl get nodes
    

    您應該會看到叢集的節點,輸出內容大致如下:

    NAME      STATUS   ROLES                  AGE     VERSION
    abm-cp1   Ready    control-plane,master   5m24s   v1.20.5-gke.1301
    abm-w1    Ready    <none>                 2m17s   v1.20.5-gke.1301
    

透過 Google Cloud 控制台登入叢集

如要在 Google Cloud 控制台觀察工作負載,必須登入叢集。如需操作說明和登入叢集的詳細資訊,請參閱「透過 Google Cloud 控制台使用叢集」。

清除所用資源

您可以在管理員工作站 (abm-ws) VM 中發出下列指令,清除叢集:

export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
bmctl reset --cluster CLUSTER_NAME

後續步驟