Implemente cargas de trabajo desde DevOps canalizaciones de Azure a clústeres privados de Amazon EKS - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Implemente cargas de trabajo desde DevOps canalizaciones de Azure a clústeres privados de Amazon EKS

Mahendra Revanasiddappa, Amazon Web Services

Resumen

Este patrón demuestra cómo implementar la integración continua y la entrega continua (CI/CD) desde DevOps canalizaciones de Azure a clústeres privados de Amazon Elastic Kubernetes Service (Amazon EKS). Aborda un desafío fundamental al que se enfrentan las organizaciones que están mejorando su postura de seguridad mediante la transición a puntos de conexión de servidores de API privados para sus clústeres de Amazon EKS.

Un punto de conexión público expone el servidor de API de Kubernetes directamente a Internet, lo que crea una mayor superficie expuesta a ataques a la que podrían dirigirse actores maliciosos. Al cambiar a un punto de conexión privado, el acceso al plano de control del clúster está restringido a la nube privada virtual (VPC) del cliente.

Si bien la transición de un clúster de Amazon EKS a un punto final de API privado mejora considerablemente la seguridad, presenta desafíos de conectividad para CI/CD plataformas externas como Azure DevOps. Solo se puede acceder al punto de conexión privado desde la VPC o las redes interconectadas del clúster. Por lo tanto, los DevOps agentes de Azure estándar alojados en Microsoft, que operan fuera de la red AWS privada, no pueden acceder directamente al servidor API de Kubernetes. Esto interrumpe los flujos de trabajo de implementación típicos que dependen de herramientas como kubectl o Helm que se ejecutan en estos agentes porque no logran establecer una conexión con el clúster.

Para superar este problema, este patrón muestra un enfoque eficiente mediante el uso de DevOps agentes de Azure autohospedados dentro de clústeres privados de Amazon EKS. Esta solución ofrece una optimización de costos, una eficiencia operativa y una escalabilidad superiores, a la vez que preserva los requisitos de seguridad. Este enfoque beneficia especialmente a las empresas que buscan optimizar sus DevOps procesos multicloud sin comprometer el rendimiento ni la seguridad.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

  • Algunas Servicios de AWS no están disponibles en todas Regiones de AWS. Para obtener información sobre la disponibilidad en regiones, consulte AWS Services by Region. Para ver los puntos de conexión específicos, consulte Service endpoints and quotas y elija el enlace del servicio.

Arquitectura

Este patrón crea lo siguiente:

  • Repositorio Amazon ECR: el repositorio Amazon Elastic Container Registry (Amazon ECR) almacena la imagen de Docker con el DevOps agente de Azure y la aplicación de muestra que se implementa.

  • Grupo de DevOps agentes de Azure: un grupo de agentes DevOps autohospedados de Azure registra el agente que se ejecuta en el clúster privado de Amazon EKS.

  • Función de IAM: una función AWS Identity and Access Management (IAM) para la conexión del servicio de Azure que proporciona el acceso necesario al agente que se ejecuta en un clúster privado de Amazon EKS.

  • Conexión DevOps de servicio de Azure: una conexión de servicio en una DevOps cuenta de Azure para utilizar la función de IAM que proporciona el acceso necesario para que accedan los trabajos en proceso. Servicios de AWS

El siguiente diagrama muestra la arquitectura de implementación de un DevOps agente de Azure autohospedado en un clúster privado de Amazon EKS y de implementación de una aplicación de muestra en el mismo clúster.

Implementación de un DevOps agente de Azure autohospedado y una aplicación de muestra en un clúster privado de Amazon EKS.

En el diagrama, se muestra el siguiente flujo de trabajo:

  1. Implemente un DevOps agente de Azure autohospedado como una implementación dentro de un clúster de Amazon EKS.

  2. Un DevOps agente de Azure se conecta al grupo de agentes de una DevOps cuenta de Azure mediante un token de acceso personal (PAT) para la autenticación.

  3. Azure Pipelines configura una canalización para implementarla mediante código de un GitHub repositorio.

  4. La canalización se ejecuta en el agente desde el grupo de agentes que se configuró en la configuración de canalización. El DevOps agente de Azure obtiene la información de trabajo de la canalización consultando constantemente la cuenta de Azure DevOps .

  5. El DevOps agente de Azure crea una imagen de Docker como parte del trabajo en proceso y envía la imagen al repositorio de Amazon ECR.

  6. El DevOps agente de Azure implementa la aplicación de muestra en un clúster privado de Amazon EKS en un espacio de nombres denominado. webapp

Tools (Herramientas)

Herramientas

Otras herramientas

  • Docker es un conjunto de productos de plataforma como servicio (PaaS) que utiliza la virtualización a nivel del sistema operativo para entregar software en contenedores.

  • kubectl: una interfaz de la línea de comandos que le ayuda en la ejecución de comandos en clústeres de Kubernetes.

Repositorio de código

Prácticas recomendadas

Epics

TareaDescripciónHabilidades requeridas

Busque el GUID de la DevOps organización de Azure.

Inicie sesión en su DevOps cuenta de Azure y, a continuación, utilice la siguiente URL para buscar el GUID de la organización: https://dev.azure.com/{DevOps_Org_ID}/_apis/projectCollections?api-version=6.0 En la URL, {DevOps_org_ID} sustitúyalo por el ID de su DevOps organización de Azure.

AWS DevOps

Configure un IdP en la Cuenta de AWS.

Para configurar un proveedor de identidad (IdP) en una conexión Cuenta de AWS de servicio de Azure, siga estos pasos:

  1. Inicie sesión en la consola Consola de administración de AWS de IAM y ábrala en. https://console.aws.amazon.com/iam/

  2. En el panel izquierdo, elija Proveedores de identidades.

  3. Elija Add Provider (Agregar proveedor).

  4. Elija OpenID Connect como Tipo de proveedor.

  5. En la URL del proveedor, introduzca la URL del DevOps emisor de Azure. Cada arrendatario de Azure DevOps tiene un formato único OrganizationGUID que suele utilizar el siguiente formato: https://vstoken.dev.azure.com/{OrganizationGUID} Sustitúyalo por {OrganizationGUID} el ID de su DevOps organización de Azure.

  6. Para Audience, escriba api: //Azure ADToken Exchange. Se trata de un valor fijo para Azure DevOps.

  7. Elija Add Provider (Agregar proveedor).

  8. Tome nota del ARN del proveedor recién creado para usarlo en la siguiente tarea.

Para obtener más información, consulte Cómo federarse AWS desde Azure DevOps mediante OpenID Connect.

AWS DevOps

Cree una política de IAM en la Cuenta de AWS.

Para crear una política de IAM que proporcione los permisos necesarios para la función de IAM utilizada por la DevOps canalización de Azure, siga estos pasos:

  1. En la consola de IAM, en el panel izquierdo, elija Políticas.

  2. Seleccione Crear política.

  3. En la página Especificar permisos, en el editor de políticas, seleccione JSON. Reemplace el texto JSON predeterminado por el siguiente JSON:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ecr:*", "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
  4. Elija Siguiente.

  5. En Nombre de política, escriba un nombre para la política de IAM. Este patrón usa el nombre ADO-policy.

  6. Elija Crear política.

AWS DevOps

Cree un rol de IAM role en la Cuenta de AWS.

Para configurar un rol de IAM en Cuenta de AWS la conexión del servicio de Azure, siga estos pasos:

  1. En la consola de IAM, en el panel izquierdo, elija Roles.

  2. Elija Crear rol.

  3. En Tipo de entidad de confianza, seleccione Identidad web.

  4. Seleccione el IdP correcto del menú desplegable. El nombre del IdP comienza por vstoken.dev.azure.com/{OrganizationGUID}.

  5. En la lista desplegable Audiencia, seleccione api: ADToken //Azure Exchange.

  6. Para limitar este rol a una sola conexión de servicio, añada una condición. En Condición, seleccione Añadir condición y, en Clave, seleccione vstoken.dev.azure.com/{OrganizationGUID}:sub. En Condición, seleccione. StringEquals Para Valor, utilice el siguiente formato: sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}. Para ServiceConnectionName, utilice aws-sc. Creará esta conexión de servicio en la siguiente tarea.

  7. Elija Siguiente.

  8. En Añadir permisos, seleccione ADO-Policy, que es la política que creó en una tarea anterior.

  9. Elija Siguiente y, para Nombre del rol, introduzca ado-role. En Seleccionar entidades de confianza, use la siguiente política de confianza:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::{account_id}:oidc-provider/vstoken.dev.azure.com/{OrganizationGUID}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "vstoken.dev.azure.com/{OrganizationGUID}:aud": "api://AzureADTokenExchange", "vstoken.dev.azure.com/{OrganizationGUID}:sub": "sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}" } } } ] }

En la política, proporcione su información para los siguientes marcadores de posición:

  • {account_id}- Cuenta de AWS ID

  • {OrganizationGUID}- GUID de DevOps organización de Azure

  • {OrganizationName}- Nombre de la DevOps organización de Azure

  • {ProjectName}- Nombre DevOps del proyecto de Azure

  • {ServiceConnectionName}- Nombre de la conexión DevOps al servicio de Azure. Utilice aws-sc. Creará esta conexión de servicio en la siguiente tarea.

AWS DevOps

Cree una conexión de servicio en la DevOps cuenta de Azure.

Para configurar una conexión de servicio de Azure, siga estos pasos:

  1. En su DevOps proyecto de Azure, seleccione Configuración del proyecto y Conexiones de servicio.

  2. Elija Nueva conexión de servicio, seleccione el tipo de conexión de servicio como aws y, a continuación, seleccione Siguiente.

  3. En Rol que se va a asumir, introduzca el ARN para el rol de IAM ado-role. Creó el ado-role en la tarea anterior Cree un rol de IAM en la Cuenta de AWS.

  4. Seleccione la casilla de verificación Usar OIDC.

  5. En Nombre de la conexión de servicio, introduzca aws-sc en las propiedades de la tarea.

  6. Seleccione Save.

Para obtener más información, consulte Crear una conexión de servicio en la documentación de Microsoft.

AWS DevOps

Añada el rol de IAM al archivo de configuración de Amazon EKS.

El rol de IAM debe tener permisos para realizar las operaciones requeridas en el clúster de Amazon EKS. Como se trata de un rol de canalización, el rol de IAM debe poder administrar casi todos los tipos de recursos del clúster. Por lo tanto, el permiso de grupo system:masters es adecuado para este rol.

Para añadir la configuración necesaria al aws-auth ConfigMap en Kubernetes, use el siguiente código:

- groups: - system:masters rolearn: arn:aws:iam::{account_id}:role/ADO-role username: ADO-role

{account_id}Sustitúyalo por su Cuenta de AWS ID.

Para obtener más información, consulte la sección sobre cómo funciona Amazon EKS con IAM en la documentación de Amazon EKS.

AWS DevOps
TareaDescripciónHabilidades requeridas

Cree un grupo de agentes autoalojado.

Para configurar un grupo de agentes autohospedados en la DevOps cuenta de Azure, siga estos pasos:

  1. Inicie sesión en la organización de su DevOps cuenta de Azure.

  2. Elija Azure DevOps Organization.

  3. Elija su DevOps proyecto de Azure.

  4. Seleccione Configuración del proyecto.

  5. Elija Grupos de agentes.

  6. Elija Añadir grupo.

  7. Seleccione Autoalojado.

  8. En Nombre, escriba eks-agent.

  9. Seleccione la casilla de verificación Conceder permiso de acceso a todas las canalizaciones.

  10. Seleccione Crear.

Para obtener más información, consulte Crear y administrar grupos de agentes en la documentación de Microsoft.

TareaDescripciónHabilidades requeridas

Cree un repositorio de Amazon ECR.

Las imágenes de Docker que se utilizan para implementar el DevOps agente de Azure y la aplicación de muestra (webapp) en el clúster privado de Amazon EKS deben almacenarse en un repositorio de Amazon ECR. Para crear un repositorio de Amazon ECR, complete los pasos siguientes.

  1. Abra la consola Amazon ECR en los https://console.aws.amazon.com/ecr/repositorios.

  2. En la barra de navegación, elija la Región de AWS en la que va a crear el repositorio.

  3. En la página Repositorios, elija Repositorios privados y, a continuación, Crear repositorio.

  4. En el nombre del repositorio, introduzca webapp. Para que la aplicación de ejemplo de este patrón funcione, el nombre del repositorio de Amazon ECR debe usar webapp. Si utiliza un nombre diferente para el repositorio, consulte Solución de problemas.

Para obtener más información, consulte Creación de un repositorio privado de Amazon ECR para almacenar imágenes en la documentación de Amazon ECR.

AWS DevOps

Cree un Dockerfile para crear el agente de Azure DevOps .

Cree un Dockerfile para crear la imagen de Docker que tiene instalado el agente de Azure. DevOps Almacene el siguiente contenido en un archivo denominado Dockerfile:

FROM ubuntu:22.04 ENV TARGETARCH="linux-x64" RUN apt update && apt upgrade -y && apt install -y curl git jq libicu70 unzip wget RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip RUN ./aws/install RUN rm -rf aws awscliv2.zip RUN curl -sSL https://get.docker.com/ | sh RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash RUN mkdir -p azp WORKDIR /azp/ COPY ./start.sh ./ RUN chmod +x ./start.sh RUN useradd -m -d /home/agent agent RUN chown -R agent:agent /azp /home/agent RUN groupadd -f docker RUN usermod -aG docker agent USER agent ENTRYPOINT [ "./start.sh" ]
AWS DevOps

Cree un script para el DevOps agente de Azure.

Para crear el script start.sh, siga estos pasos:

  1. Vaya al procedimiento Crear y compilar el Dockerfile en la documentación de Microsoft y desplácese hasta el paso 5. Guarde el siguiente contenido ~/azp-agent-in-docker/start.sh, de forma que se asegure de utilizar finales de línea de estilo Unix (LF).

  2. Copie el contenido del script y guárdelo en un archivo denominado start.sh en el mismo directorio que el Dockerfile.

AWS DevOps

Cree una imagen de Docker con el DevOps agente de Azure.

Para crear una imagen de Docker para instalar el DevOps agente de Azure, utilice el Dockerfile que creó anteriormente para crear la imagen. En el mismo directorio en el que almacenó el Dockerfile, ejecute el comando siguiente.

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com docker build --platform linux/amd64 -t ado-agent:latest . docker tag ado-agent:latest aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest docker push aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest

Sustituya aws_account_id y por su region Cuenta de AWS ID y. Región de AWS

AWS DevOps
TareaDescripciónHabilidades requeridas

Genere un token de acceso personal de Azure.

El agente que se ejecuta en el clúster privado de Amazon EKS necesita un token de acceso personal (PAT) para poder autenticarse con la DevOps cuenta de Azure. Para generar un PAT, siga estos pasos:

  1. Inicie sesión con la cuenta de usuario que planea usar en su DevOps organización de Azure (https://dev.azure.com/{Your_Organization}).

  1. En la página de inicio, abra la configuración de usuario y, a continuación, seleccione Tokens de acceso personal.

  2. Elija Nuevo token.

  3. Ingrese un nombre para el token.

  4. Seleccione Mostrar todos los ámbitos.

  5. En el caso de los grupos de agentes, seleccione la casilla de verificación Leer y administrar.

  6. Seleccione Crear.

  7. Para crear un secreto en el clúster privado de Amazon EKS, utilice la siguiente configuración:

apiVersion: v1 kind: Secret metadata: name: azdevops-pat namespace: default type: Opaque stringData: AZP_TOKEN: <PAT Token>
  1. Almacene la configuración en un archivo denominado ado-secret.yaml. Sustituya <PAT Token> por el token de acceso personal que acaba de crear. Para crear el secreto, ejecute el siguiente comando:

kubectl create -f ado-secret.yaml

Para obtener más información, consulte Registrar un agente mediante un token de acceso personal (PAT) en la documentación de Microsoft.

AWS DevOps

Use el archivo de manifiesto de Kubernetes para la implementación del agente.

Para implementar el DevOps agente de Azure en el clúster privado de Amazon EKS, copie el siguiente archivo de manifiesto y guárdelo comoagent-deployment.yaml:

apiVersion: apps/v1 kind: Deployment metadata: name: azure-pipelines-agent-eks labels: app: azure-pipelines-agent spec: replicas: 1 selector: matchLabels: app: azure-pipelines-agent template: metadata: labels: app: azure-pipelines-agent spec: containers: - name: docker image: docker:dind securityContext: privileged: true volumeMounts: - name: shared-workspace mountPath: /workspace - name: dind-storage mountPath: /var/lib/docker env: - name: DOCKER_TLS_CERTDIR value: "" - name: azure-pipelines-agent image: aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest env: - name: AZP_URL value: "<Azure account URL>" - name: AZP_POOL value: "eks-agent" - name: AZP_TOKEN valueFrom: secretKeyRef: name: azdevops-pat key: AZP_TOKEN - name: AZP_AGENT_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: DOCKER_HOST value: tcp://localhost:2375 volumeMounts: - mountPath: /workspace name: shared-workspace volumes: - name: dind-storage emptyDir: {} - name: shared-workspace emptyDir: {}

Sustituya aws_account_id y <Azure account URL> por su Cuenta de AWS ID y la URL de su DevOps cuenta de Azure.

AWS DevOps

Implemente el agente en el clúster privado de Amazon EKS.

Para implementar el agente de Azure DevOps en el clúster privado de Amazon EKS, use el siguiente comando:

kubectl create -f agent-deployment.tf
AWS DevOps

Compruebe que el agente se está ejecutando.

Para comprobar que el DevOps agente de Azure se está ejecutando, utilice el siguiente comando:

kubectl get deploy azure-pipelines-agent-eks

La salida debería tener un aspecto similar al siguiente:

NAME READY UP-TO-DATE AVAILABLE AGE azure-pipelines-agent-eks 1/1 1 1 58s

Asegúrese de que la columna READY muestre 1/1.

AWS DevOps

Compruebe que el agente esté registrado en el grupo de DevOps agentes de Azure.

Para comprobar que el agente está implementado en el clúster privado de Amazon EKS y registrado en el grupo de agentes eks-agent, siga estos pasos:

  1. Inicie sesión en su DevOps organización de Azure (https://dev.azure.com/{Your_Organization}).

  2. Seleccione Configuración del proyecto.

  3. Elija Grupos de agentes.

  4. Seleccione el grupo eks-agent y, a continuación, consulte la pestaña Agentes.

Debería ver un agente en la lista con el estado en línea y el nombre del agente debería empezar por azure-pipelines-agent-eks-*.

AWS DevOps
TareaDescripciónHabilidades requeridas

Transfiera el repositorio de aplicaciones de muestra a su GitHub cuenta.

Transfiera el siguiente repositorio de AWS muestras a su GitHub cuenta:

https://github.com/aws-samples/deploy-kubernetes-resources-to- amazon-eks-using-azure -devops

AWS DevOps

Crear una canalización.

Para crear una canalización en su DevOps cuenta de Azure, siga estos pasos:

  1. Inicie sesión con la cuenta de usuario que planea usar en su DevOps organización de Azure (https://dev.azure.com/{Your_Organization}).

  2. Vaya a la consola de proyectos y canalizaciones.

  3. Elija Nueva canalización.

  4. En Dónde está su código, elija GitHub.

  5. Proporciona las credenciales necesarias para que la canalización se conecte a tu GitHub cuenta

  6. Selecciona el repositorio deploy-kubernetes-resources-to: amazon-eks-using-azure -devops.

  7. En Configurar su canalización, seleccione el archivo YAML de Azure Pipelines existente.

  8. En Seleccionar un archivo YAML existente, seleccione main para Ramificación y azure_pipelines.yaml para ruta.

  9. Elija Continuar.

  10. En Revisar la canalización YAML, sustituya los valores de los parámetros de entrada awsRegion y awsEKSClusterName por tu información:

pool: name: eks-agent #pool: self-hosted # If you are running self-hosted Azure DevOps Agents stages: # Refering the pipeline template, input parameter that are not specified will be added with defaults - template: ./pipeline_templates/main_template.yaml parameters: serviceConnectionName: aws-sc awsRegion: <your region> awsEKSClusterName: <name of your EKS cluster> projectName: webapp
  1. Seleccione EJECUTAR.

AWS DevOps

Verifique que la aplicación de muestra se ha implementado.

Una vez finalizada la canalización, compruebe que la implementación de la aplicación de muestra se ha realizado correctamente; para ello, consulte tanto el repositorio de Amazon ECR como el clúster de Amazon EKS.

Para verificar los artefactos en el repositorio de Amazon ECR, siga estos pasos:

  1. Vaya al repositorio webapp de Amazon ECR.

  2. Confirme la presencia de los siguientes artefactos nuevos:

  • Imagen de Docker: <date>.<build_number>-image

  • Gráfico de Helm: <date>.<build_number>-helm

Por ejemplo, 20250501.1-image y 20250501.1-helm.

Para verificar la implementación en el clúster privado de Amazon EKS del espacio de nombres webapp, use el siguiente comando:

kubectl get deploy -n webapp

El resultado esperado es el siguiente:

NAME READY UP-TO-DATE AVAILABLE webapp 1/1 1 1

Nota: Si esta es la primera vez que ejecuta una canalización, es posible que deba autorizar la conexión del servicio y el grupo de agentes. Busque las solicitudes de permiso en la interfaz de DevOps canalización de Azure y apruebelas para continuar.

AWS DevOps

Resolución de problemas

ProblemaSolución

La canalización falla cuando el nombre del repositorio de Amazon ECR no coincide con webapp

La aplicación de ejemplo espera que el nombre del repositorio de Amazon ECR coincida con el parámetro projectName: webapp en azure_pipeline.yml.

Para resolver este problema, cambie el nombre de su repositorio de Amazon ECR a webapp o actualice lo siguiente:

  • Cambie el nombre del webapp directorio de su repositorio bifurcado para que coincida con el nombre de su GitHub repositorio de Amazon ECR.

  • Actualice el parámetro projectName en azure_pipeline.yml para que coincida con el nombre de su repositorio de Amazon ECR.

Error: Kubernetes cluster unreachable: the server has asked for the client to provide credentials

Si encuentra este error en el paso “Extraer e implementar gráfico de Helm” de su canalización de Azure, la causa principal suele deberse a una configuración incorrecta de los roles de IAM en el aws-auth ConfigMap del clúster de Amazon EKS.

Para resolver este problema, compruebe lo siguiente:

  • Verifique la configuración de aws-auth ConfigMap.

  • Compruebe la configuración de autenticación de su clúster de Amazon EKS: abra la consola de Amazon EKS, los detalles del clúster y la configuración de acceso. Asegúrese de que el modo de autenticación esté configurado en la API de EKS y ConfigMap (no solo en la API de EKS).

Recursos relacionados

AWS Blogs

Servicios de AWS documentación

Documentación de Microsoft