Блог 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 также готовы помочь.