配置适用于 Kubernetes 的 OpenStack Cloud Provider

本指南介绍如何在 GKE on Bare Metal 集群中配置适用于 Kubernetes 的 OpenStack Cloud Provider。OpenStack Cloud Provider 必须配置为使用 OpenStack LBaaS 公开 Kubernetes Service。

前提条件

本指南假定您有一个在 OpenStack 环境中运行的 GKE on Bare Metal 集群,其设置类似于在 OpenStack 上部署 GKE on Bare Metal 指南。请先按照该指南操作,然后再尝试这些步骤。

已在 OpenStack 上安装 GKE on Bare Metal。

配置 Provider

以下部分假定您从本地工作站的终端窗口开始。

  1. 对 OpenStack 客户端配置 (openrc) 文件执行 source 命令。您可以从 OpenStack 网页界面下载该文件。

    source PATH_TO_OPENRC_FILE/openrc
    
  2. 为 OpenStack Kubernetes Cloud Provider 创建配置文件。

    cat > cloud.conf << EOF
    [Global]
    auth-url=${OS_AUTH_URL}
    username=${OS_USERNAME}
    password=${OS_PASSWORD}
    region=RegionOne
    tenant-name=admin
    domain-id=default
    # this is for using a self-signed cert if your using a CA then comment this line
    # and point to the CA certificate using the "ca-file" arg
    tls-Insecure=true
    
    [LoadBalancer]
    use-octavia=true
    # this is generally the public network on OpenStack
    floating-network-id=PUBLIC_NETWORK_ID
    # this should be private network subnet where vip is allocated for the ABM nodes
    subnet-id=ABM_NETWORK_SUBNET_ID
    
    [BlockStorage]
    bs-version=v2
    EOF
    

    替换以下内容:

    • OS_AUTH_URLOS_USERNAMEOS_PASSWORD:这些变量应该已经通过对 openrc 文件执行 source 命令在环境设置好。因此,它们将自动被提取。
    • PUBLIC_NETWORK_ID:这是 OpenStack 部署中的可公开访问网络,浮动 IP 地址分配自此。Kubernetes Service 的 LoadBalancer IPs 将从此网络分配。您可以使用一行命令从您的 OpenStack 环境中提取此 IP。
    • ABM_NETWORK_SUBNET_ID:这是 OpenStack 部署中专用网络上的子网,从此网络为运行 GKE on Bare Metal 的虚拟机分配 IP。您可以使用类似于获取 OpenStack 中公共网络的 ID 的命令从您的 OpenStack 环境提取此 IP。
  3. 提取 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 '"')
    
  4. cloud.conf 文件复制到 OpenStack 中的 abm-ws 虚拟机。

    scp ./cloud.conf ubuntu@$FLOATING_IP:~
    
  5. 使用 SSH 安全地连接到 abm-ws 虚拟机,并以 root 用户身份登录。

    Terraform 脚本配置的 root 用户为 abm

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  6. cloud.conf 文件复制到 root 用户的 $HOME 目录中。

    cp /home/ubuntu/cloud.conf $HOME
    
  7. 使用该配置创建 Kubernetes Secret

    # make sure the kubectl client is pointing towards your Anthos on bare metal cluster
    export KUBECONFIG=~/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
    
    # store the provider configurations as a Kubernetes secret
    kubectl create secret -n kube-system generic cloud-config --from-file=cloud.conf
    
  8. 安装适用于 Kubernetes 的 OpenStack Cloud Provider。

    # create the necessary roles for the OpenStack provider
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/controller-manager/cloud-controller-manager-roles.yaml
    
    # create the required role-bindings for the OpenStack provider
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/controller-manager/cloud-controller-manager-role-bindings.yaml
    
    # create the OpenStack controller manager
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/controller-manager/openstack-cloud-controller-manager-ds.yaml
    

验证 OpenStack 集成

  1. 部署示例销售终端应用

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/master/anthos-bm-openstack-terraform/resources/point-of-sales.yaml
    
  2. 验证应用 pod 是否正在运行。

    kubectl get pods
    

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    api-server-7db4777f7f-zflk5   1/1     Running   0          74s
    inventory-58c6fb5568-dqk2x    1/1     Running   0          74s
    payments-68d5d65d5c-5mjl6     1/1     Running   0          74s
    
  3. 通过 LoadBalancer 类型的服务公开了应用。

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/master/anthos-bm-openstack-terraform/resources/point-of-sales-service.yaml
    
  4. 尝试从浏览器访问该服务。

    # wait for the external IP to be assigned
    kubectl get service api-server-lb
    
    NAME            TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
    api-server-lb   LoadBalancer   10.203.77.215   172.29.249.159   80:32378/TCP   4m12s
    

    使用 EXTERNAL-IP 访问的销售终端应用。

    在 GKE on Bare Metal 上运行的销售终端应用通过 OpenStack 中的 LoadBalancer 公开

    您可以访问 OpenStack WebUI,注意到在 OpenStack 中创建了一个新的 OpenStack 负载平衡器

    在 OpenStack 界面中查看由 GKE on Bare Metal 预配的负载均衡器