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:
Asegúrate de tener un proyecto para administrar tus implementaciones en contenedores. Crea un proyecto si no tienes uno.
Configura el espacio de nombres de tu proyecto como una variable de entorno:
export NAMESPACE=PROJECT_NAMESPACEAccede 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
En el menú de navegación, selecciona Harbor Container Registry en la sección CI/CD.
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.
Haz clic en Crear instancia.
Ingresa el nombre de la instancia y acepta las Condiciones del Servicio administradas de Harbor.
Haz clic en Crear instancia.
Confirma que tu nueva instancia de Harbor existe en la sección Instancia de Harbor.
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 prefijohttps://.Configura la URL de la instancia como una variable para usarla más adelante en el instructivo:
export INSTANCE_URL=INSTANCE_URLReemplaza 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 \Reemplaza lo siguiente:
INSTANCE_NAME: Es el nombre de la instancia de Harbor.PROJECT: Es 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.testConfigura la URL de la instancia como una variable para usarla más adelante en el instructivo:
export INSTANCE_URL=INSTANCE_URLReemplaza 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
Haz clic en Crear un proyecto de Harbor en la página Harbor Container Registry.
Ingresa el nombre del proyecto.
Haz clic en Crear.
Configura el nombre del proyecto de Harbor como una variable para usarla más adelante en el instructivo:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
Crea el nuevo proyecto de Harbor:
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAMEReemplaza 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.
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:
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.
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.
Agrega una cuenta de robot del 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 cualquier configuración adicional.
Haz clic en Agregar.
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.
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.
Configura un nombre arbitrario para el secreto de extracción de imágenes:
export SECRET=SECRETCrea 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_CONFIGpor la ruta de acceso 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 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.
Extrae la imagen
nginxde Docker Hub a tu estación de trabajo local con 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 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
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 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.
Haz clic en Adjuntar proyecto y selecciona un proyecto para adjuntar a tu clúster. Luego, 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: platformReemplaza 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}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:
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_PATHCrea e implementa 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 EOFVerifica 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 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 para el 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
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:
En el menú de navegación, selecciona Harbor Container Registry en la sección CI/CD.
Haz clic en el vínculo externo Ir a la instancia de Harbor.
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:
Borra el objeto
Servicede tu app de contenedor:kubectl delete service nginx-service -n ${NAMESPACE}Borra el objeto
Deploymentde tu app de contenedor:kubectl delete deployment nginx-deployment -n ${NAMESPACE}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?
Explora la jerarquía de recursos y los detalles sobre el aislamiento de recursos.
Obtén más información sobre la arquitectura del clúster.
Lee la documentación de los contenedores de Kubernetes para GDC para obtener información sobre cómo administrar los contenedores implementados en tus clústeres de Kubernetes.
Obtén información para administrar tus clústeres de Kubernetes después de que se implementaron tus cargas de trabajo de contenedores.
Explora las prácticas recomendadas para configurar tus cargas de trabajo de contenedores y otros recursos de servicio.