Implantar o GKE em Bare Metal no OpenStack

O GKE em Bare Metal é compatível com o uso do OpenStack como uma plataforma de nuvem privada. Com essa compatibilidade, é possível usar os seguintes serviços do OpenStack:

  • Infrastructure como serviço (IaaS)
  • Balanceamento de carga como serviço (LBaaS, na sigla em inglês)
  • Armazenamento

É possível implantar o GKE em Bare Metal em execução em máquinas virtuais (VMs) do OpenStack com sistemas operacionais compatíveis. O GKE em Bare Metal não provisionou as VMs automaticamente, e o provisionamento das VMs está fora do escopo deste guia. Para conhecer os requisitos de VM e analisar um exemplo de implantação, consulte o exemplo do Terraform para criar VMs do OpenStack.

É possível usar o OpenStack LBaaS e o Kubernetes OpenStack Cloud Provider no GKE em Bare Metal para expor os serviços do Kubernetes fora do cluster do OpenStack.

O guia consiste nas seguintes seções:

  1. Implante o GKE em Bare Metal
  2. Configure o OpenStack Cloud Provider para Kubernetes no GKE em Bare Metal para fazer a integração com os balanceadores de carga Octavia.
  3. Validar a integração do Cloud Stack Provider para o Kubernetes

Este guia usa o OpenStack Ussuri, mas pode funcionar com versões mais antigas do OpenStack. As versões mais antigas do OpenStack não foram testadas. O guia usa VMs do OpenStack para fornecer o GKE em Bare Metal de dois nós em um ambiente à prova de conceito bare metal em execução no OpenStack. Para informações sobre como criar um ambiente de produção com um plano de controle de alta disponibilidade, consulte a documentação do GKE em Bare Metal para atender aos requisitos do ambiente de produção.

Exemplo de implantação

Neste guia, você verá um exemplo de implantação do GKE em Bare Metal no OpenStack que se integra ao LBaaS do OpenStack. É preciso entender e ajustar os comandos e valores de configuração adequados ao seu ambiente do OpenStack. O diagrama a seguir mostra a implantação resultante:

GKE em Bare Metal instalado no OpenStack.

Pré-requisitos

  • OpenStack Ussuri com LBaaS v2 implantado e funcional
  • Conta de serviço para fazer o download da ferramenta bmctl
  • Configure as VMs e a rede do OpenStack, conforme mostrado no exemplo de implantação. Para provisionar uma configuração semelhante no ambiente do OpenStack, você tem as seguintes opções:
    1. Use este script do Terraform (em inglês) para provisionar os recursos automaticamente.
    2. Provisionar os recursos manualmente
  • As VMs do OpenStack a seguir precisam estar prontas e disponíveis por SSH:
Nome Uso Endereço IP
abm-ws 10.200.0.10 (IP privado)
flutuante_ip (IP público)
Atua como a estação de trabalho do administrador. Ela é usada para implantar o Anthos em bare metal nas outras máquinas.
abm-cp1 10.200.0.11 Plano de controle do cluster do Anthos: esse host executa o plano de controle e o balanceador de carga do Kubernetes.
abm-w1 10.200.0.12 Nó de trabalho do cluster do Anthos: este host executa as cargas de trabalho do Kubernetes.

Implante o GKE em Bare Metal

Nesta seção, mostramos como concluir as seguintes tarefas:

  1. Instale as ferramentas necessárias na VM da estação de trabalho de administrador abm-ws.
  2. Configure o ID do projeto e a conta de serviço necessários para concluir a implantação com segurança
  3. Crie um arquivo de configuração de cluster
  4. Implante o GKE em Bare Metal

Instale as ferramentas necessárias

  1. Busque 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 '"')
    
  2. Verifique se você pode se conectar com segurança à VM abm-ws via SSH e faça login como um usuário root. O usuário root, conforme configurado pelos scripts do Terraform, é abm.

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  3. Verifique se é possível usar o SSH nos outros nós.

    ssh abm@10.200.0.11 'echo SSH to $HOSTNAME succeeded'
    ssh abm@10.200.0.12 'echo SSH to $HOSTNAME succeeded'
    

    A saída esperada para os comandos acima é:

    SSH to abm-cp1 succeeded
    SSH to abm-w1 succeeded
    
  4. Faça o download do utilitário de linha de comando kubectl na VM abm-ws.

    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. Instale o Docker na VM abm-ws.

    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    sudo usermod -aG docker abm
    newgrp docker
    

Configurar o projeto e a conta de serviço do Google Cloud

  1. Consiga as credenciais de acesso da Google Cloud CLI para sua conta de usuário. Isso será usado ao usar os comandos gcloud a seguir.

    gcloud auth login
    
  2. Verifique se a Google Cloud CLI está configurada para usar o projeto do Google Cloud em que você quer que o GKE em Bare Metal sejam registrados.

    gcloud config set project PROJECT_ID
    
  3. Defina as Application Default Credentials (ADC) da conta de usuário na estação de trabalho do administrador. Ele será usado quando a ferramenta bmctl for usada para criar o cluster.

    gcloud auth application-default login
    
  4. Crie a conta de serviço bm-gcr. Use essa conta de serviço para autenticar pelo cluster do GKE em 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. Ative as APIs necessárias.

    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. Conceda permissões à conta de serviço bm-gcr. Adicionar as permissões significa que você não precisa criar várias contas de serviço para serviços individuais.

    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"
    

Criar um arquivo de configuração de cluster

  1. Faça o download do utilitário de linha de comando bmctl.

    mkdir baremetal && cd baremetal
    gsutil cp gs://anthos-baremetal-release/bmctl/1.14.11/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. Crie um espaço de trabalho do GKE em Bare Metal para o cluster.

    bmctl create config -c CLUSTER_NAME
    
  3. Crie o arquivo de configuração do cluster do GKE em 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.14.11
      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
    

Implantar

  1. Implantar o cluster.

    bmctl create cluster -c CLUSTER_NAME
    

A execução do comando bmctl começa a configurar um novo cluster híbrido. Isso inclui executar verificações de simulação nos nós, criar os clusters de administrador e usuário e registrar o cluster no Google Cloud usando o Connect. A configuração toda pode levar até 15 minutos. A saída a seguir será exibida durante a criação do cluster.

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

Verifique e interaja com o cluster

O arquivo kubeconfig do cluster pode ser encontrado na VM abm-ws dentro do diretório bmctl-workspace. Para verificar a implantação, conclua as etapas a seguir.

  1. Configure a variável de ambiente KUBECONFIG com o caminho para o arquivo de configuração do cluster para executar comandos kubectl no cluster.

    export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
    kubectl get nodes
    

    Você verá os nós do cluster impressos, semelhantes à seguinte saída:

    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
    

Fazer login no cluster pelo console do Google Cloud

Para observar as cargas de trabalho no console do Cloud, faça login no cluster. Para instruções e mais informações sobre como fazer login no cluster, consulte Como fazer login em um cluster pelo console do Google Cloud.

Limpar

É possível limpar o cluster emitindo o seguinte comando na VM da estação de trabalho do administrador (abm-ws).

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

A seguir

Agora é possível instalar o provedor de nuvem do OpenStack nos clusters recém-criados do cluster do GKE em Bare Metal seguindo as instruções em Configurar o provedor de nuvem do OpenStack para o Kubernetes. Isso permite expor seus aplicativos usando um serviço do tipo LoadBalancer, aproveitando o LBaaS do OpenStack.