Desplegar un clúster en OpenStack

En esta guía se explica cómo instalar Google Distributed Cloud (solo software) en un servidor Bare Metal en máquinas virtuales de OpenStack con sistemas operativos compatibles. La implementación usa una secuencia de comandos para simplificar la instalación de un clúster híbrido en máquinas virtuales de OpenStack. En la guía también se muestra una forma de habilitar el balanceo de carga como servicio (LBaaS). Puedes usar OpenStack LBaaS y el proveedor de servicios en la nube de Kubernetes OpenStack con Google Distributed Cloud para exponer los servicios de Kubernetes fuera del clúster de OpenStack.

Google Distributed Cloud no aprovisiona las VMs de OpenStack automáticamente, y el aprovisionamiento de las VMs no se incluye en esta guía. Para conocer los requisitos de las VMs y ver un ejemplo de implementación, consulta el ejemplo de Terraform para crear VMs de OpenStack.

La guía consta de las siguientes secciones:

  1. Desplegar Google Distributed Cloud

  2. Configura el proveedor de servicios en la nube de OpenStack para Kubernetes en el clúster instalado para integrarlo con los balanceadores de carga de Octavia.

  3. Validar la integración del proveedor de servicios en la nube de OpenStack para Kubernetes

En esta guía se usa OpenStack Ussuri, pero Google Distributed Cloud no requiere versiones específicas de OpenStack. En la guía se usan máquinas virtuales de OpenStack para proporcionarte un entorno de prueba de concepto de dos nodos que se ejecuta en OpenStack. Para ver los requisitos de instalación de producción de Google Distributed Cloud, consulta los requisitos previos de instalación.

Ejemplo de implementación

En esta guía se muestra un ejemplo de despliegue de un clúster de hardware desnudo en OpenStack que se integra con OpenStack LBaaS. Debes comprender y ajustar los comandos y los valores de configuración para adaptarlos a tu entorno de OpenStack. En el siguiente diagrama se muestra la implementación resultante:

Google Distributed Cloud instalado en OpenStack.

Requisitos previos

  • OpenStack Ussuri con LBaaS v2 desplegado y funcional
  • Cuenta de servicio para descargar la herramienta bmctl
  • Configura tus máquinas virtuales y tu red de OpenStack como se muestra en el ejemplo de implementación. Para aprovisionar una configuración similar en tu 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 manualmente.
  • Las siguientes VMs de OpenStack deben estar listas y disponibles a través de SSH:
Nombre Dirección IP Finalidad
abm-ws 10.200.0.10 (IP privada)
floating_ip (IP pública)
Actúa como estación de trabajo de administrador: se usa para desplegar Google Distributed Cloud en las demás máquinas.
abm-cp1 10.200.0.11 Plano de control del clúster: este host ejecuta el plano de control de Kubernetes y el balanceador de carga.
abm-w1 10.200.0.12 Nodo de trabajador del clúster: este host ejecuta las cargas de trabajo de Kubernetes.

Desplegar Google Distributed Cloud

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

  1. Instala las herramientas que necesites en la VM de la estación de trabajo de administrador abm-ws.
  2. Configurar el ID del proyecto y la cuenta de servicio necesarios para completar la implementación de forma segura
  3. Crear un archivo de configuración de clúster
  4. Crear un clúster

Instalar las herramientas necesarias

  1. Obtén 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 que puedes usar SSH para conectarte de forma segura a la máquina virtual abm-ws e iniciar sesión 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 puedes usar SSH para conectarte a los demás nodos:

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

    Las respuestas esperadas para los comandos anteriores son las siguientes:

    SSH to abm-cp1 succeeded
    SSH to abm-w1 succeeded
    
  4. Descarga la utilidad de línea de comandos kubectl en la máquina virtual 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
    

Configurar el Google Cloud proyecto y la cuenta de servicio

  1. Obtén las credenciales de acceso de la CLI de Google Cloud para tu cuenta de usuario.

    Estas credenciales se usan con los comandos gcloud posteriores.

    gcloud auth login
    
  2. Asegúrate de que Google Cloud CLI esté configurada para usar el proyecto Google Cloud en el que quieras registrar el clúster.

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

    gcloud auth application-default login
    
  4. Crea la cuenta de servicio bm-gcr. Esta cuenta de servicio se usa para autenticarte desde el clúster.

    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 APIs 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. Concede permisos adicionales a la cuenta de servicio bm-gcr. Al añadir los permisos, no tendrás que crear varias cuentas de servicio para cada servicio.

    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 de clúster

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

    mkdir baremetal && cd baremetal
    gcloud storage cp gs://anthos-baremetal-release/bmctl/1.33.0-gke.799/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. Crea un archivo de configuración de clúster para tu clúster:

    bmctl create config -c CLUSTER_NAME
    
  3. Actualiza el archivo de configuración para usarlo con OpenStack:

    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.33.0-gke.799
      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
    

Crear el clúster

  1. Crea el clúster:

    bmctl create cluster -c CLUSTER_NAME
    

Al ejecutar el comando bmctl, se inicia la configuración de un nuevo clúster híbrido. Esto incluye realizar comprobaciones previas en los nodos, crear los clústeres de administrador y de usuario, y registrar el clúster en Google Cloud con el agente de Connect. Todo el proceso de configuración puede tardar 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...

Verificar e interactuar con el clúster

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

  1. Define la variable de entorno KUBECONFIG con la ruta al archivo de configuración del clúster para ejecutar comandos 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 impresos, de forma similar a la siguiente salida:

    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
    

Inicia sesión en tu clúster desde la Google Cloud consola

Para observar tus cargas de trabajo en la Google Cloud consola, debes iniciar sesión en el clúster. Para obtener instrucciones y más información sobre cómo iniciar sesión en tu clúster, consulta el artículo Trabajar con clústeres desde la consola Google Cloud .

Limpieza

Para limpiar el clúster, ejecuta el siguiente comando en tu máquina virtual de estación de trabajo de administrador (abm-ws):

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

Siguientes pasos