Desplegar una aplicación de servidor web en un contenedor

Un clúster compartido en Google Distributed Cloud (GDC) aislado te permite ejecutar aplicaciones en contenedores en dominios del fallo aislados de tu organización. Después de adjuntar uno a un proyecto, puedes gestionar esas cargas de trabajo en un espacio de nombres específico. En este tutorial, configurarás un registro de Harbor gestionado, enviarás una imagen de NGINX de ejemplo desde Docker Hub y desplegarás el servidor web.

Este flujo de trabajo está dirigido a los desarrolladores del grupo de operadores de aplicaciones que crean cargas de trabajo para su organización. Para obtener más información, consulta la documentación de Audiencias para GDC aislado.

Objetivos

  • Crea un registro de Harbor gestionado.
  • Envía una imagen de contenedor al registro de Harbor gestionado.
  • Crea un clúster de Kubernetes compartido.
  • Despliega la aplicación de contenedor de ejemplo en el clúster.

Costes

Como GDC está diseñado para ejecutarse en un centro de datos aislado, los procesos y la información de facturación se limitan únicamente al despliegue de GDC y no se gestionan con otros productos de Google.

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Usa el panel de control de costes previstos para anticipar los costes futuros de los SKUs de tus facturas.

Para hacer un seguimiento del consumo de almacenamiento y computación, usa los paneles de control de uso de facturación.

Antes de empezar

Para completar las tareas de este documento, debes solicitar los permisos necesarios y preparar tu entorno.

Colabora con tu equipo de infraestructura y tus administradores para transferir el binario de tu aplicación a tu estación de trabajo aislada o sigue este tutorial directamente en tu servidor de integración y entrega continuas (CI/CD).

Solicitar roles de gestión de identidades y accesos

Debes tener roles específicos para obtener los permisos que necesitas para completar este flujo de trabajo del tutorial. Debes solicitar roles que se apliquen a tu proyecto y a tu organización.

Roles de la organización

Para crear, eliminar, editar o ver un clúster de Kubernetes compartido, pide al administrador de la organización de gestión de identidades y accesos que te asigne el rol Administrador de clústeres de usuarios (user-cluster-admin). Este rol no está vinculado a un espacio de nombres.

Si no tienes permisos para crear un clúster compartido, pide al administrador de tu plataforma que cree uno.

Roles de proyecto

Pide al administrador de proyectos de gestión de identidades y accesos que te asigne los siguientes roles en el espacio de nombres de tu proyecto en función de la tarea que quieras realizar:

  • Administrador de espacio de nombres (namepspace-admin): puede crear, eliminar, editar y ver recursos de proyectos. Este rol es necesario para desplegar cargas de trabajo de contenedores en tu proyecto.

  • Administrador de instancias de Harbor (harbor-instance-admin): crea, elimina, edita y consulta recursos de Harbor, incluidas las instancias de Harbor.

  • Visor de instancias de Harbor (harbor-instance-viewer): permite ver y seleccionar una instancia de Harbor.

  • Creador de proyectos de Harbor (harbor-project-creator): crea y consulta proyectos de Harbor.

Prepara tu entorno

Para completar este documento, debes tener los siguientes recursos:

  1. Asegúrate de que tienes un proyecto para gestionar tus despliegues en contenedores. Crea un proyecto si no tienes ninguno.

  2. Define el espacio de nombres de tu proyecto como una variable de entorno:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Descarga e instala la CLI gdcloud.

  4. Inicia sesión en el servidor de la API de gestión de zonas y genera su archivo kubeconfig con una identidad de usuario. Define la ruta de kubeconfig como una variable de entorno:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Crear un registro de Harbor gestionado

GDC aislado ofrece Harbor as a Service, un servicio totalmente gestionado que te permite almacenar y gestionar imágenes de contenedor con Harbor.

Para usar Harbor as a Service, primero debes crear una instancia de registro de Harbor y un proyecto de Harbor.

Crear instancia de registro de Harbor

Para crear una instancia de Container Registry de Harbor, sigue estos pasos:

Consola

  1. En el menú de navegación, selecciona Harbor Container Registry en la sección CI/CD.

  2. Selecciona la zona en la que quieras crear tu instancia de Harbor. Una instancia de Harbor es un recurso de zona y debe crearse manualmente en cada zona para garantizar una alta disponibilidad.

  3. Haz clic en Crear instancia.

  4. Introduce el nombre de la instancia y acepta los Términos del Servicio de Harbor Managed.

  5. Haz clic en Crear instancia.

  6. Confirma que la nueva instancia de Harbor aparece en la sección Instancia de Harbor.

  7. Haz clic en el enlace externo Ir a la instancia de Harbor y anota la URL de la instancia. Por ejemplo, el formato de la URL de la instancia es similar a harbor-1.org-1.zone1.google.gdc.test. La URL de la instancia no debe incluir el prefijo https://.

  8. Define la URL de la instancia como una variable para usarla más adelante en el tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

    Sustituye INSTANCE_URL por la URL de la instancia de registro de Harbor.

    Por ejemplo:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

gdcloud

  1. Crea la nueva instancia de Container Registry de Harbor:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT
    

    Haz los cambios siguientes:

    • INSTANCE_NAME: el nombre de la instancia de Harbor.
    • PROJECT: el nombre del proyecto de GDC.
  2. Indica la URL de la instancia:

    gdcloud harbor instances describe INSTANCE_NAME \
        --project=PROJECT
    

    El resultado es similar al siguiente:

    # Several lines of code are omitted here.
    status:
      url: https://harbor-1.org-1.zone1.google.gdc.test
    
  3. Define la URL de la instancia como una variable para usarla más adelante en el tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

    Sustituye INSTANCE_URL por la URL de la instancia de registro de Harbor. Asegúrate de que la URL de la instancia no incluya el prefijo https://.

    Por ejemplo:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

Crear un proyecto de Harbor en el registro

Debes crear un proyecto de Harbor en la instancia de registro de Harbor para gestionar tus imágenes de contenedor:

Consola

  1. En la página Harbor Container Registry, haz clic en Create A Harbor Project (Crear un proyecto de Harbor).

  2. Introduce el nombre del proyecto.

  3. Haz clic en Crear.

  4. Define el nombre del proyecto de Harbor como una variable para usarlo más adelante en el tutorial:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. Crea el proyecto de Harbor:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=PROJECT \
        --instance=INSTANCE_NAME
    

    Haz los cambios siguientes:

    • HARBOR_PROJECT: el nombre del proyecto de Harbor que se va a crear.
    • PROJECT: el nombre del proyecto de GDC.
    • INSTANCE_NAME: el nombre de la instancia de Harbor.
  2. Define el nombre del proyecto de Harbor como una variable para usarlo más adelante en el tutorial:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

Configurar Docker

No es necesario que configures la confianza en los nodos de tu clúster, ya que GDC los configura para que confíen en tu instancia de registro de Harbor automáticamente. Para obtener más información, consulta Confianza de los nodos de clúster para las instancias de registro de Harbor.

Para usar Docker en tu estación de trabajo con tu registro de Harbor, sigue estos pasos:

  1. Configura Docker para que confíe en Harbor as a Service. Para obtener más información, consulta Configurar Docker para que confíe en la CA raíz de Harbor.

  2. Configura la autenticación de Docker en Harbor. Para obtener más información, consulta Configurar la autenticación de Docker en instancias de registro de Harbor.

Crear un secreto de extracción de imágenes de Kubernetes

Como usas un proyecto privado de Harbor, debes crear un secreto de extracción de imágenes de Kubernetes.

  1. Añade una cuenta de robot de proyecto de Harbor para que sirva como tu cuenta de servicio.

    1. En la consola de Harbor, selecciona tu proyecto de Harbor.

    2. Haz clic en Robot Accounts (Cuentas de robot).

    3. Selecciona New Robot Account (Nueva cuenta de robot).

    4. Asigna un nombre a la nueva cuenta de robot y define los ajustes adicionales.

    5. Haz clic en Añadir.

    6. El nombre y el secreto de la cuenta de robot se muestran en la pantalla de confirmación. Mantén esta pantalla abierta para consultarla en el siguiente paso.

    Para obtener más información, consulta la documentación de Harbor: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.

  2. En una nueva ventana de la terminal, inicia sesión en Docker con tu cuenta de robot del proyecto de Harbor y el token secreto:

    docker login ${INSTANCE_URL}
    

    Cuando se te solicite, introduce el nombre del proyecto de robot en Nombre de usuario y el token secreto en Contraseña que se proporcionaron en el paso anterior en la pantalla de éxito de la consola de Harbor.

  3. Asigna un nombre arbitrario al secreto de extracción de imágenes:

    export SECRET=SECRET
    
  4. Crea el secreto necesario para extraer la imagen:

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n ${NAMESPACE}
    

    Sustituye DOCKER_CONFIG por la ruta al archivo .docker/config.json.

  5. Confirma que tu secreto existe en el espacio de nombres de tu proyecto de GDC:

    kubectl get secrets -n ${NAMESPACE}
    

    El resultado debería ser similar al siguiente:

    NAME          TYPE                               DATA     AGE
    my-secret     kubernetes.io/dockerconfigjson     1        23s
    

Enviar una imagen de contenedor a un registro de Harbor gestionado

En este tutorial, descargarás y enviarás la imagen del servidor web nginx al registro de Harbor gestionado, y la usarás para desplegar una aplicación de servidor web nginx de ejemplo en un clúster de Kubernetes compartido. La aplicación de servidor web nginx está disponible en el repositorio público de Docker Hub.

  1. Extrae la imagen nginx de Docker Hub a tu estación de trabajo local mediante una red externa:

    docker pull nginx
    
  2. Etiqueta la imagen local con el nombre del repositorio:

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. Envía la imagen de contenedor de nginx a tu registro de Harbor gestionado:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

Crear un clúster de Kubernetes

Ahora que tienes la imagen de contenedor de nginx almacenada en el registro de Harbor gestionado y puedes acceder a ella, crea un clúster de Kubernetes compartido para ejecutar el servidor web nginx.

Consola

  1. En el menú de navegación, selecciona Kubernetes Engine > Clústeres.

  2. Haz clic en Crear clúster.

  3. En el campo Nombre, especifica un nombre para el clúster.

  4. Selecciona la zona en la que quieres crear el clúster de Kubernetes. Un clúster de Kubernetes es un recurso de zona y debe crearse manualmente en cada zona para garantizar una alta disponibilidad.

  5. Haz clic en Adjuntar proyecto y selecciona el proyecto que quieras adjuntar a tu clúster. A continuación, haz clic en Guardar.

  6. Haz clic en Crear.

  7. Espera a que se cree el clúster. Cuando el clúster esté disponible para su uso, aparecerá el estado READY junto al nombre del clúster.

API

  1. Crea un recurso personalizado de Cluster y guárdalo como un archivo YAML, como cluster.yaml:

    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    

    Sustituye el valor CLUSTER_NAME por el nombre del clúster.

  2. Aplica el recurso personalizado a tu instancia de GDC:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. Asigna un proyecto a tu clúster de Kubernetes mediante la consola de GDC. Por el momento, no puedes adjuntar un proyecto al clúster mediante la API.

Para obtener más información sobre cómo crear un clúster de Kubernetes compartido, consulta Crear un clúster compartido. Para obtener más información sobre las opciones de configuración de clústeres disponibles, consulta Configuraciones de clústeres de Kubernetes.

Desplegar la aplicación de contenedor de muestra

Ya puedes desplegar la imagen de contenedor de nginx en tu clúster de Kubernetes.

Kubernetes representa las aplicaciones como recursos de Pod, que son unidades escalables que contienen uno o varios contenedores. El pod es la unidad desplegable más pequeña de Kubernetes. Normalmente, los pods se despliegan como un conjunto de réplicas que se pueden escalar y distribuir juntas en el clúster. Una forma de desplegar un conjunto de réplicas es mediante un Deployment de Kubernetes.

En esta sección, crearás un Deployment de Kubernetes para ejecutar la aplicación de contenedor nginx en tu clúster. Este despliegue tiene réplicas o pods. Un pod de Deployment contiene solo un contenedor: la imagen de contenedor de nginx. También creas un recurso Service que proporciona una forma estable para que los clientes envíen solicitudes a los pods de tu Deployment.

Despliega el servidor web nginx en tu clúster de Kubernetes:

  1. Inicia sesión en el clúster de Kubernetes y genera su archivo kubeconfig con una identidad de usuario. Define la ruta de kubeconfig como una variable de entorno:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. Crea y despliega los recursos personalizados Deployment y Service de Kubernetes:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
            ports:
            - containerPort: 80
          imagePullSecrets:
          - name: ${SECRET}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
        - port: 80
          protocol: TCP
      type: LoadBalancer
    EOF
    
  3. Verifica que el despliegue haya creado los pods:

    kubectl get pods -l app=nginx -n ${NAMESPACE}
    

    El resultado debería ser similar al siguiente:

    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1882529037-6p4mt   1/1       Running   0          1h
    nginx-deployment-1882529037-p29za   1/1       Running   0          1h
    nginx-deployment-1882529037-s0cmt   1/1       Running   0          1h
    
  4. Crea una política de red para permitir todo el tráfico de red al espacio de nombres:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    
  5. Exporta la dirección IP del servicio nginx:

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  6. Prueba la dirección IP del servidor de nginx con curl:

      curl http://$IP
    

Limpieza

Para evitar que se apliquen cargos a tu cuenta de GDC por los recursos usados en este tutorial, debes eliminar los recursos que has creado.

Eliminar la imagen de contenedor

Para eliminar la imagen de contenedor de tu entorno aislado de GDC, elimina la instancia de Harbor que contiene la imagen o conserva la instancia de Harbor y elimina la imagen de contenedor individual.

Para eliminar la imagen de contenedor del registro de Harbor gestionado, usa la consola de GDC:

  1. En el menú de navegación, selecciona Harbor Container Registry en la sección CI/CD.

  2. Haz clic en el enlace externo Ir a la instancia de Harbor.

  3. Elimina la imagen de contenedor con la interfaz de usuario de Harbor. Para obtener más información, consulta Eliminar instancias de registro de Harbor.

Eliminar la aplicación contenedora

Para eliminar la aplicación de contenedor desplegada, puedes eliminar el proyecto de GDC que contiene los recursos o conservar el proyecto de GDC y eliminar los recursos individuales.

Para eliminar los recursos individuales, sigue estos pasos:

  1. Elimina el objeto Service de tu aplicación de contenedor:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Elimina el objeto Deployment de tu aplicación de contenedor:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. Si has creado un clúster de Kubernetes de prueba solo para este tutorial, elimínalo:

    kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \
        -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
    

    De esta forma, se eliminan los recursos que componen el clúster de Kubernetes, como las instancias de computación, los discos y los recursos de red:

Siguientes pasos