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:
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. 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
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 por Harbor.
Haz clic en Crear instancia.
Confirma que tu nueva instancia de Harbor exista 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://.Establece 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 del registro de Harbor.
Por ejemplo:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
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.
Enumera 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.testEstablece 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 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
Haz clic en Crear un proyecto de Harbor en la página Harbor Container Registry.
Ingresa el nombre del proyecto.
Haz clic en Crear.
Establece 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.
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:
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.
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.
Agrega una cuenta de robot de proyecto de Harbor para que funcione 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.
Asigna un nombre a tu nueva cuenta de robot y define cualquier configuración adicional.
Haz clic en Agregar.
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.
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.
Establece un nombre arbitrario para el Secret de extracción de imágenes:
export SECRET=SECRETCrea el Secret que se requiere para extraer la imagen:
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 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.
Extrae la imagen de
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 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
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 adjuntarlo 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ú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:
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_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 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 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
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:
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, 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}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?
Explorar 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 Contenedores de Kubernetes para GDC para obtener información sobre cómo administrar los contenedores implementados en tus clústeres de Kubernetes.
Aprende a administrar tus clústeres de Kubernetes después de que se hayan implementado tus cargas de trabajo de contenedores.
Explora las prácticas recomendadas para configurar tus cargas de trabajo de contenedores y otros recursos de servicio.