在 OpenStack 上部署 GKE on Bare Metal 集群

本指南将引导您在具有受支持操作系统的 OpenStack 虚拟机 (VM) 上部署 GKE on Bare Metal 的示例。部署使用脚本来简化混合集群在 OpenStack 虚拟机中的安装过程。本指南还介绍了一种启用负载均衡即服务 (LBaaS) 的方法。您可以使用 GKE on Bare Metal 中的 OpenStack LBaaS 和 Kubernetes OpenStack Cloud Provider 在 OpenStack 集群外部公开 Kubernetes 服务。

GKE on Bare Metal 不会自动预配 OpenStack 虚拟机,并且预配虚拟机不在本指南的介绍范围内。如需了解虚拟机要求并查看示例部署,请参阅创建 OpenStack 虚拟机的 Terraform 示例

本指南包含以下部分:

  1. 在裸金属上部署 GKE

  2. 在 GKE on Bare Metal 中配置适用于 Kubernetes 的 OpenStack Cloud Provider,以与 Octavia 负载平衡器集成

  3. 验证适用于 Kubernetes 的 OpenStack Cloud Provider 集成

本指南使用的是 OpenStack Ussuri,但 GKE on Bare Metal 对 OpenStack 的特定版本没有要求。本指南使用 OpenStack 虚拟机为您提供在 OpenStack 上运行的双节点 GKE on Bare Metal 概念验证环境。如需了解如何创建具有高可用性控制平面的生产环境,请参阅 GKE on Bare Metal 文档了解生产环境要求。

部署示例

本指南提供了一个在 OpenStack 上部署 GKE on Bare Metal 的示例,该部署与 OpenStack LBaaS 集成。您必须了解并调整命令和配置值,以匹配您的 OpenStack 环境。下图显示了生成的部署:

已在 OpenStack 上安装 GKE on Bare Metal。

前提条件

  • 部署了 LBaaS v2 且可正常运行的 OpenStack Ussuri
  • 用于下载 bmctl 工具的服务账号
  • 如示例部署中所示配置 OpenStack 虚拟机和网络。如需在 OpenStack 环境中预配类似设置,您有以下选择:
    1. 使用此 Terraform 脚本自动预配资源。
    2. 手动预配资源。
  • 以下 OpenStack 虚拟机必须准备就绪并可通过 SSH 使用:
名称 IP 地址 Purpose
abm-ws 10.200.0.10 (专用 IP)
float_ip (公共 IP)
充当管理员工作站:用于将 GKE on Bare Metal 部署到其他机器。
abm-cp1 10.200.0.11 GKE 集群控制平面:此主机运行 Kubernetes 控制平面和负载均衡器。
abm-w1 10.200.0.12 GKE 集群工作器节点:此主机运行 Kubernetes 工作负载。

在裸金属上部署 GKE

本指南介绍如何完成以下任务:

  1. abm-ws 管理员工作站虚拟机上安装所需的工具
  2. 配置安全完成部署所需的项目 ID 和服务帐号
  3. 创建集群配置文件
  4. 创建集群

安装所需的工具

  1. 获取 abm-ws 虚拟机的公共浮动 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 虚拟机,并以 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 虚拟机上下载 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 虚拟机上安装 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 配置为使用您要在其中注册 GKE on Bare Metal 的 Google Cloud 项目。

    gcloud config set project PROJECT_ID
    
  3. 在管理员工作站中为您的用户帐号设置应用默认凭据 (ADC)。使用 bmctl 工具创建集群时将用到此名称。

    gcloud auth application-default login
    
  4. 创建 bm-gcr 服务账号。您可以使用此服务帐号从 GKE on Bare Metal 集群进行身份验证。

    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
    gsutil cp gs://anthos-baremetal-release/bmctl/1.28.400-gke.77/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. 为集群创建 GKE on Bare Metal 工作区。

    bmctl create config -c CLUSTER_NAME
    
  3. 为 GKE on Bare Metal 集群创建配置文件。

    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.28.400-gke.77
      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 向 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 虚拟机上找到集群 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) 虚拟机中发出以下命令来清理集群:

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

后续步骤