Configure o fornecedor de nuvem do OpenStack para o Kubernetes

Este guia explica como configurar o fornecedor de nuvem OpenStack para o Kubernetes no seu cluster de metal puro. O fornecedor de nuvem OpenStack tem de ser configurado para expor os serviços Kubernetes através do LBaaS do OpenStack.

Pré-requisitos

Este guia pressupõe que tem um cluster criado com o Google Distributed Cloud em execução no seu ambiente OpenStack com uma configuração semelhante à explicada no guia Implemente um cluster bare metal no OpenStack. Siga primeiro esse guia antes de experimentar estes passos.

Google Distributed Cloud instalado no OpenStack.

Configure o fornecedor

A secção seguinte pressupõe que está a começar a partir de uma janela de terminal na sua estação de trabalho local.

  1. Obtenha o ficheiro de configuração do cliente OpenStack (openrc). Pode transferi-lo a partir da IU Web do OpenStack.

    source PATH_TO_OPENRC_FILE/openrc
    
  2. Crie o ficheiro de configuração para o fornecedor de nuvem do OpenStack Kubernetes.

    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
    

    Substitua o seguinte:

    • OS_AUTH_URL, OS_USERNAME, OS_PASSWORD: estas variáveis já devem estar definidas no ambiente através da obtenção do ficheiro openrc. Assim, são captados automaticamente.
    • PUBLIC_NETWORK_ID: esta é a rede acessível publicamente na sua implementação do OpenStack a partir da qual são alocados endereços IP flutuantes. É a partir desta rede que o LoadBalancer IPs para os serviços do Kubernetes é atribuído. Pode usar um comando de uma linha para obter este IP do seu ambiente OpenStack.
    • ABM_NETWORK_SUBNET_ID: esta é a sub-rede na rede privada na sua implementação do OpenStack a partir da qual os IPs são atribuídos para as VMs que executam apenas o software do Google Distributed Cloud. Pode usar um comando semelhante a Obter o ID da rede pública no OpenStack para obter este IP do seu ambiente OpenStack.
  3. Obtenha o endereço IP flutuante público da VM abm-ws.

    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. Copie o ficheiro cloud.conf para a VM abm-ws no OpenStack.

    scp ./cloud.conf ubuntu@$FLOATING_IP:~
    
  5. Use o SSH para estabelecer ligação segura à VM abm-ws e inicie sessão como utilizador root.

    O utilizador root, conforme configurado pelos scripts do Terraform, é abm.

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  6. Copie os ficheiros cloud.conf para o diretório $HOME do utilizador root.

    cp /home/ubuntu/cloud.conf $HOME
    
  7. Crie um Kubernetes Secret com a configuração.

    # 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. Instale o fornecedor de nuvem do OpenStack para o Kubernetes.

    # 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
    

Valide a integração do OpenStack

  1. Implemente a aplicação de ponto de vendas de exemplo.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/master/anthos-bm-openstack-terraform/resources/point-of-sales.yaml
    
  2. Verifique se os pods de aplicações estão em execução.

    kubectl get pods
    

    Resultado esperado:

    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. Expôs a aplicação através de um serviço do tipo LoadBalancer.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/master/anthos-bm-openstack-terraform/resources/point-of-sales-service.yaml
    
  4. Experimente aceder ao serviço a partir de um navegador.

    # 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
    

    Aplicação de ponto de venda acedida através do EXTERNAL-IP.

    Aplicação de ponto de venda executada num cluster de metal puro exposto através de um LoadBalancer no OpenStack

    Pode reparar que está a ser criado um novo OpenStack Load Balancer no OpenStack visitando a IU Web do OpenStack.

    App OpenStack a mostrar equilibradores de carga aprovisionados apenas por software do Google Distributed Cloud