Implementa una app de servidor web alojada en contenedores

En este instructivo, se describe cómo subir una aplicación de contenedor en un entorno aislado de Google Distributed Cloud (GDC) y ejecutarla en un clúster de Kubernetes compartido. Una carga de trabajo en contenedores se ejecuta en un clúster de Kubernetes compartido dentro de un espacio de nombres del proyecto. Los clústeres compartidos están separados lógicamente de los proyectos y entre sí para proporcionar diferentes dominios de fallas y garantías de aislamiento. Sin embargo, debes asegurarte de que tu clúster compartido esté conectado a un proyecto para permitir que las cargas de trabajo en contenedores se administren dentro de un proyecto.

Este flujo de trabajo es para desarrolladores de aplicaciones dentro del grupo de operadores de aplicaciones que son responsables de crear cargas de trabajo de aplicaciones para su organización. Para obtener más información, consulta Públicos de la documentación de Google Distributed Cloud aislado.

Uno de los mayores obstáculos para implementar una app de contenedor es llevar el objeto binario de la app a tu centro de datos aislado. Trabaja con tu equipo de infraestructura y administradores para transportar la aplicación a tu estación de trabajo o implementar este instructivo directamente en tu servidor de integración continua y entrega continua (CI/CD).

En este instructivo, se usa una app de servidor web de muestra disponible en el Google Cloud Artifact Registry.

Objetivos

  • Crea un registro de Harbor administrado.
  • Envía una imagen de contenedor al registro de Harbor administrado.
  • Crea un clúster de Kubernetes compartido.
  • Implementa la app de contenedor de muestra en el clúster.

Costos

Debido a que GDC está diseñado para ejecutarse en un centro de datos aislado, los procesos y la información de facturación se limitan solo a la implementación de GDC y no son administrados por otros productos de Google.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Usa el panel Costo proyectado para anticipar los costos futuros de SKU para tus facturas.

Para hacer un seguimiento del consumo de almacenamiento y procesamiento, usa los paneles Uso de facturación.

Antes de comenzar

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

Solicita roles de IAM

Debes tener roles específicos para obtener los permisos que necesitas para completar este flujo de trabajo del instructivo. Debes solicitar roles con alcance en tu proyecto y organización.

Roles de la organización

Para crear, borrar, editar o ver un clúster de Kubernetes compartido, pídele a tu administrador de IAM de la organización que te otorgue el rol de Administrador de clúster de usuario (user-cluster-admin). Este rol no está vinculado a un espacio de nombres.

Si no tienes los permisos para crear un clúster compartido, pídele a tu administrador de la plataforma que cree uno por ti.

Funciones de proyecto

Pídele a tu administrador de IAM del proyecto que te otorgue los siguientes roles en el espacio de nombres de tu proyecto según la tarea que se realizará:

  • Administrador de espacio de nombres (namepspace-admin): Crea, borra, edita y ve los recursos del proyecto. Este rol es obligatorio para implementar cargas de trabajo de contenedores en tu proyecto.

  • Administrador de instancias de Harbor (harbor-instance-admin): Crea, borra, edita y ve los recursos de Harbor, incluidas las instancias de Harbor.

  • Visualizador de instancias de Harbor (harbor-instance-viewer): Ve y selecciona una instancia de Harbor.

  • Creador de proyectos de Harbor (harbor-project-creator): Crea y ve proyectos de Harbor.

Prepara el entorno

Para completar este documento, debes tener los siguientes recursos:

  1. Asegúrate de tener un proyecto para administrar tus implementaciones en contenedores. Crea un proyecto si no tienes uno.

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

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Descarga y, luego, instala la CLI de gdcloud.

  4. Accede al servidor de la API de administración zonal y genera su archivo kubeconfig con una identidad de usuario. Configura la ruta de acceso de kubeconfig como una variable de entorno:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Crea un registro de Harbor administrado

GDC aislado proporciona Harbor como servicio, que es un servicio completamente administrado que te permite almacenar y administrar imágenes de contenedores con Harbor.

Para usar Harbor como servicio, primero debes crear una instancia de registro de Harbor y un proyecto de Harbor.

Crea una instancia de registro de Harbor

Para crear una instancia de registro de contenedores de Harbor, completa los siguientes pasos:

Console

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

  2. Selecciona la zona en la que deseas crear tu instancia de Harbor. Una instancia de Harbor es un recurso zonal y se debe crear en cada zona de forma manual para garantizar la alta disponibilidad.

  3. Haz clic en Crear instancia.

  4. Ingresa el nombre de la instancia y acepta las Condiciones del Servicio administradas de Harbor.

  5. Haz clic en Crear instancia.

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

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

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

    export INSTANCE_URL=INSTANCE_URL
    

    Reemplaza 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 registro de contenedores de Harbor:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT \
    

    Reemplaza lo siguiente:

    • INSTANCE_NAME: Es el nombre de la instancia de Harbor.
    • PROJECT: Es el nombre del proyecto de GDC.
  2. Muestra 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. Configura la URL de la instancia como una variable para usarla más adelante en el instructivo:

    export INSTANCE_URL=INSTANCE_URL
    

    Reemplaza 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
    

Crea un proyecto de Harbor en el registro

Debes crear un proyecto de Harbor dentro de la instancia de registro de Harbor para administrar tus imágenes de contenedores:

Console

  1. Haz clic en Crear un proyecto de Harbor en la página Harbor Container Registry.

  2. Ingresa el nombre del proyecto.

  3. Haz clic en Crear.

  4. Configura el nombre del proyecto de Harbor como una variable para usarla más adelante en el instructivo:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. Crea el nuevo proyecto de Harbor:

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

    Reemplaza lo siguiente:

    • HARBOR_PROJECT: Es el nombre del proyecto de Harbor que se creará.
    • PROJECT: Es el nombre del proyecto de GDC.
    • INSTANCE_NAME: Es el nombre de la instancia de Harbor.
  2. Configura el nombre del proyecto de Harbor como una variable para usarla más adelante en el instructivo:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

Configura el Docker

Para usar Docker en tu registro de Harbor, completa los siguientes pasos:

  1. Configura Docker para que confíe en Harbor como servicio. Para obtener más información, consulta Configura 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 Configura la autenticación de Docker en instancias de registro de Harbor.

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

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

  1. Agrega una cuenta de robot del proyecto de Harbor para que actúe como tu cuenta de servicio.

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

    2. Haz clic en Cuentas de robot.

    3. Selecciona Nueva cuenta de robot.

    4. Asigna un nombre a tu nueva cuenta de robot y define cualquier configuración adicional.

    5. Haz clic en Agregar.

    6. El nombre de la cuenta de robot y el secreto se muestran en la pantalla de éxito. 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 ventana nueva de terminal, accede a Docker con tu cuenta de robot del proyecto de Harbor y el token secreto:

    docker login ${INSTANCE_URL}
    

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

  3. Configura un nombre arbitrario para el secreto de extracción de imágenes:

    export SECRET=SECRET
    
  4. Crea el secreto que se requiere para la extracción de imágenes:

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

    Reemplaza DOCKER_CONFIG por la ruta de acceso 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 es similar a este:

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

Envía la imagen de contenedor al registro de Harbor administrado

Para este instructivo, descargarás y enviarás la imagen del servidor web nginx al registro de Harbor administrado y la usarás para implementar una app de servidor web nginx de muestra en un clúster de Kubernetes compartido. La app 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 con 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 nginx a tu registro de Harbor administrado:

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

Crea un clúster de Kubernetes

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

Console

  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 deseas crear tu clúster de Kubernetes. Un clúster de Kubernetes es un recurso zonal y se debe crear en cada zona de forma manual para garantizar la alta disponibilidad.

  5. Haz clic en Adjuntar proyecto y selecciona un proyecto para adjuntar a tu clúster. Luego, 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 usar, aparecerá el estado READY junto al nombre del clúster.

API

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

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

    Reemplaza 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. Adjunta un proyecto a tu clúster de Kubernetes con la consola de GDC. Por el momento, no puedes adjuntar un proyecto al clúster con la API.

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

Implementa la app de contenedor de muestra

Ya estás listo para implementar la imagen de contenedor nginx en tu clúster de Kubernetes.

Kubernetes representa las aplicaciones como recursos Pod, que son unidades escalables que contienen uno o más contenedores. El pod es la unidad implementable más pequeña en Kubernetes. Por lo general, implementas pods como un conjunto de réplicas que se pueden escalar y distribuir juntos en tu clúster. Una forma de implementar un conjunto de réplicas es a través de una Deployment de Kubernetes.

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

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

  1. Accede al clúster de Kubernetes y genera su archivo kubeconfig con una identidad de usuario. Configura la ruta de acceso de kubeconfig como una variable de entorno:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. Crea e implementa 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 la implementación haya creado los pods:

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

    El resultado es similar a este:

    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 para el 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 nginx con curl:

      curl http://$IP
    

Limpia

Para evitar que se generen cargos en tu cuenta de GDC por los recursos que se usan en este instructivo, debes borrar los recursos que creaste.

Borra la imagen de contenedor

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

Para borrar la imagen de contenedor del registro de Harbor administrado, 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 vínculo externo Ir a la instancia de Harbor.

  3. Borra la imagen de contenedor con la IU de Harbor. Para obtener más información, consulta Borra instancias de registro de Harbor.

Borra la app de contenedor

Para borrar la app de contenedor implementada, o bien borra el proyecto de GDC que contiene los recursos, o conserva el proyecto de GDC y borra los recursos individuales.

Para borrar los recursos individuales, completa los siguientes pasos:

  1. Borra el objeto Service de tu app de contenedor:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Borra el objeto Deployment de tu app de contenedor:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. Si creaste un clúster de Kubernetes de prueba solo para este instructivo, bórralo:

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

    De este modo, se borran los recursos que conforman el clúster de Kubernetes, como las instancias de procesamiento, los discos y los recursos de red:

¿Qué sigue?