Implementa GDCV para Bare Metal en OpenStack

GKE en Bare Metal admite el uso de OpenStack como una plataforma de nube privada. Esta compatibilidad te permite usar los siguientes servicios de OpenStack:

  • Infraestructura como servicio (IaaS)
  • Balanceo de cargas como servicio (LBaaS)
  • Almacenamiento

Puedes implementar GKE en Bare Metal que se ejecute en máquinas virtuales (VMs) de OpenStack con sistemas operativos compatibles. GKE en Bare Metal no aprovisiona las VMs automáticamente, y el aprovisionamiento de las VMs está fuera del alcance de esta guía. Para conocer los requisitos de VM y revisar una implementación de ejemplo, consulta el ejemplo de Terraform a fin de crear VM de OpenStack.

Puedes usar el LBaaS de OpenStack y el proveedor de servicios en la nube de Kubernetes de OpenStack en GKE en Bare Metal para exponer los servicios de Kubernetes fuera del clúster de OpenStack.

La guía consta de las siguientes secciones:

  1. Implementa GKE en Bare Metal
  2. Configura el proveedor de servicios en la nube de OpenStack para Kubernetes en GKE en Bare Metal a fin de integrarlo en los balanceadores de cargas Octavia.
  3. Valida el proveedor de servicios en la nube de OpenStack para la integración de Kubernetes

En esta guía, se usa OpenStack ussuri, pero podría funcionar con versiones anteriores de OpenStack. Las versiones anteriores de OpenStack no se probaron. En esta guía, se usan las VM de OpenStack para brindarte un entorno de prueba de concepto de Bare Metal que se ejecuta en OpenStack. Para obtener información sobre cómo crear un entorno de producción con un plano de control de alta disponibilidad, consulta la documentación de GKE en Bare Metal para conocer los requisitos del entorno de producción.

Implementación de ejemplo

En esta guía, se proporciona un ejemplo de implementación de GKE en Bare Metal en OpenStack que se integra con LBaaS de OpenStack. Debes comprender y ajustar los comandos y los valores de configuración para que se ajusten a tu entorno de OpenStack. En el siguiente diagrama, se muestra la implementación resultante:

GKE en Bare Metal instalado en OpenStack

Requisitos previos

  • OpenStack Ussuri con LBaaS v2 implementado y funcional
  • Cuenta de servicio para descargar la herramienta bmctl
  • Configura las VM y la red de OpenStack como se muestra en el ejemplo de implementación. Para aprovisionar una configuración similar en el entorno de OpenStack, tienes las siguientes opciones:
    1. Usa esta secuencia de comandos de Terraform para aprovisionar los recursos automáticamente.
    2. Aprovisiona los recursos de forma manual.
  • Las siguientes VM de OpenStack deben estar listas y disponibles a través de SSH:
Nombre Uso Dirección IP
abm-ws 10.200.0.10 (IP privada)
float_ip (IP pública)
Actúa como la estación de trabajo de administrador. Se usa para implementar Anthos en equipos físicos a las otras máquinas.
abm-cp1 10.200.0.11 Plano de control del clúster de Anthos: Este host ejecuta el plano de control de Kubernetes y el balanceador de cargas.
abm-w1 10.200.0.12 Nodo trabajador de clúster de Anthos: Este host ejecuta las cargas de trabajo de Kubernetes.

Implementa GKE en Bare Metal

En esta sección, se muestra cómo completar las siguientes tareas:

  1. Instalar las herramientas que necesitas en la VM de estación de trabajo de administrador abm-ws.
  2. Configurar el ID del proyecto y la cuenta de servicio que se necesitan para completar la implementación de forma segura
  3. Crear un archivo de configuración del clúster
  4. Implementa GKE en Bare Metal

Instala las herramientas que necesitas

  1. Recupera la dirección IP flotante pública de la 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. Asegúrate de poder conectarte de forma segura a la VM abm-ws a través de SSH y acceder como usuario root. El usuario root configurado por las secuencias de comandos de Terraform es abm.

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  3. Verifica que puedas establecer una conexión SSH a los otros nodos.

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

    El resultado esperado para los comandos anteriores es el siguiente:

    SSH to abm-cp1 succeeded
    SSH to abm-w1 succeeded
    
  4. Descarga la utilidad de línea de comandos de kubectl en la 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. Instala Docker en la VM abm-ws.

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

Configura el proyecto y la cuenta de servicio de Google Cloud

  1. Obtén credenciales de acceso a Google Cloud CLI para tu cuenta de usuario. Se usará cuando se usen los comandos de gcloud que siguen.

    gcloud auth login
    
  2. Asegúrate de que Google Cloud CLI esté configurado para usar el proyecto de Google Cloud en el que quieres que se registre GKE en Bare Metal.

    gcloud config set project PROJECT_ID
    
  3. Configura las credenciales predeterminadas de la aplicación (ADC) para tu cuenta de usuario en la estación de trabajo de administrador. Se usará cuando se usa la herramienta bmctl para crear el clúster.

    gcloud auth application-default login
    
  4. Crea la cuenta de servicio bm-gcr. Usa esta cuenta de servicio para autenticarte desde el clúster de GKE en 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. Habilita las API necesarias.

    gcloud services enable \
      anthos.googleapis.com \
      anthosaudit.googleapis.com \
      anthosgke.googleapis.com \
      cloudresourcemanager.googleapis.com \
      connectgateway.googleapis.com \
      container.googleapis.com \
      gkeconnect.googleapis.com \
      gkehub.googleapis.com \
      gkeonprem.googleapis.com \
      iam.googleapis.com \
      logging.googleapis.com \
      monitoring.googleapis.com \
      opsconfigmonitoring.googleapis.com \
      serviceusage.googleapis.com \
      stackdriver.googleapis.com \
      storage.googleapis.com
    
  6. Otorga permisos adicionales a la cuenta de servicio bm-gcr. Cuando agregas permisos, no necesitas crear varias cuentas de servicio para servicios individuales.

    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"
    

Crear un archivo de configuración del clúster

  1. Descarga la utilidad de línea de comandos de bmctl.

    mkdir baremetal && cd baremetal
    gsutil cp gs://anthos-baremetal-release/bmctl/1.16.8/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. Crea un lugar de trabajo de GKE en Bare Metal para tu clúster.

    bmctl create config -c CLUSTER_NAME
    
  3. Crea el archivo de configuración para tu clúster de GKE en 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.16.8
      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
    

Implementar

  1. Implemente el clúster:

    bmctl create cluster -c CLUSTER_NAME
    

La ejecución del comando bmctl comienza a configurar un clúster híbrido nuevo. Esto incluye realizar comprobaciones previas en los nodos, crear los clústeres de administrador y de usuario, y registrar el clúster con Google Cloud mediante Connect. La configuración completa puede demorar hasta 15 minutos. Verás el siguiente resultado mientras se crea el clúster:

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

Verifica el clúster e interactúa con él

Puedes encontrar el archivo kubeconfig de tu clúster en la VM de abm-ws dentro del directorio bmctl-workspace. Para verificar tu implementación, completa los siguientes pasos.

  1. Configura la variable de entorno KUBECONFIG con la ruta al archivo de configuración del clúster a fin de ejecutar comandos de kubectl en el clúster:

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

    Deberías ver los nodos del clúster impreso, de manera similar al siguiente resultado:

    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  
    

Accede a tu clúster desde la consola de Google Cloud

Para observar tus cargas de trabajo en la consola de Google Cloud, debes acceder al clúster. Para obtener instrucciones y más información sobre cómo acceder a tu clúster, consulta Accede a un clúster desde la consola de Google Cloud.

Limpia

Para limpiar el clúster, ejecuta el siguiente comando en la VM de la estación de trabajo de administrador (abm-ws).

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

Próximos pasos

Ahora puedes instalar el proveedor de servicios en la nube de OpenStack en el clúster de GKE en Bare Metal recién creado siguiendo las instrucciones de la guía Configura el proveedor de servicios en la nube de OpenStack para Kubernetes. Esto te permite exponer tus aplicaciones mediante un servicio de tipo LoadBalancer y aprovechar LBaaS de OpenStack.