En este tutorial 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. Una carga de trabajo en contenedores se ejecuta en un clúster de Kubernetes dentro de un espacio de nombres de un proyecto. Los clústeres están separados lógicamente de los proyectos y entre sí para proporcionar diferentes dominios de errores y garantías de aislamiento. Sin embargo, debes asegurarte de que tu clúster esté asociado a un proyecto para que las cargas de trabajo contenerizadas se puedan gestionar en él.
Uno de los mayores obstáculos para implementar una aplicación de contenedor es conseguir el archivo binario de la aplicación en tu centro de datos aislado. Colabora con tu equipo de infraestructura y tus administradores para transportar la aplicación a tu estación de trabajo o implementar este tutorial directamente en tu servidor de integración y entrega continuas (CI/CD).
En este tutorial se usa una aplicación de servidor web de ejemplo disponible en Google CloudArtifact Registry.
Objetivos
- Crea un registro de Harbor gestionado.
- Envía una imagen de contenedor al registro de Harbor gestionado.
- Crea un clúster de Kubernetes.
- Despliega la aplicación de contenedor de ejemplo en el clúster.
Costes
Como GDC se ha diseñado para ejecutarse en un centro de datos aislado, los procesos y la información de facturación solo se aplican a la implementación de GDC y no los gestionan 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 Coste proyectado para prever los costes futuros de los SKUs de tus facturas.
Para monitorizar el consumo de almacenamiento y de recursos de computación, usa los paneles de control de uso de facturación.
Antes de empezar
Asegúrate de tener un proyecto para gestionar tus implementaciones en contenedores. Crea un proyecto si no tienes ninguno.
Define el espacio de nombres de tu proyecto como una variable de entorno:
export NAMESPACE=PROJECT_NAMESPACE
Pide al administrador de gestión de identidades y accesos de tu organización que te conceda 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 desplegar cargas de trabajo de contenedores en tu proyecto.Rol Administrador de instancias de Harbor (
harbor-instance-admin
) para el espacio de nombres de tu proyecto. Este rol es necesario para tener acceso de lectura y escritura a todos los recursos de Harbor. También es necesario para eliminar instancias de Harbor.Rol de lector de instancias de Harbor (
harbor-instance-viewer
) para el espacio de nombres de tu proyecto. Este rol es necesario para ver y seleccionar una instancia de Harbor.Rol Creador de proyectos 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 gestionarlo.Rol de administrador de clúster de usuario (
user-cluster-admin
). Este rol es necesario para crear un clúster de Kubernetes y no está vinculado a un espacio de nombres.
Inicia sesión en el servidor de la API de gestión zonal 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 air-gapped proporciona Harbor como servicio, que es un servicio totalmente gestionado que te permite almacenar y gestionar 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.
Crear una instancia de registro de Harbor
Para crear una instancia de registro de contenedores de Harbor, sigue estos pasos:
Consola
En el menú de navegación, selecciona Harbor Container Registry (Registro de contenedores de Harbor) en la sección CI/CD.
Selecciona la zona en la que quieres crear tu instancia de Harbor. Una instancia de Harbor es un recurso zonal y debe crearse manualmente en cada zona para asegurar una alta disponibilidad.
Haz clic en Crear instancia.
Introduce el nombre de la instancia y acepta los Términos del Servicio gestionado de Harbor.
Haz clic en Crear instancia.
Confirma que tu nueva instancia de Harbor aparece en la sección Instancia de Harbor.
Haga clic en el enlace externo Go to Harbor Instance (Ir a la instancia de Harbor) y anote 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 prefijohttps://
.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 del registro de Harbor.
Por ejemplo:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
Crea la nueva instancia del registro de contenedores 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.
Consulta 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
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 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
Crear un proyecto de Harbor en el registro
Debes crear un proyecto de Harbor en la instancia del registro de Harbor para gestionar tus imágenes de contenedor:
Consola
En la página Registro de contenedores de Harbor, haz clic en Crear un proyecto de Harbor.
Introduce el nombre del proyecto.
Haz clic en Crear.
Define el nombre del proyecto de Harbor como una variable para usarla más adelante en el tutorial:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
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.
Define el nombre del proyecto de Harbor como una variable para usarla más adelante en el tutorial:
export HARBOR_PROJECT=HARBOR_PROJECT
Configurar Docker
Para usar Docker en tu registro de Harbor, sigue estos pasos:
Configura Docker para que confíe en Harbor como servicio. Para obtener más información, consulta Configurar Docker para que confíe en la CA raíz de Harbor.
Configura la autenticación de Docker en Harbor. Para obtener más información, consulta Configurar la autenticación de Docker en instancias del registro de Harbor.
Crear un secreto de extracción de imágenes de Kubernetes
Como estás usando un proyecto privado de Harbor, debes crear un secreto de extracción de imágenes de Kubernetes.
Añade una cuenta de robot de proyecto de Harbor para que actúe como tu cuenta de servicio.
En la consola de Harbor, selecciona tu proyecto de Harbor.
Haz clic en Cuentas de robot.
Selecciona New Robot Account (Nueva cuenta de robot).
Asigna un nombre a la nueva cuenta de robot y define los ajustes adicionales que quieras.
Haz clic en Añadir.
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 paso siguiente.
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.
En una nueva ventana de terminal, inicia sesión en Docker con tu cuenta de robot y token secreto del proyecto de Harbor:
docker login ${INSTANCE_URL}
Cuando se te pida, inserta el nombre del proyecto del robot en el campo Nombre de usuario y el token secreto en el campo Contraseña que se te proporcionaron en el paso anterior en la pantalla de confirmación de la consola de Harbor.
Asigna un nombre arbitrario al secreto de extracción de imágenes:
export SECRET=SECRET
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
.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. La aplicación del servidor web nginx está disponible en el repositorio público de Docker Hub.
Extrae la imagen
nginx
de Docker Hub a tu estación de trabajo local mediante una red externa:docker pull nginx
Etiqueta la imagen local con el nombre del repositorio:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
Envía la imagen de contenedor
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 nginx
almacenada en el registro de Harbor gestionado y puedes acceder a ella, crea un clúster de Kubernetes para ejecutar el servidor web nginx.
Consola
En el menú de navegación, selecciona Kubernetes Engine > Clústeres.
Haz clic en Crear clúster.
En el campo Nombre, especifica un nombre para el clúster.
Selecciona la zona en la que quieres crear el clúster de Kubernetes. Un clúster de Kubernetes es un recurso zonal y debe crearse manualmente en cada zona para asegurar la alta disponibilidad.
Haz clic en Adjuntar proyecto y selecciona un proyecto para adjuntarlo a tu clúster. A continuación, haz clic en Guardar.
Haz clic en Crear.
Espera a que se cree el clúster. Cuando el clúster esté disponible, aparecerá el estado
READY
junto al nombre del clúster.
API
Crea un
Cluster
recurso personalizado y guárdalo como un archivo YAML, comocluster.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.Aplica el recurso personalizado a tu instancia de GDC:
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
Asocia un proyecto a tu clúster de Kubernetes con la consola de GDC. Por el momento, no puedes asociar un proyecto al clúster mediante la API.
Para obtener más información sobre cómo crear un clúster de Kubernetes, consulta el artículo Crear un clúster de Kubernetes.
Desplegar la aplicación de contenedor de ejemplo
Ahora ya puedes desplegar la imagen de contenedor nginx
en tu clúster de Kubernetes.
Kubernetes representa las aplicaciones como Pod
recursos, 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 implementan como un conjunto de réplicas que se pueden escalar y distribuir conjuntamente 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 Deployment tiene réplicas o pods. Un pod Deployment
contiene solo un contenedor: la imagen de contenedor nginx
. También puedes crear un recurso Service
que proporcione a los clientes una forma estable de enviar solicitudes a los pods de tu Deployment
.
Despliega el servidor web nginx en tu clúster de Kubernetes:
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
Crea e implementa los recursos personalizados
Deployment
yService
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
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
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
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}'`
Prueba la dirección IP del servidor
nginx
concurl
:curl http://$IP
Limpieza
Para evitar que se apliquen cargos en tu cuenta de GDC por los recursos utilizados en este tutorial, debes eliminar los recursos que has creado.
Eliminar la imagen de contenedor
Para eliminar la imagen del 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 del contenedor.
Para eliminar la imagen de contenedor del registro de Harbor gestionado, usa la consola de GDC:
En el menú de navegación, selecciona Harbor Container Registry (Registro de contenedores de Harbor) en la sección CI/CD.
Haz clic en el enlace externo Go to Harbor Instance (Ir a la instancia de Harbor).
Elimina la imagen de contenedor mediante la interfaz de usuario de Harbor. Para obtener más información, consulta Eliminar instancias del registro de Harbor.
Eliminar la aplicación de contenedor
Para eliminar la aplicación de contenedor implementada, elimina el proyecto de GDC que contiene los recursos o conserva el proyecto de GDC y elimina los recursos.
Para eliminar los recursos concretos, sigue estos pasos:
Elimina el objeto
Service
de tu aplicación de contenedor:kubectl delete service nginx-service -n ${NAMESPACE}
Elimina el objeto
Deployment
de tu aplicación de contenedor:kubectl delete deployment nginx-deployment -n ${NAMESPACE}
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
Consulta la jerarquía de recursos y los detalles sobre el aislamiento de recursos.
Consulta información sobre la arquitectura de clústeres.
Consulta la documentación sobre los contenedores de Kubernetes para GDC para obtener información sobre cómo gestionar los contenedores implementados en tus clústeres de Kubernetes.
Consulta cómo gestionar tus clústeres de Kubernetes una vez que se hayan desplegado tus cargas de trabajo de contenedores.
Consulta las prácticas recomendadas para configurar tus cargas de trabajo de contenedores y otros recursos de servicio.