使用 Terraform 建立管理員叢集

如果您已使用 Terraform 管理 VMware 資源和內部部署 VMware 資源,請使用 Terraform 為 Google Distributed Cloud 軟體建立 VMware 專用的管理員叢集。 Google Cloud 您也可以使用 gkectlGoogle Cloud console 建立管理員叢集。

事前準備

  • 請確認您已設定管理員工作站,並能登入,如「建立管理員工作站」一文所述。

  • 請確認服務帳戶的 JSON 金鑰檔案位於管理工作站。

  • 查看 IP 位址規劃文件。確認您有足夠的 IP 位址,可供三個控制層節點和一個控制層 VIP 使用。如果您打算建立任何kubeception 使用者叢集,則必須為這些使用者叢集的控制層節點預留充足的 IP 位址。

  • 請參閱負載平衡總覽,重新考慮要使用的負載平衡器類型。如果是手動負載平衡器,您必須先設定負載平衡器,才能建立管理員叢集。

  • 如果您使用 gkectl 建立管理員叢集,請決定要為 Google Distributed Cloud 元件使用公開或私有登錄檔。如要瞭解如何使用私密 Docker 登錄檔,請參閱 privateRegistry。Terraform 和 Google Cloud 控制台都不支援使用私人 Docker 登錄檔做為系統元件。

  • 決定要在管理員叢集節點上執行的作業系統類型。

  • 如果貴機構規定輸出流量必須通過 Proxy 伺服器,請務必將必要 API 和 Artifact Registry 位址加入許可清單

  • 在 1.29 以上版本中,預設會啟用伺服器端預檢。伺服器端預檢需要額外的防火牆規則。在「管理員叢集的防火牆規則」中,搜尋「Preflight checks」,並確認已設定所有必要的防火牆規則。伺服器端前置檢查會在啟動叢集上執行,而不是在管理員工作站本機執行。

程序總覽

建立管理員叢集前,您需要在管理工作站上執行 gkectl register bootstrap 指令。這個指令會在管理員工作站上部署 Docker 中的 Kubernetes (kind) 叢集。這個啟動叢集會託管建立管理員叢集所需的 Kubernetes 控制器。建立管理員叢集時,啟動叢集上的控制器會佈建節點、執行預檢,並將管理員叢集註冊至機群。管理員叢集建立完成後,啟動叢集就會自動刪除。

以下是使用 Terraform 建立管理員叢集的大致步驟:

  1. 填寫設定檔。使用 google_gkeonprem_vmware_admin_cluster 資源和下列範例,建立 main.tf 設定檔。

  2. 建立 bootstrap 叢集。執行 gkectl register bootstrap 來建立啟動叢集。指令完成啟動叢集建立作業後,輸出內容會通知您完成管理員叢集設定。這個程序會持續執行,直到建立管理員叢集為止。

  3. 建立管理員叢集。在另一個終端機視窗或可存取 GKE On-Prem API 的另一部電腦上,執行 terraform 指令,按照您填寫的 main.tf 設定檔指定內容,建立新的管理員叢集。

填寫設定檔

以下範例說明如何使用 MetalLB 建立具有三個控制平面節點的高可用性 (HA) 管理員叢集。在 1.28 以上版本中,新的管理員叢集必須具備高可用性。因此,您必須將 control_plane_node.replicas 設為 3。

如需更多資訊和其他範例,請參閱 google_gkeonprem_vmware_admin_cluster 參考文件。如要瞭解如何使用私人登錄檔儲存系統映像檔,請參閱「設定私人容器登錄檔」。

在下列範例中填入預留位置變數,然後複製並貼到 main.tf。如果您使用 gkeadm 建立管理員工作站,請開啟管理員工作站設定檔,以便將 vCenter 區段中的值複製到對應的預留位置變數。

resource "google_gkeonprem_vmware_admin_cluster" "admin-cluster-metallb" {
  provider = google-beta
  name = "ADMIN_CLUSTER_NAME"
  project = "PROJECT_ID"
  location = "REGION"
  description = "DESCRIPTION"
  bootstrap_cluster_membership = "projects/PROJECT_ID/locations/REGION/memberships/bootstrap-ADMIN_CLUSTER_NAME"
  on_prem_version = "VERSION"
  image_type = "IMAGE_TYPE"
  vcenter {
    address = "VCENTER_ADDRESS"
    datacenter = "DATA_CENTER"
    cluster = "VCENTER_CLUSTER"
    resource_pool = "RESOURCE_POOL"
    datastore = "DATASTORE"
    ca_cert_data = "CA_CERT_DATA"
  }
  network_config {
    service_address_cidr_blocks = ["10.96.232.0/24"]
    pod_address_cidr_blocks = ["192.168.0.0/16"]
    vcenter_network = "NETWORK"
    dhcp_ip_config {
      enabled = true
    }
    host_config {
      dns_servers = ["DNS_SERVERS"]
      ntp_servers = ["NTP_SERVERS"]
    }
    ha_control_plane_config {
      control_plane_ip_block {
        gateway = "GATEWAY"
        netmask = "NETMASK"
        ips {
          hostname = "CONTROL_PLANE_HOST_1"
          ip       = "CONTROL_PLANE_NODE_IP_1"
        }
        ips {
          hostname = "CONTROL_PLANE_HOST_2"
          ip       = "CONTROL_PLANE_NODE_IP_2"
        }
        ips {
          hostname = "CONTROL_PLANE_HOST_3"
          ip       = "CONTROL_PLANE_NODE_IP_3"
        }
      }
    }
  }
  control_plane_node {
     cpus = NUM_CPUS
     memory = MEMORY
     replicas = 3
  }
  load_balancer {
    vip_config {
      control_plane_vip = "CONTROL_PLANE_VIP"
    }
    metal_lb_config {
      enabled = true
    }
  }
}

更改下列內容:

  • ADMIN_CLUSTER_NAME:管理叢集的名稱。名稱長度上限為 20 個字元。

  • PROJECT_ID: Google Cloud 專案 ID。

  • REGION:GKE On-Prem API (gkeonprem.googleapis.com)、Fleet 服務 (gkehub.googleapis.com) 和 Connect 服務 (gkeconnect.googleapis.com) 執行的 Google Cloud 區域。指定 us-west1 或其他支援的區域

    location 欄位對應於 gkectl register bootstrap 指令中的 --location 旗標。

  • DESCRIPTION:管理員叢集的說明。

  • VERSION:叢集的 Google Distributed Cloud 版本。 只有 1.28 以上版本支援使用 Terraform 建立叢集。您在此指定的版本必須與 gkectl register bootstrap 指令中 --bundle-path 旗標指定的 Bundle 版本相符。如需版本清單,請參閱 Google Distributed Cloud 版本

  • IMAGE_TYPE:要在管理員叢集節點上執行的 OS 映像檔類型。請指定下列其中一個值:「ubuntu_containerd」、「cos」、「ubuntu_cgv2」或「cos_cgv2」。

  • VCENTER_ADDRESSvCenter 伺服器位址

    • 管理員工作站設定檔:使用 vCenter.credentials.address 欄位中的值。

    • vcenter.address 欄位對應於 gkectl register bootstrap 指令中的 --vcenter-address 旗標。

  • DATA_CENTERvCenter 資料中心的名稱。

    • 管理員工作站設定檔:使用 vCenter.datacenter 欄位中的值。

    • vcenter.datacenter 欄位對應於 gkectl register bootstrap 指令中的 --vcenter-datacenter 旗標。

  • VCENTER_CLUSTERvCenter 叢集的名稱。

    • 管理員工作站設定檔:使用 vCenter.cluster 欄位中的值。

    • vcenter.cluster 欄位對應於 gkectl register bootstrap 指令中的 --vcenter-cluster 旗標。

  • RESOURCE_POOLvCenter 資源集區的名稱或路徑。

    • 管理員工作站設定檔:使用 vCenter.resourcePool 欄位中的值。

    • vcenter.resource_pool 欄位對應於 gkectl register bootstrap 指令中的 --vcenter-resource-pool 旗標。

  • DATASTOREvCenter 資料儲存庫的名稱。您指定的值必須是名稱,而非路徑。如要輸入路徑,請新增下列欄位:folder = "FOLDER"

    • 管理員工作站設定檔:使用 vCenter.datastore 欄位中的值。

    • vcenter.datastore 欄位對應於 gkectl register bootstrap 指令中的 --vcenter-datastore 旗標。

    如要為叢集節點使用 VM 儲存空間政策,請移除 vcenter.datastore 欄位,並改為新增 vcenter.storage_policy_name。此外,請將 --vcenter-storage-policy 旗標新增至 gkectl register bootstrap 指令。你必須指定 vcenter.datastorevcenter.storage_policy_name 的值,但不能同時指定兩者。

  • FOLDER:要存放叢集 VM 的 vCenter 資料夾名稱。如果未使用資料夾,請移除這個欄位。

    • 管理員工作站設定檔:使用 vCenter.folder 欄位中的值。

    • vcenter.folder 欄位對應於 gkectl register bootstrap 指令中的 --vcenter-folder 旗標。

  • CA_CERT_DATA:PEM 格式的 vCenter CA 憑證,但所有換行符都已替換為 \n 字串。

    1. 執行下列指令,將換行符號替換為 \n

      awk 'ORS="\\n" {print}' CA_CERT_PATH_LOCAL
      

      CA_CERT_PATH_LOCAL 替換為 vCenter Server 的根 CA 憑證路徑。如果您使用 gkeadm 建立管理員工作站,可以使用管理員工作站設定檔中 caCertPath 欄位的值,也就是本機電腦上的路徑。gkeadm 已將 CA 憑證檔案複製到管理員工作站。您必須在 gkectl register bootstrap 指令的 --vcenter-ca-cert-path 標記中指定管理員工作站路徑。

    2. 複製上一個指令的輸出內容,然後貼到 CA_CERT_DATA 預留位置變數。

  • NETWORKvCenter 網路的名稱。

    • 管理員工作站設定檔:使用 vCenter.network 欄位的值。

    • network_config.vcenter_network 欄位對應於 gkectl register bootstrap 指令中的 --vcenter-network 旗標。

  • GATEWAY:具有控制層叢集節點的子網路預設閘道 IP 位址。

  • NETMASK:具有控制平面叢集節點的子網路網路遮罩。

  • DNS_SERVERS:DNS 伺服器的 IP 位址。

  • NTP_SERVERS:時間 (NTP) 伺服器的 IP 位址。

  • control_plane_ip_block.ips 區段中,輸入三個控制層節點的 IP 位址,並視需要輸入主機名稱。如果沒有輸入主機名稱,請從設定中移除 hostname 欄位。

  • NUM_CPUS:管理員叢集中每個控制層節點的 vCPU 數量。至少要有 4 個。

  • MEMORY:管理員叢集中每個控制平面節點的記憶體量,以 MiB 為單位。不得小於 8192,但建議為 16384。

  • CONTROL_PLANE_VIP:您選擇在管理員叢集的 Kubernetes API 伺服器負載平衡器上設定的 IP 位址。

選用:設定私人註冊資料庫

根據預設,在叢集建立或升級期間,Google Distributed Cloud 會使用元件存取服務帳戶,從 gcr.io/gke-on-prem-release 提取系統映像檔。您也可以選擇提供自己的容器登錄伺服器,這樣系統映像檔就會改為從您的私人登錄伺服器提取。

如要設定私人登錄檔,請按照下列步驟操作:

  1. 在管理員叢集設定檔中新增下列項目:

    private_registry_config {
      address = "ADDRESS"
      ca_cert = "CA_CERT"
    }
    

    更改下列內容:

    • ADDRESS:執行私人登錄檔的機器的 IP 位址或 FQDN (完整網域名稱)。

    • CA_CERT:公開金鑰的 CA 憑證資料,但所有換行符號都已替換為字串 \n

    1. 執行下列指令,將換行符號替換為 \n

      awk 'ORS="\\n" {print}' PUBLIC_KEY_PATH
      

      PUBLIC_KEY_PATH 替換為公開金鑰的路徑。

    2. 複製上一個指令的輸出內容,然後貼到 CA_CERT 預留位置變數。

  2. 如果網路使用 Proxy 伺服器,請新增下列項目:

    proxy {
      url: "PROXY_SERVER_ADDRESS"
      no_proxy: "BYPASS_LIST"
    }
    

    更改下列內容:

    • PROXY_SERVER_ADDRESS:Proxy 伺服器的 HTTP 位址。即使通訊埠編號與架構的預設通訊埠相同,也請一併加入。

    • BYPASS_LIST:逗號分隔的 IP 位址、IP 位址範圍、主機名稱和網域名稱清單,這些項目不應透過 Proxy 伺服器。

    範例:

    url: "http://my-proxy.example.local:80"
    no_proxy: "192.0.2.0/24,my-host.example.local,198.51.100.0"
    

    當 Google Distributed Cloud 將要求傳送至這些位址、主機或網域時,要求會略過 Proxy 伺服器,直接傳送至目的地。

如要進一步瞭解如何使用私人登錄檔,包括一般叢集和進階叢集之間的差異,請參閱「設定私人容器登錄檔」。

驗證設定檔和方案

main.tf 所在目錄中執行下列指令:

  1. 初始化 Terraform:

    terraform init
    

    Terraform 會安裝任何需要的程式庫,例如 Google Cloud 供應商。 視需要修正 maint.tf 中的錯誤。

  2. 建立 Terraform 計畫:

    terraform plan -out tfplan
    

    檢查設定,並視需要進行變更。

套用計畫前,您必須先建立啟動程序叢集,如下一節所述。

建立啟動程序叢集

執行 gkectl register bootstrap 指令時,系統會提示您輸入 vCenter 帳戶的使用者名稱和密碼。請確認您已備妥憑證。如果您使用 gkeadm 建立管理員工作站,使用者名稱和密碼會位於 credential.yaml 檔案中。

  1. 使用 SSH 登入管理工作站。

  2. 使用 Google Cloud CLI 進行驗證:

    gcloud auth login
    
  3. 執行下列指令來建立啟動程序叢集。許多旗標值與 main.tf 欄位中的值相同。但請注意,指令會採用其他值,您必須在提供的預留位置變數中指定這些值。

    gkectl register bootstrap \
        --target-cluster-name=ADMIN_CLUSTER_NAME \
        --project-id=PROJECT_ID \
        --location=REGION \
        --vcenter-address=VCENTER_ADDRESS \
        --vcenter-datacenter=DATA_CENTER \
        --vcenter-cluster=VCENTER_CLUSTER \
        --vcenter-resource-pool=RESOURCE_POOL \
        --vcenter-datastore=DATASTORE \
        --vcenter-network=NETWORK \
        --vcenter-ca-cert-path=CA_CERT_PATH \
        --bundle-path=BUNDLE_PATH \
        --component-access-service-account-key-path=COMPONENT_ACCESS_SA_PATH \
        --register-service-account-key-path=CONNECT_REGISTER_SA_PATH \
        --stackdriver-service-account-key-path=LOG_MON_SA_PATH \
        --cloud-audit-logging-service-account-key-path=CLOUD_AUDIT_SA_PATH \
        --admin-kubeconfig-out=KUBECONFIG_NAME
    

    將下列項目替換為管理員工作站路徑:

    • CA_CERT_PATH:vCenter Server 根層級 CA 憑證的路徑。
    • BUNDLE_PATH:套件檔案的路徑。如果您使用 gkeadm 建立管理員工作站,套裝組合檔案會位於 /var/lib/gke/bundles/ 中。檔案名稱取決於 Google Distributed Cloud 版本,例如 gke-onprem-vsphere-1.31.0-gke.889-full.tgz
    • COMPONENT_ACCESS_SA_PATH:元件存取服務帳戶的金鑰檔案路徑。
    • CONNECT_REGISTER_SA_PATH:connect-register 服務帳戶的金鑰檔案路徑。
    • LOG_MON_SA_PATH:記錄監控服務帳戶的金鑰檔案路徑。
    • CLOUD_AUDIT_SA_PATH:稽核記錄服務帳戶的路徑。如果您未建立稽核記錄服務帳戶,請指定記錄監控服務帳戶的金鑰檔案路徑。
    • KUBECONFIG_NAMEgkectl register bootstrap 指令建立的 kubeconfig 檔案名稱。如果未指定這個旗標,指令會在目前的工作目錄中建立名為 kubeconfig 的檔案。如果已有名為 kubeconfig 的檔案,這項指令會覆寫該檔案。

    視需要修改下列標記的指令:

    • 如果您在 main.tf 中指定資料夾,請新增下列旗標: --vcenter-folder=FOLDER
    • 如果您在 main.tf 中指定了 VM 儲存空間政策,請移除 --vcenter-datastore 並新增下列標記:--vcenter-storage-policy-name=STORAGE_POLICY_NAME
    • 如果管理工作站位於 Proxy 伺服器後方的網路上,請新增下列標記:

      • --proxy-url=PROXY_URL
      • --no-proxy=NO_PROXY

      更改下列內容:

      • PROXY_URL:Proxy 伺服器的網址。
      • NO_PROXY:以半形逗號分隔的網域和 IP 位址值,這些值會從 Proxy 排除。

    如果新增標記,請務必加入指令列接續反斜線字元 (\)。

  4. 出現提示時,輸入 (或複製並貼上) vCenter 使用者名稱。使用者名稱不會回顯到畫面上。

  5. 出現提示時,請輸入 (或複製並貼上) vCenter 密碼。密碼不會回顯到畫面上。

這項指令會執行多項驗證。gkectl 成功建立啟動程序叢集後,畫面會顯示類似以下的輸出內容,為方便閱讀,部分內容已遭截斷:

Running workstation validations
- Validation Category: Workstation
    - [SUCCESS] Workstation OS
    - [SUCCESS] Workstation Hardware
    - [SUCCESS] Workstation Package
    - [SUCCESS] Workstation NTP
    - [SUCCESS] Workstation Docker
...
All validation results were SUCCESS.
Unpacking GKE on-prem bundle: /var/lib/gke/bundles/gke-onprem-vsphere-1.31.0-gke.889-full.tgz
...
Successfully created and registered the bootstrap cluster
...
Waiting for preflight checks to run or OnPremAdminCluster to be applied...... -

這個程序會持續執行,直到建立管理員叢集為止。

如果在建立管理員叢集前結束 gkectl register bootstrap 指令,管理員叢集建立作業就會失敗,您必須使用下列指令刪除啟動叢集:

gkectl delete bootstrap \
    --target-cluster-name=ADMIN_CLUSTER_NAME \
    --project-id=PROJECT_ID \
    --location=REGION \
     --register-service-account-key-path=CONNECT_REGISTER_SA_PATH

建立管理員叢集

套用 Terraform 計畫,建立管理員叢集:

terraform apply "tfplan"

建立管理員叢集大約需要 15 分鐘以上。您可以在 Google Cloud 控制台的「GKE 叢集」頁面中查看叢集。

連線至管理員叢集

gkectl register bootstrap 指令會在管理員工作站上建立管理員叢集的 kubeconfig 檔案。如果您在執行 gkectl register bootstrap 時未指定 --admin-kubeconfig-out 旗標,指令會在您執行指令的目錄中,建立名為 kubeconfig 的 kubeconfig 檔案。

您必須限制這個 kubeconfig 的存取權,因為其中包含叢集的驗證憑證。

此外,您也可以透過連線閘道執行唯讀 kubectl 指令。

  1. 在安裝 gcloud CLI 的電腦上執行下列指令,取得可透過連線閘道存取叢集的 kubeconfig 項目。

    gcloud container fleet memberships get-credentials ADMIN_CLUSTER_NAME \
        --project=PROJECT_ID
    

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

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

    kubectl get pods -A
    

    如需管理員叢集的完整管理員權限,請參閱「設定連線閘道」。