配置适用于 Kubernetes 的 OpenStack Cloud Provider

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

前提条件

本指南假定您有一个使用在 OpenStack 环境中运行的 Google Distributed Cloud 创建的集群,其设置类似于在 OpenStack 上部署裸金属集群指南中所述的设置。请先按照该指南操作,然后再尝试这些步骤。

在 OpenStack 上安装的 Google Distributed Cloud。

配置 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 部署中专用网络上的子网,从此网络为运行 Google Distributed Cloud(纯软件)的虚拟机分配 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 脚本abm配置的 root 用户为 。

    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 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 访问的销售终端应用。

    在裸金属集群上运行的销售终端应用,通过 OpenStack 中的 LoadBalancer 公开

    通过访问 OpenStack 网页界面,您可以发现 OpenStack 中创建了一个新的 OpenStack 负载均衡器

    OpenStack 应用,其中显示由 Google Distributed Cloud(纯软件)预配的 LoadBalancer