Блог Amazon Web Services

Создание кластеров с помощью EKS Blueprints

Оригинал статьи: ссылка (Kevin Coleman, Principal Container Specialist; Apoorva Kulkarni, Sr. Specialist Solutions Architect; Mikhail Shapirov, Senior Partner Solutions Architect; Vara Bonthu, Senior Open Source Engineer)

Сегодня мы представляем новый проект с открытым исходным кодом под названием EKS Blueprints, который упрощает и ускоряет внедрение Amazon Elastic Kubernetes Service (Amazon EKS). EKS Blueprints — это набор модулей Infrastructure as Code (IaC), которые помогут вам настроить и развернуть согласованные EKS кластеры в разных аккаунтах и регионах. Вы можете использовать EKS Blueprints для быстрого запуска EKS кластера с Amazon EKS дополнениями, а также широкого спектра популярных дополнений с открытым исходным кодом, включая Prometheus, Karpenter, Nginx, Traefik, AWS Load Balancer Controller, Fluent Bit, Keda, Argo CD и другие. EKS Blueprints также поможет вам внедрить соответствующие средства контроля безопасности, необходимые для управления рабочими нагрузками множеством команд в одном кластере.

EKS Blueprints реализован в двух популярных IaC-фреймворках, HashiCorp Terraform и AWS Cloud Development Kit (AWS CDK), которые помогают автоматизировать развертывание инфраструктуры. Для быстрого старта мы советуем ознакомиться с руководствами по началу работы с EKS Blueprints для Terraform или EKS Blueprints для CDK.

Мотивация

Kubernetes — это мощная и расширяемая технология оркестрации контейнеров, которая позволяет развертывать и управлять контейнерными приложениями в больших масштабах. Расширяемая природа Kubernetes также позволяет использовать в кластерах Kubernetes широкий спектр популярных инструментов с открытым исходным кодом, обычно называемых дополнениями. Обратите внимание, что создание специализированного кластера EKS, отвечающего конкретным потребностям вашего приложения, может занять значительное время при таком большом количестве доступных инструментов и вариантов дизайна. Это время также включает интеграцию широкого спектра инструментов с открытым исходным кодом и сервисов AWS, что требует глубоких знаний как в области AWS, так и Kubernetes.

Если в одном кластере взаимодействуют рабочие нагрузки от нескольких команд, могут возникнуть дополнительные сложности, например, управление сетевыми политиками, доступам к EKS кластерам или AWS ресурсам, которые работают вне EKS кластера. Обеспечение согласованности и стандартизации всего парка EKS кластеров по мере роста внедрения может создать дополнительные проблемы.

Клиенты AWS просят предоставить примеры, демонстрирующие, как интегрировать ландшафт инструментов Kubernetes и упростить процесс создания полноценных кластеров EKS, отвечающих требованиям конкретных приложений. Им нужны решения, использующие знакомые инструменты, такие как Terraform, CDK и Helm, которые помогают управлять жизненным циклом EKS кластеров, операционным программным обеспечением, работающим в каждом кластере, и конфигурацией для команд, которым необходимо запускать рабочие нагрузки в каждом кластере. EKS Blueprints был создан для удовлетворения этой потребности клиентов.

Что такое EKS Blueprints?

EKS Blueprints помогает вам настраивать EKS кластера c полностью сконфигурированным операционным программным обеспечением, необходимым для развертывания и эксплуатации рабочих нагрузок. Вы можете описать конфигурацию желаемого состояния EKS кластера, например, панель управления (control plane), рабочие узлы и дополнительные модули Kubernetes в виде IaC проекта.

Как только проект настроен, его можно использовать для развертывания согласованных сред в нескольких учетных записях и регионах AWS с помощью непрерывной автоматизации развертывания (continuous deployment). EKS Blueprints базируется на существующих наработках сообщества разработчиков EKS с открытым исходным кодом, включая использование terraform-aws-eks модуля для инициализации кластеров.

На следующей архитектурной схеме представлена ​​среда EKS, которую можно настроить и развернуть с помощью EKS Blueprints. На схеме показан EKS кластер, который работает в трех зонах доступности, cконфигурирован с большим количеством дополнительных модулей Kubernetes и размещает рабочие нагрузки от нескольких команд:

С помощью EKS Blueprints вы можете подготовить как EKS, так и самоуправляемые дополнения в EKS кластере. Поскольку EKS сервис продолжает расширять свою библиотеку дополнений EKS, EKS Blueprints будет развиваться, добавляя эти возможности. EKS Blueprints также настраивает соответствующие IAM политики, роли и сервисные аккаунты для каждого дополнения (как указано в документации EKS IAM роли для сервисных аккаунтов (IRSA)).

Если вы хотите разрешить нескольким командам запускать рабочие нагрузки в одном кластере, вы можете использовать EKS Blueprints для настройки и управления пользователями и командами, имеющими доступ к кластеру (команда администраторов) или пространствам имен в кластере (команда приложений).

Если вы хотите применять GitOps подход для управления конфигурацией кластера и рабочими нагрузками, вы можете использовать EKS Blueprints для настройки кластера с Argo CD и любым количеством ресурсов для Argo CD приложений. Поддержка Flux также включена в нашу дорожную карту.

Примеры EKS Blueprints

Мы также разработали библиотеку примеров реализации, демонстрирующих, как использовать EKS Blueprints для решения конкретных технических задач в EKS. В настоящее время наша библиотека включает примеры, демонстрирующие, как запустить EMR в EKS, как настроить EKS кластер с Karpenter для управления рабочими нодами, как реализовать наблюдаемость EKS кластеров и рабочих нагрузок в них, как сконфигурировать  EKS кластер с Crossplane, как использовать EKS Blueprints с AWS Proton и многое другое.

Со временем наша библиотека примеров будет продолжать расти и развиваться. Если у вас есть дополнительные примеры, которые вы хотите увидеть в библиотеке, дайте нам знать об этом, создав задачу в GitHub. Кроме того, если вы хотите создать свой собственный blueprint и поделиться им с сообществом, мы будем рады вашему pull request!

Использование EKS Blueprints

Давайте посмотрим на EKS Blueprints в действии. В следующем Terraform примере представлена ​​простая схема развертывания нового кластера EKS с группой управляемых узлов. Он также конфигурирует кластер с дополнениями vpc-cni, coredns, kube-proxy, aws-load-balancer-controller, metrics server и cluster-autoscaler. Указать, что дополнение должно быть установлено в кластере EKS, очень просто — достаточно определить флаг со значение true:

module "eks_blueprints" {
  source = "github.com/aws-ia/terraform-aws-eks-blueprints?ref=v4.0.2"

  # EKS Cluster VPC and Subnet mandatory config
  vpc_id             = <vpc_id>
  private_subnet_ids = <private_subnet_ids>

  # EKS CLUSTER VERSION
  cluster_version = "1.21"

  # EKS MANAGED NODE GROUPS
  managed_node_groups = {
    mg_5 = {
      node_group_name = "managed-ondemand"
      instance_types  = ["m5.large"]
      min_size        = "2"
    }
  }
}

# Add-ons
module "kubernetes_addons" {
  source = "github.com/aws-ia/terraform-aws-eks-blueprints//modules/kubernetes-addons?ref=v4.0.2"

  eks_cluster_id = module.eks_blueprints.eks_cluster_id

  # EKS Add-ons
  enable_amazon_eks_vpc_cni            = true
  enable_amazon_eks_coredns            = true
  enable_amazon_eks_kube_proxy         = true
  enable_amazon_eks_aws_ebs_csi_driver = true

  # Self-managed Add-ons
  enable_aws_for_fluentbit            = true
  enable_aws_load_balancer_controller = true
  enable_aws_efs_csi_driver           = true
  enable_cluster_autoscaler           = true
  enable_metrics_server               = true
}

Эта же конфигурация на CDK, будет выглядеть следующим образом:

const stackId = "<stack_id>";

// By default will provision in a new VPC
blueprints.EksBlueprint.builder()
    .region('us-west-2')
    .version(eks.KubernetesVersion.V1_21)
    .addOns(
        new blueprints.addons.VpcCniAddOn(),
        new blueprints.addons.CoreDnsAddOn(),
        new blueprints.addons.KubeProxyAddOn(),
        
        // Self-managed Add-ons
        new blueprints.addons.AwsForFluentBitAddOn(),
        new blueprints.addons.AwsLoadBalancerControllerAddOn(),
        new blueprints.addons.ClusterAutoScalerAddOn(),
        new blueprints.addons.EfsCsiDriverAddOn(),
        new blueprints.addons.MetricsServerAddOn()
    )
    .build(app, stackId);

Настройка дополнительных модулей (add-on) Kubernetes

Каждое дополнение указывает на Helm репозиторий с открытым исходным кодом. EKS Blueprints включает конфигурацию IAM ролей для сервисных аккаунтов (IRSA) по умолчанию для каждого дополнения, которое выполняет запросы к AWS API. Если вам нужна расширенная конфигурация (например, частный Helm репозиторий), вы можете легко переопределить значения по умолчанию.

Например, образы Docker, используемые в Helm чарте, можно заменить в values.yaml на частные Docker репозитории, такие как ECR или Artifactory. В следующем коде показано, как поддерживать расширенную настройку для AWS Load Balancer Controller дополнения:

module "kubernetes_addons" {
  source = "github.com/aws-ia/terraform-aws-eks-blueprints//modules/kubernetes-addons?ref=v4.0.2"

  eks_cluster_id = module.eks_blueprints.eks_cluster_id

  enable_aws_load_balancer_controller = true
  aws_load_balancer_controller_helm_config = {
    name       = "aws-load-balancer-controller"
    chart      = "aws-load-balancer-controller"
    repository = "https://aws.github.io/eks-charts"
    version    = "1.3.1"
    namespace  = "kube-system"
    values = [templatefile("${path.module}/values.yaml", { 
        operating_system = "linux"
    })]
  }
}

Эта же конфигурация на CDK:

const loadBalancerAddOn = new blueprints.AwsLoadBalancerControllerAddOn({
    name: "aws-load-balancer-controller",
    chart: "aws-load-balancer-controller",
    repository: "https://aws.github.io/eks-charts",
    version: "1.3.1",
    namespace: "kube-system",
    enableWaf: true, 
    values: {
        operating_system: "linux"
    } 
});

blueprints.EksBlueprint.builder()
    .addOns(loadBalancerAddOn)
    .build(app, stackId);

Рабочие ноды (Worker nodes)

EKS Blueprints поддерживает инициализацию EKS кластеров с различными вычислительными конфигурациями, включая управляемые группы нод, самоуправляемые группы нод и AWS Fargate профили:

module "eks_blueprints" {
  ...
 # Managed Node Groups
  managed_node_groups = {
    mg_5 = {
      node_group_name = "managed-ondemand"
      instance_types  = ["m5.large"]
      min_size        = "2"
      max_size        = "5"
    }
  }

  # Fargate Profiles
  fargate_profiles = {
    default = {
      fargate_profile_name = "default"
      fargate_profile_namespaces = [{
        namespace = "default"
      }]
      additional_tags = { ExtraTag = "Fargate" }
    }
  }
}

Вы также можете указать такую-же конфигурацию с помощью CDK:

...
// Managed Node Group
const props: blueprints.MngClusterProviderProps = {
  version: eks.KubernetesVersion.V1_21,
  minSize: 2,
  maxSize: 5,
  instanceTypes: [new ec2.InstanceType('m5.large')],
}
const mngClusterProvider = new blueprints.MngClusterProvider(props);

// Fargate Profile
const fargateProfiles: Map<string, eks.FargateProfileOptions> = new Map([
    ["default", { selectors: [{ namespace: "default" }] }]
]);
  
const fargateClusterProvider = new blueprints.FargateClusterProvider({
    fargateProfiles,
    version: eks.KubernetesVersion.V1_21
});
...

Кластеры для нескольких команд

Если вы хотите разрешить нескольким командам запускать рабочие нагрузки в одном кластере, EKS Blueprints предоставляет подход для обеспечения мягкой многопользовательской аренды (soft multi-tenancy). Как определено в руководстве EKS Best Practice Guides, soft multi-tenancy использует встроенные конструкции Kubernetes (например, пространства имен, роли, привязки ролей (role bindings) и сетевые политики) для создания логического разделения между владельцами. Если у вас есть жесткие требования к многопользовательской среде (hard multi-tenancy), например, поставщики программного обеспечения как услуги (SaaS), которым необходимо запускать полностью изолированные рабочие нагрузки для разных клиентов, мы рекомендуем создавать выделенные кластеры для каждого клиента.

Для soft multi-tenancy (мягкой мультиарендности) EKS Blueprints позволяет легко настроить команды и удостоверения, имеющие доступ к кластеру, а также ресурсы, к которым имеют доступ команды и удостоверения. В настоящее время поддерживаются два типа команд: платформы и приложения. Команды платформы представляют администраторов платформы, имеющих доступ администратора к кластеру EKS. Команды приложений представляют команды, управляющие рабочими нагрузками, запущенными в пространствах имен кластера. Команды приложений получают доступ к одному или нескольким выделенным пространствам имен в кластере:

module “eks-blueprints” {
  …
  application_teams = {
    team-blue = {
      "labels" = {
        "appName" = "blue-team-app",
      }
      "quota" = {
        "requests.cpu"    = "2000m",
        "requests.memory" = "4Gi",
        "limits.cpu"      = "2000m",
        "limits.memory"   = "8Gi",
      }
      users = ["arn:aws:iam::<aws-account-id>:user/team-blue-user"]
    }
  }

  platform_teams = {
    platform_admin = {
      users = ["arn:aws:iam::<aws-account-id>:user/platform-user"]
    }
  }
}

И CDK реализация:

const applicationTeam = new blueprints.ApplicationTeam({
    name: "team-blue",
    namespaceLabels: {
        appName: "example",
    },
    namespaceHardLimits: {
        "requests.cpu"   : "1000m",
        "requests.memory" : "4Gi",
        "limits.cpu"      : "2000m",
        "limits.memory"   : "8Gi",
    },
    users: [new ArnPrincipal("arn:aws:iam::<aws-account-id>:user/team-blue-user")]
});

const platformTeam = new blueprints.PlatformTeam({
    name: "platform-admin",
    users: [new ArnPrincipal("arn:aws:iam::<aws-account-id>:user/platform-user")]
});

blueprints.EksBlueprint.builder() 
    .teams(applicationTeam, platformTeam) 
    .build(app, stackId);

GitOps

Если вы хотите использовать GitOps подход к развертыванию дополнений и рабочих нагрузок в EKS кластере, EKS Blueprints предоставляет встроенную поддержку развертывания Argo CD. Вы можете легко развернуть EKS кластер с установленным Argo CD, с предустановленным одним или множеством Argo CD приложений.

EKS Blueprints предоставляет два примера репозиториев Argo CD: репозиторий рабочих нагрузок, который демонстрирует, как управлять конфигурацией рабочих нагрузок, и репозиторий дополнений, который демонстрирует, как управлять конфигурацией дополнений. Оба репозитория следуют шаблону Argo CD App of Apps Pattern. Следующий пример кода демонстрирует развертывание EKS кластера с установленным Argo CD, и двумя Argo CD приложениями, использующие репозитории с примерами:

module “kubernetes-addons” {
  ...
  enable_argocd         = true
  argocd_manage_add_ons = true # Indicates that Argo CD is responsible for managing/deploying Add-ons.
  addons = {
    path               = "chart"
    repo_url           = "https://github.com/aws-samples/eks-blueprints-add-ons.git"
    add_on_application = true
  }
  workloads = {
    path               = "envs/dev"
    repo_url           = "https://github.com/aws-samples/eks-blueprints-workloads.git"
    add_on_application = false
  }
}

И с помощью CDK

const stackId = "<stack_id>";

const argoBootstrapAddOn = new blueprints.ArgoCDAddOn({
    bootstrapRepo: {
        repoUrl: "https://github.com/aws-samples/eks-blueprints-workloads.git",
        path: 'envs/dev'
    }
});

blueprints.EksBlueprint.builder()
    .addOns(argoBootstrapAddOn)
    .build(app, stackId);

Сотрудничество с партнерами AWS

В процессе создания EKS Blueprints мы тесно сотрудничали с несколькими AWS партнерами по проектированию дополнений для их продуктов и услуг. Создав дополнение для EKS Blueprints, наши партнеры могут снизить затраты, связанные с загрузкой своего программного обеспечения в EKS кластер с надлежащей конфигурацией. Datadog, Dynatrace, HashiCorp, Kubecost, NewRelic, Ondat, Rafay, Snyk, Tetrate, Kasten By Veeam создали дополнения, которые позволяют клиентам использовать их продукты с EKS Blueprints. Для других партнеров AWS, заинтересованных в создании дополнений, пожалуйста, ознакомьтесь с руководствами по расширению возможностей в соответствующих репозиториях Terraform и CDK.

Концептуально возможности EKS Blueprints не ограничены конкретными инструментами, такими как CDK или Terraform. Партнеры AWS могут свободно использовать наши инструменты, участвовать в коллективной разработке посредством совместной работы с открытым исходным кодом или разрабатывать свои собственные инструменты. Например, Pulumi, AWS партнер и владелец популярного инструмента «инфраструктура как код» (IaC), присоединилась к нашим стараниям, объявив о выпуске собственной версии EKS Blueprints от Pulumi, доступной в предварительной версии уже сегодня.

Куда мы движемся

EKS Blueprints был разработан с открытым исходным кодом в течение последнего года увлеченной группой архитекторов решений и специалистов AWS. Нам посчастливилось работать с сообществом разработчиков открытого кода, нашими клиентами и партнерами, чтобы получить обратную связь и помочь сформировать направление развития проекта. Наша публичная дорожная карта доступна сегодня в репозиториях Terraform и CDK, и мы хотим услышать ваше мнение. Какие дополнительные модули были бы полезны? Какие новые blueprints мы можем создать?

Наконец, сообщество EKS Blueprints открыто для всех. У нас есть небольшое, но растущее сообщество разработчиков открытого исходного кода, которое вносит свой вклад в проект, и мы хотим расширить нашу базу участников. Если вы заинтересованы в участии в проекте, мы приветствуем любой вклад в проекты Terraform или CDK, включая сообщения об ошибках, новые возможности, исправления или дополнительную документацию.

Следующие шаги

Чтобы начать работу с EKS Blueprints, посетите репозитории EKS Blueprints для Terraform или EKS Blueprints для CDK. Там вы найдете ссылки на полную документацию по проекту и инструкции по началу работы.

Доступность, цены и поддержка

EKS Blueprints для Terraform и CDK уже доступны на GitHub. Их можно использовать для создания EKS сред в любом AWS регионе, где EKS доступен в настоящее время. Поддержка EKS Anywhere включена в нашу дорожную карту.

EKS Blueprints бесплатен в использовании — вы платите только за ресурсы, которые вы развертываете. Например, при развертывании EKS кластера с управляемой группой нод, взимается стандартная плата за EKS и EC2.

EKS Blueprints — это проект с открытым исходным кодом, управляемый сообществом, а не часть услуги AWS, поэтому он не включен в корпоративную поддержку (enterprise support) AWS. Все службы AWS, предоставляемые EKS Blueprints, такие как EKS, полностью поддерживаются. Если вам нужна помощь в использовании EKS Blueprints, пожалуйста, создайте задачу в нашем репозитории GitHub. AWS Professional Services и партнеры AWS также готовы помочь.