在 OpenStack 上部署叢集

本指南將逐步說明如何使用支援的作業系統,在 OpenStack 虛擬機器 (VM) 的裸機上安裝 Google Distributed Cloud (僅限軟體)。部署作業會使用指令碼,簡化在 OpenStack VM 中安裝混合式叢集的程序。本指南也會說明如何啟用負載平衡即服務 (LBaaS)。您可以搭配使用 OpenStack LBaaS 和 Kubernetes OpenStack Cloud Provider 與 Google Distributed Cloud,將 Kubernetes 服務公開給 OpenStack 叢集外部。

Google Distributed Cloud 不會自動佈建 OpenStack VM,且佈建 VM 不在本指南的範圍內。如要瞭解 VM 需求並查看部署範例,請參閱使用 Terraform 建立 OpenStack VM 的範例

本指南包含以下章節:

  1. 部署 Google Distributed Cloud

  2. 在已安裝的叢集中,設定 Kubernetes 適用的 OpenStack 雲端服務供應商,以便與 Octavia 負載平衡器整合

  3. 驗證 Kubernetes 整合的 OpenStack 雲端服務供應商

本指南使用 OpenStack Ussuri,但 Google Distributed Cloud 並未規定 OpenStack 的特定版本。本指南使用 OpenStack VM,為您提供在 OpenStack 上執行的雙節點概念驗證環境。如要瞭解 Google Distributed Cloud 的正式版安裝需求,請參閱安裝必要條件

部署範例

本指南提供在 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 叢集工作站節點: 這個主機會執行 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.33.0-gke.799/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.33.0-gke.799
      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 指令會開始設定新的混合式叢集。包括對節點執行前置檢查、建立管理員和使用者叢集,以及使用 Connect Agent 向 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...

驗證及與叢集互動

您可以在 abm-ws VM 的 bmctl-workspace 目錄中找到叢集 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

後續步驟