Implementa una app de servidor web alojada en contenedores


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

Uno de los mayores obstáculos para implementar una app en un contenedor es obtener el archivo binario de la app en 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 Google CloudArtifact Registry.

Objetivos

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

Costos

Dado 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 se administran con 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 de costos proyectados para anticipar los costos futuros de los SKU en tus facturas.

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

Antes de comenzar

  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. Pídele al administrador de IAM de tu organización que te otorgue los siguientes roles:

    • Rol de administrador de espacio de nombres (namepspace-admin) para el espacio de nombres de tu proyecto Este rol es necesario para implementar cargas de trabajo de contenedores en tu proyecto.

    • Función de administrador de instancias de Harbor (harbor-instance-admin) para el espacio de nombres de tu proyecto Este rol es obligatorio para tener acceso de lectura y escritura a todos los recursos de Harbor. También es necesario para borrar instancias de Harbor.

    • Rol de visualizador de instancias de Harbor (harbor-instance-viewer) para el espacio de nombres de tu proyecto Este rol es obligatorio para ver y seleccionar una instancia de Harbor.

    • Rol de creador del proyecto de Harbor (harbor-project-creator) para el espacio de nombres de tu proyecto Este rol es necesario para acceder a un proyecto de Harbor y administrarlo.

    • Rol de administrador del clúster del usuario (user-cluster-admin): Este rol es necesario para crear un clúster de Kubernetes y no está vinculado a un espacio de nombres.

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

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Crea un registro de Harbor administrado

GDC con aislamiento de aire 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 del registro de Harbor y un proyecto de Harbor.

Crea una instancia de registro de Harbor

Para crear una instancia del 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 manualmente en cada zona 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 exista en la sección Instancia de Harbor.

  7. Haz clic en el vínculo externo Go to Harbor Instance 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 del registro de Harbor.

    Por ejemplo:

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

gdcloud

  1. Crea la nueva instancia del 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. Enumera 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 del 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 del registro de Harbor para administrar tus imágenes de contenedor:

Console

  1. Haz clic en Create A Harbor Project en la página Harbor Container Registry.

  2. Ingresa el nombre del proyecto.

  3. Haz clic en Crear.

  4. Establece 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 proyecto nuevo 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. Establece 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 del registro de Harbor.

Crea 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. 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 New Robot Account.

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

    5. Haz clic en Agregar.

    6. El nombre y el secreto de la cuenta del robot se muestran en la pantalla de éxito. Mantén esta pantalla abierta para consultarla en el próximo 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, accede a Docker con la cuenta de robot y el token secreto de tu proyecto de Harbor:

    docker login ${INSTANCE_URL}
    

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

  3. Establece un nombre arbitrario para el 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}
    

    Reemplaza DOCKER_CONFIG por la ruta de acceso al archivo .docker/config.json.

  5. Confirma que tu secreto exista 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 del contenedor al registro de Harbor administrado

En este instructivo, descargarás y enviarás la imagen del servidor web nginx al registro administrado de Harbor, y la usarás para implementar una app de servidor web nginx de muestra en un clúster de Kubernetes. La app del 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 a través de 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 del 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 del contenedor nginx almacenada en el registro de Harbor administrado y puedes acceder a ella, crea un clúster de Kubernetes 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 manualmente en cada zona para garantizar la alta disponibilidad.

  5. Haz clic en Attach Project y selecciona un proyecto para adjuntarlo 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 usarse, aparece el estado READY junto al nombre del clúster.

API

  1. Crea un recurso personalizado Cluster y guárdalo como un archivo YAML, por ejemplo, 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, consulta Crea un clúster de Kubernetes.

Implementa la app de contenedor de muestra

Ahora ya puedes implementar la imagen del 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 más pequeña que se puede implementar en Kubernetes. Por lo general, implementas los Pods como un conjunto de réplicas que se pueden escalar y distribuir juntas en el clúster. Una forma de implementar un conjunto de réplicas es a través de un Deployment de Kubernetes.

En esta sección, crearás un 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 proporcione 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. Establece la ruta 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 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 nginx con curl:

      curl http://$IP
    

Limpia

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

Borra la imagen del contenedor

Para borrar la imagen del contenedor de tu entorno aislado de GDC, borra la instancia de Harbor que contiene la imagen o conserva la instancia de Harbor y borra la imagen del 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 del contenedor con la IU de Harbor. Para obtener más información, consulta Borra instancias del registro de Harbor.

Borra la app de contenedor

Para borrar la app de contenedor implementada, 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?