Implementa una app de servidor web alojada en contenedores

Un clúster compartido en Google Distributed Cloud (GDC) aislado te permite ejecutar aplicaciones alojadas en contenedores en dominios con fallas aislados en toda tu organización. Después de adjuntar uno a un proyecto, puedes administrar esas cargas de trabajo dentro de un espacio de nombres dedicado. En este instructivo, configurarás un registro de Harbor administrado, enviarás una imagen de NGINX de muestra desde Docker Hub y, luego, implementarás el servidor web.

Este flujo de trabajo es para los desarrolladores dentro del grupo de operadores de aplicaciones que crean cargas de trabajo para su organización. Para obtener más información, consulta Públicos de la documentación de GDC aislado.

Objetivos

  • Crea un registro de Harbor administrado.
  • Envía una imagen de contenedor al registro de Harbor administrado.
  • Crear un clúster de Kubernetes compartido
  • Implementa la app de contenedor de ejemplo 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 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 Costo proyectado 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

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

Trabaja con tu equipo de infraestructura y administradores para transportar el objeto binario de tu aplicación a tu estación de trabajo aislada o ejecuta este instructivo directamente en tu servidor de integración continua y entrega continua (CI/CD).

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 para 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 la organización de IAM que te otorgue el rol de administrador de clústeres 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 al administrador de la plataforma que cree uno por ti.

Roles de proyecto

Pídele al administrador de proyectos de IAM 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 visualiza recursos del proyecto. Este rol es necesario para implementar cargas de trabajo de contenedores en tu proyecto.

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

  • Visualizador 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 visualiza 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 e 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. Establece 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 contenedor 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 Container Registry 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 por 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 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. Establece 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 de Container Registry 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. Establece 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 de registro de Harbor para administrar tus imágenes de contenedor:

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. 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 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. 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 AC 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 las instancias de registro de Harbor.

Crea un Secret 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 de proyecto de Harbor para que funcione 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 configuración adicional.

    5. Haz clic en Agregar.

    6. El nombre y el secreto de la cuenta de robot 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 de terminal nueva, 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 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. Establece un nombre arbitrario para el Secret de extracción de imágenes:

    export SECRET=SECRET
    
  4. Crea el Secret que se requiere 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 del proyecto de GDC:

    kubectl get secrets -n ${NAMESPACE}
    

    El resultado es similar a lo siguiente:

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

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

En 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 del servidor web nginx está disponible en el repositorio público de Docker Hub.

  1. Extrae la imagen de 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 de 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 de 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 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 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ústeres disponibles, consulta Opciones de configuración de clústeres de Kubernetes.

Implementa la app de contenedor de ejemplo

Ahora tienes todo listo para implementar la imagen de contenedor de 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. Un Pod es la unidad más pequeña que se puede implementar en Kubernetes. Por lo general, los Pods se implementan como un conjunto de réplicas que se pueden escalar y distribuir juntas en todo 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 de nginx en tu clúster. Este Deployment tiene réplicas o Pods. Un Pod de Deployment contiene solo un contenedor: la imagen de contenedor de 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 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 lo 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 nginx con curl:

      curl http://$IP
    

Realiza una limpieza

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

Borra la imagen de contenedor

Para borrar la imagen de contenedor de tu entorno de 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, 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}
    

    Con esta acción, se borran los recursos que componen el clúster de Kubernetes, como las instancias de procesamiento, los discos y los recursos de red:

¿Qué sigue?