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 enlace de servidores API privados para sus clústeres de Amazon EKS.

Un punto final público expone el servidor de la API de Kubernetes directamente a Internet, lo que crea una mayor superficie de ataque a la que podrían dirigirse actores malintencionados. Al cambiar a un punto final 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 final 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 costes, 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 multinube sin comprometer el rendimiento o la seguridad.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

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 DevOps cuenta de Azure.

  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

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 DevOps la 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. 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 AWS Management Console de IAM y ábrala en. https://console.aws.amazon.com/iam/

  2. En el panel izquierdo, selecciona Proveedores de identidad.

  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. 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 los siguientes pasos:

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

  2. Elija Crear política.

  3. En Especificar permisos, en el editor de políticas, seleccione JSON. Sustituya la política JSON predeterminada 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 la política, introduzca 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 en. Cuenta de AWS

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

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

  2. Seleccione Crear rol.

  3. En el tipo de entidad de confianza, seleccione Identidad web.

  4. Seleccione el IdP correcto en la lista 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, agregue una condición. En Condición, seleccione Agregar condición y, en Clave, seleccione vstoken.dev.azure.com/ {organizationGUID} :sub. En StringEqualsCondición, selecciona. Para Value, utilice el siguiente formato:sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}. ParaServiceConnectionName, utilice aws-sc. Creará esta conexión de servicio en la siguiente tarea.

  7. Elija Siguiente.

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

  9. Seleccione Siguiente y, en Nombre del rol, escriba ado-role. Para seleccionar entidades de confianza, utilice 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 CARNÉ

  • {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 yaws, a continuación, seleccione Siguiente.

  3. En Rol to Assume, introduzca el arn para el rol ado-role de IAM. Creó el rol ado 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 el 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 la función de IAM al archivo de configuración de Amazon EKS.

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

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

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

Sustitúyala por {account_id} tu ID. Cuenta de AWS

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

AWS DevOps
TareaDescripciónHabilidades requeridas

Cree un grupo de agentes autohospedado.

Para configurar un grupo de agentes autohospedado 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. Selecciona Self-hosted.

  8. En Nombre, escriba eks-agent.

  9. Seleccione la casilla de verificación Otorgar 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, siga estos pasos:

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

  2. En la barra de navegación, elija la en la Región de AWSque desea crear su repositorio.

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

  4. En Nombre del repositorio, ingresa 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 Guarde 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 start.sh script, 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 en ~/azp-agent-in-docker/start.sh, asegurándose 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 está almacenado el Dockerfile, ejecute los siguientes comandos:

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 region por su 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 una 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. Elige Nuevo token.

  3. Introduzca el nombre del token.

  4. Selecciona Mostrar todos los ámbitos.

  5. En el caso de los grupos de agentes, selecciona la casilla Leer y gestionar.

  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. Guarde la configuración en un archivo denominadoado-secret.yaml. <PAT Token>Sustitúyala por el token de acceso personal que acabas de crear. Para crear el secreto, ejecuta 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

Utilice el archivo de manifiesto de Kubernetes para la implementación de los agentes.

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, utilice 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

El resultado esperado debe ser similar al siguiente:

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

Asegúrese de que se muestre la READY columna1/1.

AWS DevOps

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

Para comprobar que el agente está desplegado en el clúster privado de Amazon EKS y está registrado en el grupo de agenteseks-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 azure-pipelines-agent-eks por -*.

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. Navegue hasta la consola de proyectos y canalizaciones.

  3. Elige Nueva canalización.

  4. En Dónde está tu código, selecciona 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 Seleccione un archivo YAML existente, seleccione main para Branch y azure_pipelines.yaml para path.

  9. Elija Continuar.

  10. En Revisa tu canalización (YAML), reemplaza los valores de los parámetros de entrada por y por tu información: awsRegion awsEKSClusterName

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. Selecciona EJECUTAR.

AWS DevOps

Compruebe que se haya implementado la aplicación de muestra.

Una vez finalizada la canalización, compruebe que la implementación de la aplicación de muestra se ha realizado correctamente consultando 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. Navegue hasta el repositorio de webapp 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 en el espacio de nombreswebapp, utilice 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

Solución de problemas

ProblemaSolución

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

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

Para resolver este problema, cambie el nombre de su repositorio de Amazon ECR a o actualice webapp 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 projectName parámetro azure_pipeline.yml para que coincida con el nombre de su repositorio de Amazon ECR.

Error: no se puede acceder al clúster de Kubernetes: el servidor ha pedido al cliente que proporcione las credenciales

Si encuentra este error en el paso «Pull and Deploy Helm Chart» de su canalización de Azure, la causa principal suele deberse a una configuración incorrecta de las funciones de IAM en el clúster de aws-auth ConfigMap Amazon EKS.

Para resolver este problema, compruebe lo siguiente:

  • Compruebe la aws-auth ConfigMap configuración.

  • 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