Simplificación de la implementación de aplicaciones multiusuario de Amazon EKS mediante Flux - 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.

Simplificación de la implementación de aplicaciones multiusuario de Amazon EKS mediante Flux

Nadeem Rahaman, Aditya Ambati, Aniket Dekate y Shrikant Patil, Amazon Web Services

Resumen

Muchas empresas que ofrecen productos y servicios son sectores regulados por los datos que deben mantener las barreras de datos entre sus funciones empresariales internas. Este patrón describe cómo puede utilizar la característica de varias tenencias de Amazon Elastic Kubernetes Service (Amazon EKS) para crear una plataforma de datos que logre el aislamiento lógico y físico entre los inquilinos o usuarios que comparten un clúster único de Amazon EKS. El patrón proporciona aislamiento a través de los enfoques siguientes:

  • Aislamiento del espacio de nombres de Kubernetes

  • Control de acceso basado en roles (RBAC)

  • Políticas de red

  • Cuotas de recursos

  • AWS Identity and Access Management Funciones (IAM) para cuentas de servicio (IRSA)

Además, esta solución utiliza Flux para mantener inmutable la configuración del inquilino al implementar aplicaciones. Puede implementar las aplicaciones del inquilino y especificar el repositorio del inquilino que contiene el archivo kustomization.yaml de Flux en la configuración.

Este patrón implementa lo siguiente:

  • Un AWS CodeCommit repositorio, AWS CodeBuild proyectos y una AWS CodePipeline canalización, que se crean mediante la implementación manual de los scripts de Terraform.

  • Componentes de red y cómputo obligatorios para alojar a los inquilinos. Se crean a través de Terraform CodePipeline y CodeBuild utilizando Terraform.

  • Espacios de nombres de inquilinos, políticas de red y cuotas de recursos, que se configuran a través de un gráfico de Helm.

  • Aplicaciones que pertenecen a diferentes inquilinos, implementadas con Flux.

Le recomendamos que planifique y cree con detenimiento su propia arquitectura para varios inquilinos según sus requisitos únicos y sus consideraciones de seguridad. Este patrón proporciona un punto de partida para la implementación.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

  • Dependencia de las implementaciones manuales de Terraform: la configuración inicial del flujo de trabajo, que incluye la creación de CodeCommit repositorios, CodeBuild proyectos y CodePipeline canalizaciones, se basa en las implementaciones manuales de Terraform. Esto introduce una posible limitación respecto de automatización y escalabilidad, ya que requiere una intervención manual para hacer cambios en la infraestructura.

  • CodeCommit dependencia de los repositorios: el flujo de trabajo se basa en CodeCommit los repositorios como solución de gestión del código fuente y está estrechamente vinculado a ellos. Servicios de AWS

Arquitectura

Arquitecturas de destino

Este patrón implementa tres módulos para crear la infraestructura de canalización, red y computación de una plataforma de datos, como se ilustra en los diagramas siguientes.

Arquitectura de canalización:

Infraestructura de canalización para la arquitectura multiusuario de Amazon EKS

Arquitectura de redes:

Infraestructura de redes para la arquitectura multiusuario de Amazon EKS

Arquitectura de computación:

Infraestructura de computación para la arquitectura multiusuario de Amazon EKS

Tools (Herramientas)

Servicios de AWS

  • AWS CodeBuild es un servicio de compilación completamente administrado que le permite compilar código fuente, poner en marcha pruebas unitarias y producir artefactos listos para implementar.

  • AWS CodeCommit es un servicio de control de versiones que permite almacenar y administrar repositorios de Git de forma privada, sin necesidad de administrar su propio sistema de control de origen.

  • AWS CodePipeline permite diseñar y configurar rápidamente las diferentes etapas de un proceso de lanzamiento de software y automatizar los pasos necesarios para lanzar los cambios en el software de manera continua.

  • Amazon Elastic Kubernetes Service (Amazon EKS) le ayuda a ejecutar AWS Kubernetes sin necesidad de instalar o mantener su propio plano de control o nodos de Kubernetes.

  • AWS Transit Gatewayes un centro central que conecta nubes privadas virtuales () y redes locales. VPCs

  • Amazon Virtual Private Cloud (Amazon VPC) le ayuda a lanzar AWS recursos en una red virtual que haya definido. Esa red virtual es similar a la red tradicional que utiliza en su propio centro de datos, con los beneficios de usar la infraestructura escalable de AWS.

Otras herramientas

  • Las políticas de red de Cilium son compatibles con las políticas de red de L3 y L4 de Kubernetes. Se pueden ampliar con políticas de L7 para proporcionar seguridad de las API para HTTP, Kafka y gRPC, y otros protocolos similares.

  • Flux es una herramienta de entrega continua (CD) basada en Git que automatiza las implementaciones de aplicaciones en Kubernetes.

  • Helm: es un administrador de paquetes de código abierto para Kubernetes que le permite instalar y administrar aplicaciones en el clúster de Kubernetes.

  • Terraform es una herramienta de infraestructura como código (IaC) HashiCorp que le ayuda a crear y administrar recursos locales y en la nube.

Repositorio de código

El código de este patrón está disponible en el repositorio de soluciones Terraform Multi-Tenancy de GitHub EKS.

Prácticas recomendadas

Para directrices y prácticas recomendadas para utilizar esta implementación, consulte lo siguiente:

Epics

TareaDescripciónHabilidades requeridas

Clone el repositorio del proyecto.

Clone el repositorio de la solución GitHub EKS Multi-Tenancy Terraform ejecutando el siguiente comando en una ventana de terminal:

git clone https://github.com/aws-samples/aws-eks-multitenancy-deployment.git
AWS DevOps

Inicie el bucket de S3 de Terraform y Amazon DynamoDB.

  1. En la carpeta bootstrap, abra el archivo bootstrap.sh y actualice los valores de las variables para el nombre del bucket de S3, el nombre de la tabla de DynamoDB y la Región de AWS:

    S3_BUCKET_NAME="<S3_BUCKET_NAME>" DYNAMODB_TABLE_NAME="<DYNAMODB_NAME>" REGION="<AWS_REGION>"
  2. Ejecute el script bootstrap.sh. El script requiere el AWS CLI, que usted instaló como parte de los requisitos previos.

    cd bootstrap ./bootstrap.sh
AWS DevOps

Actualice los archivos run.sh y locals.tf.

  1. Cuando el proceso de arranque se complete correctamente, copie el bucket de S3 y el nombre de la tabla de DynamoDB de la sección variables del script bootstrap.sh:

    # Variables S3_BUCKET_NAME="<S3_BUCKET_NAME>" DYNAMODB_TABLE_NAME="<DYNAMODB_NAME"
  2. Pegue esos valores en el script run.sh, que se encuentra en el directorio raíz del proyecto:

    BACKEND_BUCKET_ID="<SAME_NAME_AS_S3_BUCKET_NAME>" DYNAMODB_ID="<SAME_NAME_AS_DYNAMODB_NAME>"
  3. Cargue el código del proyecto en un CodeCommit repositorio. Puede crear este repositorio automáticamente a través de Terraform. Para ello, establezca la variable siguiente en true en el archivo demo/pipeline/locals.tf:

    create_new_repo = true
  4. Actualice el archivo locals.tf de acuerdo con sus requisitos para crear recursos de canalización.

AWS DevOps

Implemente el módulo de canalización.

Para crear recursos de canalización, ejecute los comandos siguientes de Terraform de manera manual. No hay ninguna orquestación para ejecutar estos comandos automáticamente.

./run.sh -m pipeline -e demo -r <AWS_REGION> -t init ./run.sh -m pipeline -e demo -r <AWS_REGION> -t plan ./run.sh -m pipeline -e demo -r <AWS_REGION> -t apply
AWS DevOps
TareaDescripciónHabilidades requeridas

Iniciar la canalización.

  1. En la carpeta templates, asegúrese de que los archivos buildspec tengan la siguiente variable establecida en network:

    TF_MODULE_TO_BUILD: "network"
  2. En la CodePipeline consola, en la página de detalles de la canalización, inicia la canalización seleccionando Release change.

Tras esta primera ejecución, la canalización se iniciará automáticamente cada vez que realices un cambio en la rama principal del CodeCommit repositorio.

La canalización incluye las siguientes etapas:

  • validate inicializa Terraform, ejecuta los análisis de seguridad de Terraform mediante las herramientas checkov y tfsec y carga los informes de análisis en el bucket de S3.

  • plan muestra el plan de Terraform y lo carga en el bucket de S3.

  • applyaplica el resultado del plan Terraform del depósito de S3 y crea AWS recursos.

  • destroyelimina los AWS recursos creados durante la apply etapa. Para habilitar esta etapa opcional, establezca la variable siguiente en true en el archivo demo/pipeline/locals.tf:

    enable_destroy_stage = true
AWS DevOps

Valide los recursos creados a través del módulo de red.

Confirme que los siguientes AWS recursos se crearon después de que la canalización se implementara correctamente:

  • Una VPC de salida con tres subredes públicas y tres privadas, una puerta de enlace de Internet y una puerta de enlace NAT.

  • Una VPC de Amazon EKS con tres subredes privadas.

  • El arrendatario 1 y el arrendatario 2 VPCs tienen tres subredes privadas cada uno.

  • Una puerta de enlace de tránsito con todas las conexiones de la VPC y las rutas a cada subred privada.

  • Una ruta de puerta de enlace de tránsito estática para la VPC de salida de Amazon EKS con un bloque de CIDR de destino de 0.0.0.0/0. Esto es necesario para permitir que todos tengan acceso saliente VPCs a Internet a través de la VPC de salida de Amazon EKS.

AWS DevOps
TareaDescripciónHabilidades requeridas

Actualice locals.tf para permitir el acceso del CodeBuild proyecto a la VPC.

Para implementar los complementos para el clúster privado de Amazon EKS, el CodeBuild proyecto debe estar adjunto a la VPC de Amazon EKS.

  1. En la carpeta demo/pipeline, abra el archivo locals.tf y establezca la variable vpc_enabled en true.

  2. Ejecute el script run.sh para aplicar los cambios al módulo de canalización:

    demo/pipeline/locals.tf ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd init ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd plan ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd apply
AWS DevOps

Actualice los archivos buildspec para crear el módulo de computación.

En la carpeta templates, en todos los archivos de YAML buildspec, establezca el valor de la variable TF_MODULE_TO_BUILD de network a compute:

TF_MODULE_TO_BUILD: "compute"
AWS DevOps

Actualice el archivo values para el gráfico de Helm de administración de inquilinos.

  1. Abra el archivo values.yaml en la ubicación siguiente:

    cd cfg-terraform/demo/compute/cfg-tenant-mgmt

    El archivo tiene este aspecto:

    --- global: clusterRoles: operator: platform-tenant flux: flux-tenant-applier flux: tenantCloneBaseUrl: ${TEANT_BASE_URL} repoSecret: ${TENANT_REPO_SECRET} tenants: tenant-1: quotas: limits: cpu: 1 memory: 1Gi flux: path: overlays/tenant-1 tenant-2: quotas: limits: cpu: 1 memory: 2Gi flux: path: overlays/tenant-2
  2. En las secciones global y tenants, actualice la configuración según sus requisitos:

    • tenantCloneBaseUrl: ruta al repositorio que aloja el código para todos los inquilinos (utilizamos el mismo repositorio de Git para todos los inquilinos)

    • repoSecret: el secreto de Kubernetes que contiene las claves SSH y los hosts conocidos para autenticarse en el repositorio Git de inquilinos global

    • quotas: cuotas de recursos de Kubernetes que quiere aplicar a cada inquilino

    • flux path: ruta a los archivos de YAML de la aplicación de inquilinos en el repositorio global de inquilinos

AWS DevOps

Valide los recursos de computación.

Tras actualizar los archivos en los pasos anteriores, se CodePipeline inicia automáticamente. Confirme que creó los siguientes AWS recursos para la infraestructura informática:

  • Clúster de Amazon EKS con punto de conexión privado

  • Nodos de trabajo de Amazon EKS

  • Complementos de Amazon EKS: secretos externos, aws-loadbalancer-controller y metrics-server

  • GitOps módulo, gráfico de Flux Helm, gráfico de Cilium Helm y gráfico de Helm de gestión de inquilinos

AWS DevOps
TareaDescripciónHabilidades requeridas

Valide los recursos de administración de inquilinos en Kubernetes.

Ejecute los comandos siguientes para comprobar que los recursos de administración de inquilinos se hayan creado correctamente con la ayuda de Helm.

  1. Se crearon los espacios de nombres de inquilinos, tal y como se especifica en values.yaml:

    kubectl get ns -A
  2. Las cuotas se asignan a cada espacio de nombres de inquilinos, tal y como se especifica en values.yaml:

    kubectl get quota --namespace=<tenant_namespace>
  3. Los detalles de las cuotas son correctos para cada espacio de nombres de inquilinos:

    kubectl describe quota cpu-memory-resource-quota-limit -n <tenant_namespace>
  4. Las políticas de red de Cilium se aplicaron a cada espacio de nombres de inquilinos:

    kubectl get CiliumNetworkPolicy -A
AWS DevOps

Verifique las implementaciones de aplicaciones de inquilinos.

Para comprobar que se implementaron las aplicaciones de inquilinos, ejecute los comandos siguientes.

  1. Flux puede conectarse al CodeCommit repositorio especificado en el GitOps módulo:

    kubectl get gitrepositories -A
  2. El controlador de personalización de Flux ha desplegado los archivos YAML en el repositorio: CodeCommit

    kubectl get kustomizations -A
  3. Todos los recursos de la aplicación se implementan en sus espacios de nombres de inquilinos:

    kubectl get all -n <tenant_namespace>
  4. Se creó una entrada para cada inquilino:

    kubectl get ingress -n <tenant_namespace>

Resolución de problemas

ProblemaSolución

Aparece un mensaje de error similar al siguiente:

Failed to checkout and determine revision: unable to clone unknown error: You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit.

Para solucionar el problema, haga lo siguiente:

  1. Verifique el repositorio de aplicaciones de inquilinos: es posible que el error se deba a un repositorio vacío o mal configurado. Asegúrese de que el repositorio de aplicaciones de inquilinos contenga el código necesario.

  2. Vuelva a implementar el módulo tenant_mgmt: en el archivo de configuración del módulo tenant_mgmt, encuentre el bloque app y, a continuación establezca el parámetro deploy en 0:

    deploy = 0

    Tras ejecutar el comando apply de Terraform, vuelva a cambiar el valor del parámetro deploy a 1:

    deploy = 1
  3. Vuelva a comprobar el estado: tras ejecutar los pasos anteriores, utilice el comando siguiente para comprobar si persiste el problema:

     kubectl get gitrepositories -A

    Si persiste, considere la posibilidad de profundizar en los registros de Flux para obtener más detalles o consulte la guía general de solución de problemas de Flux.

Recursos relacionados

Información adicional

A continuación, se muestra un ejemplo de estructura de repositorios para implementar aplicaciones de inquilinos:

applications sample_tenant_app ├── README.md ├── base │ ├── configmap.yaml │ ├── deployment.yaml │ ├── ingress.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays ├── tenant-1 │ ├── configmap.yaml │ ├── deployment.yaml │ └── kustomization.yaml └── tenant-2 ├── configmap.yaml └── kustomization.yaml