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 compartido. Una carga de trabajo en contenedores se ejecuta en un clúster de Kubernetes compartido dentro de un espacio de nombres de proyecto. Los clústeres compartidos están separados lógicamente de los proyectos y entre sí para proporcionar diferentes dominios de error y garantías de aislamiento. Sin embargo, debes asegurarte de que tu clúster compartido esté asociado a un proyecto para que las cargas de trabajo en contenedores se puedan gestionar dentro de un proyecto.
Este flujo de trabajo está dirigido a los desarrolladores de aplicaciones del grupo de operadores de aplicaciones que se encargan de crear cargas de trabajo de aplicaciones para su organización. Para obtener más información, consulta el artículo sobre las audiencias de la documentación de GDC aislado.
Uno de los mayores obstáculos para desplegar 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 implementa este tutorial directamente en tu servidor de integración continua y entrega continua (CI/CD).
En este tutorial se utiliza una aplicación de servidor web de muestra disponible en el Google Cloud Artifact Registry.
Objetivos
- Crear un registro de Harbor gestionado.
- Enviar una imagen de contenedor al registro de Harbor gestionado.
- Crear un clúster de Kubernetes compartido.
- Desplegar la aplicación de contenedor de muestra 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 solo al despliegue 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 previsto para anticipar los costes futuros de las SKUs en tus facturas.
Para hacer un seguimiento del consumo de almacenamiento y de computación, utiliza 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.
Solicitar roles de IAM
Debes tener roles específicos para obtener los permisos que necesitas para completar el flujo de trabajo de este tutorial. Debes solicitar roles que se limiten 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 a tu administrador de IAM de la organización que te asigne el rol Administrador de clústeres de usuario (user-cluster-admin). Este rol no está vinculado a un espacio de nombres.
Si no tienes los permisos necesarios para crear un clúster compartido, pide a tu administrador de la plataforma que cree uno por ti.
Roles del proyecto
Pide a tu administrador de IAM del proyecto que te asigne los siguientes roles en el espacio de nombres de tu proyecto en función de la tarea que vayas a realizar:
Administrador de espacios de nombres (
namepspace-admin): crea, elimina, edita y ve recursos del proyecto. 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 ve recursos de Harbor, incluidas las instancias de Harbor.Lector 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 tu entorno
Para completar este documento, debes tener los siguientes recursos:
Asegúrate de tener un proyecto para gestionar tus despliegues 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_NAMESPACEInicia 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 en entornos aislados proporciona Harbor como servicio, que es un servicio totalmente gestionado que te permite almacenar y gestionar imágenes de contenedor mediante 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 Registro de contenedores de Harbor en la sección CI/CD.
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 la alta disponibilidad.
Haz clic en Crear instancia.
Introduce el nombre de la instancia y acepta los Términos del Servicio de Harbor gestionado.
Haz clic en Crear instancia.
Confirma que tu nueva instancia de Harbor aparece en la sección Instancia de Harbor.
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 prefijohttps://.Define la URL de la instancia como una variable para usarla más adelante en el tutorial:
export INSTANCE_URL=INSTANCE_URLSustituye 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
Crea la nueva instancia de 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.
Muestra la URL de la instancia:
gdcloud harbor instances describe INSTANCE_NAME \ --project=PROJECTEl resultado es similar al siguiente:
# Several lines of code are omitted here. status: url: https://harbor-1.org-1.zone1.google.gdc.testDefine la URL de la instancia como una variable para usarla más adelante en el tutorial:
export INSTANCE_URL=INSTANCE_URLSustituye 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
Haz clic en Crear un proyecto de Harbor en la página Container Registry 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 nuevo proyecto de Harbor:
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAMEHaz 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 el artículo sobre cómo 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 el artículo sobre cómo configurar la autenticación de Docker en instancias de registro de Harbor.
Crear un secreto de extracción de imágenes de Kubernetes
Como vas a usar un proyecto de Harbor privado, 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 Nueva cuenta de robot.
Asigna un nombre a tu 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 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.
En una nueva ventana de terminal, inicia sesión en Docker con la cuenta de robot y el token secreto de tu proyecto de Harbor:
docker login ${INSTANCE_URL}Cuando se te pida, inserta 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 confirmación de la consola de Harbor.
Define un nombre arbitrario para el secreto de extracción de imágenes:
export SECRET=SECRETCrea el secreto necesario para la extracción de imágenes:
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n ${NAMESPACE}Sustituye
DOCKER_CONFIGpor la ruta del archivo.docker/config.json.Confirma que el secreto existe en el espacio de nombres de tu proyecto de GDC:
kubectl get secrets -n ${NAMESPACE}El resultado es similar al siguiente:
NAME TYPE DATA AGE my-secret kubernetes.io/dockerconfigjson 1 23s
Enviar una imagen de contenedor al 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 muestra en un clúster de Kubernetes compartido. La aplicación de servidor web nginx está disponible en el repositorio público de Docker Hub.
Extrae la imagen
nginxde Docker Hub a tu estación de trabajo local mediante una red externa:docker pull nginxEtiqueta la imagen local con el nombre del repositorio:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25Envía la imagen de contenedor
nginxa 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 compartido 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 quieras crear tu clúster de Kubernetes. Un clúster de Kubernetes es un recurso de zona y debe crearse manualmente en cada zona para garantizar la alta disponibilidad.
Haz clic en Asociar proyecto y selecciona un proyecto para asociarlo 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 para usar, aparecerá el estado
READYjunto al nombre del clúster.
API
Crea un recurso personalizado
Clustery guárdalo como un archivo YAML, comocluster.yaml:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platformSustituye el valor
CLUSTER_NAMEpor 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 mediante 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 compartido, consulta el artículo sobre cómo crear un clúster compartido. Para obtener más información sobre las opciones de configuración de clústeres disponibles, consulta el artículo sobre las configuraciones de clústeres de Kubernetes.
Desplegar la aplicación de contenedor de muestra
Ya puedes desplegar 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 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 Deployment solo contiene 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.
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_PATHCrea y despliega los recursos personalizados
DeploymentyServicede 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 EOFComprueba que el despliegue haya creado los pods:
kubectl get pods -l app=nginx -n ${NAMESPACE}El resultado es 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 1hCrea 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 EOFExporta 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
nginxconcurl: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 de contenedor de tu entorno GDC aislado, 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:
En el menú de navegación, selecciona Registro de contenedores de Harbor en la sección CI/CD.
Haz clic en el enlace externo 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 el artículo sobre cómo eliminar instancias de registro de Harbor.
Eliminar la aplicación de contenedor
Para eliminar la aplicación de contenedor desplegada, o bien elimina el proyecto de GDC que contiene los recursos, o conserva el proyecto de GDC y elimina los recursos individuales.
Para eliminar los recursos individuales, sigue estos pasos:
Elimina el objeto
Servicede tu aplicación de contenedor:kubectl delete service nginx-service -n ${NAMESPACE}Elimina el objeto
Deploymentde 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 del clúster.
Lee la documentación sobre los contenedores de Kubernetes para GDC para obtener información sobre cómo gestionar los contenedores desplegados 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.