在 OpenStack 上部署 Anthos clusters on Bare Metal

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

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

您可以在具有受支持操作系统的 OpenStack 虚拟机 (VM) 上部署 Anthos clusters on Bare Metal。Anthos clusters on Bare Metal 不会自动预配虚拟机,预配虚拟机超出了本指南的讨论范围。如需了解虚拟机要求并查看部署示例,请查看创建 OpenStack 虚拟机的 Terraform 示例

您可以使用 OpenStack LBaaS 和 Anthos Clusters on Bare Metal 中的 Kubernetes OpenStack Cloud Provider 在 OpenStack 集群外部公开 Kubernetes Service。

本指南包含以下部分:

  1. 部署 Anthos clusters on Bare Metal
  2. 在 Anthos clusters on Bare Metal 中配置适用于 Kubernetes 的 OpenStack Cloud Provider,以与 Octavia 负载均衡器集成
  3. 验证适用于 Kubernetes 的 OpenStack Cloud Provider 集成

本指南使用 OpenStack Ussuri,但也可以使用旧版 OpenStack。较旧的 OpenStack 版本尚未经过测试。本指南使用 OpenStack 虚拟机提供在 OpenStack 上运行的双节点 Anthos clusters on Bare Metal 概念验证环境。如需了解如何创建具有高可用性控制平面的生产环境,请参阅 Anthos clusters on Bare Metal 文档,了解生产环境要求。

部署示例

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

安装在 OpenStack 上的 Anthos clusters 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 工作负载。

部署 Anthos clusters on Bare Metal

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

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

安装所需的工具

  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 配置为使用您要在其中注册 Anthos clusters on Bare Metal 的 Google Cloud 项目。

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

    gcloud auth application-default login
    
  4. 创建 bm-gcr 服务帐号。您将使用此服务帐号从 Anthos clusters 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 \
      anthosgke.googleapis.com \
      cloudresourcemanager.googleapis.com \
      container.googleapis.com \
      gkeconnect.googleapis.com \
      gkehub.googleapis.com \
      serviceusage.googleapis.com \
      stackdriver.googleapis.com \
      monitoring.googleapis.com \
      logging.googleapis.com \
      opsconfigmonitoring.googleapis.com \
      anthosaudit.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.9.8/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. 为集群创建 Anthos clusters on Bare Metal 工作区。

    bmctl create config -c CLUSTER_NAME
    
  3. 为 Anthos clusters 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.9.8
      gkeConnect:
        projectID: PROJECT_ID
      controlPlane:
        nodePoolSpec:
          clusterName: CLUSTER_NAME
          nodes:
          - address: 10.200.0.11
      clusterNetwork:
        pods:
          cidrBlocks:
          - 10.202.0.0/16
        services:
          cidrBlocks:
          - 10.203.0.0/16
      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,在新创建的 Anthos clusters on Bare Metal 集群上安装 OpenStack Cloud Provider。这使您可以利用 OpenStack 的 LBaaS 通过 LoadBalancer 类型的服务公开应用。