在 OpenStack 上部署适用于裸金属的 GDCV

GKE on Bare Metal 支持将 OpenStack 用作私有云平台。此支持允许您使用以下 OpenStack 服务:

  • 基础架构即服务 (IaaS)
  • 负载均衡即服务 (LBaaS)
  • 存储

您可以部署在具有受支持的操作系统的 OpenStack 虚拟机 (VM) 中运行的 GKE on Bare Metal。GKE on Bare Metal 不会自动预配虚拟机,并且预配虚拟机不在本指南的介绍范围内。如需了解虚拟机要求并查看部署示例,请查看创建 OpenStack 虚拟机的 Terraform 示例

您可以使用 GKE on Bare Metal 中的 OpenStack LBaaS 和 Kubernetes OpenStack Cloud Provider 在 OpenStack 集群之外公开 Kubernetes 服务。

本指南包含以下部分:

  1. 在裸金属上部署 GKE
  2. 在 GKE on Bare Metal 中配置适用于 Kubernetes 的 OpenStack Cloud Provider,以与 Octavia 负载平衡器
  3. 验证适用于 Kubernetes 的 OpenStack Cloud Provider 集成

本指南使用 OpenStack Ussuri,但也可以使用旧版 OpenStack。较旧的 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 地址
abm-ws 10.200.0.10 (专用 IP)
float_ip (公共 IP)
充当管理员工作站,用于将 Anthos on Bare Metal 部署到其他机器。
abm-cp1 10.200.0.11 Anthos 集群控制平面:此主机运行 Kubernetes 控制平面和负载均衡器。
abm-w1 10.200.0.12 Anthos 集群工作器节点:此主机运行 Kubernetes 工作负载。

在裸金属上部署 GKE

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

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

安装所需的工具

  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.16.8/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.16.8
      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...

验证集群并与之交互

您可以在 abm-ws 虚拟机的 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) 虚拟机中发出以下命令来清理集群。

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

后续步骤

您现在可以按照为 Kubernetes 配置 OpenStack Cloud Provider 指南,在新创建的 GKE on Bare Metal 集群上安装 OpenStack Cloud Provider。这使您可以利用 OpenStack 的 LBaaS 通过 LoadBalancer 类型的服务公开应用。