Розгортання AWS EKS за допомогою Pulumi та Go: Додавання Cluster Autoscaler

Продовження попередньої статті, Використання Pulumi та Go для розгортання AWS EKS — Створення групи вузлів EKS. Після налаштування групи вузлів EKS ми тепер інтегруємо Cluster Autoscaler та обговоримо Helm. Cluster Autoscaler допомагає автоматично налаштовувати кількість вузлів залежно від навантаження, тоді як Helm спрощує встановлення пакетів Kubernetes.

У цій статті ми продемонструємо, як розгорнути Cluster Autoscaler в Pulumi, з оглядом використання Helm та поясненням, чим Pulumi Helm відрізняється від Helm CLI, а також основними міркуваннями щодо управління чартами. Наприкінці надамо приклад коду cluster_autoscaler.go, сподіваючись, що він допоможе вам керувати всіма деталями під час налаштування EKS.

Чому нам потрібен Cluster Autoscaler?

У середовищі Kubernetes Cluster Autoscaler постійно моніторить вимоги до ресурсів контейнерів (Pods). Якщо він виявляє, що вузлів недостатньо, він може динамічно додавати або видаляти вузли за допомогою AWS Auto Scaling. Це значно покращує еластичність.
У попередній статті ми налаштували наш EKS Cluster і групу вузлів. Тепер нам лише необхідно підключити цей компонент для автоматичного масштабування EKS в залежності від змін у навантаженні — запобігаючи відключенням через нестачу ресурсів та економлячи кошти в періоди низької активності.

Helm проти Pulumi Helm: В чому різниця?

  • Helm CLI:
    • Менеджер пакетів для Kubernetes, який дозволяє вам встановлювати, оновлювати та управляти додатками в кластері за допомогою чартів.
    • Ви зазвичай виконуєте команди, такі як helm install mychart та helm upgrade mychart, і вручну підтримуєте файли values.yaml.
    • Стан зберігається здебільшого в Kubernetes (як релізи Helm) і керується через Helm CLI та його історію релізів.
  • Pulumi Helm:
    • Замість того, щоб використовувати Helm CLI окремо, ви інтегруєте Helm у свій підхід Інфраструктури як код (IaC) через SDK Pulumi.
    • Ваші релізи Helm і їх параметри стають частиною стану Pulumi. Pulumi може автоматично керувати, відслідковувати та оновлювати ці релізи поряд з іншими хмарними ресурсами (наприклад, IAM, S3, EKS Node Groups).
    • Зміни в параметрах чартів або їх версіях стають простими змінами в коді на Go (або інших мовах, підтримуваних Pulumi). Коли ви запускаєте команду pulumi up, Pulumi порівнює те, що в вашому коді, із поточним станом стека, і оновлює лише необхідні частини.

Використовуючи Pulumi Helm, вам не потрібно окремо керувати станом для релізів Helm чи вручну запускати команди Helm. Все контролюється програмно в рамках одного конвеєра розгортання, що дозволяє вам керувати Kubernetes і хмарними ресурсами як частинами єдиного, злагодженого рішення IaC.

Чому використовувати Pulumi разом з Helm?

  1. Управління Інфраструктурою як код (IaC)
    Pulumi безпосередньо керує ресурсами Kubernetes та хмари через код (Go, TypeScript, Python тощо), що усуває потребу в триманні кількох окремих файлів YAML. Helm, який вже спрощує розгортання, стає ще потужнішим, коли його інтегрують із підходом Pulumi на основі коду.
  2. Управління станом
    Pulumi фіксує, які ресурси були створені в стеці проекту, включаючи будь-які використані параметри. Коли ви запускаєте pulumi up, він автоматично порівнює поточний стан і оновлює його при необхідності — включаючи ваші Helm чарті.
  3. Тісна інтеграція з іншими хмарними ресурсами
    В одному проекті Pulumi ви можете створити ролі IAM, бакети S3, групи вузлів EKS, а потім за допомогою модуля Pulumi Helm розгорнути Cluster Autoscaler або інші загальні додатки, такі як Prometheus або Ingress Controllers — все це в одному CI/CD конвеєрі.

Загальний процес розгортання

  1. Створіть OIDC провайдера: Необхідно для довіри між EKS та IAM ролями для облікових записів служб (IRSA).
  2. Створіть IAM роль: Прив'язати необхідні дозволи AutoScaling для Cluster Autoscaler.
    3.
    Створіть ServiceAccount: Створіть обліковий запис у Kubernetes спеціально для Autoscaler та анотуючи його для зв'язку з IAM роллю.
  3. Використання Pulumi Helm для розгортання Cluster Autoscaler: Надайте відповідні параметри (ім'я кластера, регіон тощо) і дозвольте чарту використовувати кастомний ServiceAccount.

Крок 4 демонструє класичний приклад поєднання Pulumi та Helm, детальніше пояснений нижче!

Pulumi з Helm: Як це працює

Коли ви використовуєте Pulumi для Go, ви можете імпортувати Helm з модуля github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/helm/v3. Типовий фрагмент виглядає ось так:

import (  
 "github.com/pulumi/pulumi/sdk/v3/go/pulumi"  
 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/helm/v3"  
)  

func installSomeHelmChart(ctx *pulumi.Context) error {  
 _, err := helm.NewChart(ctx, "example-chart", helm.ChartArgs{  
 Chart: pulumi.String("chart-name"),  
 Version: pulumi.String("chart-version"),  
 Namespace: pulumi.String("target-namespace"),  
 FetchArgs: helm.FetchArgs{  
 Repo: pulumi.String("https://helm.repo.url"),  
 },  
 Values: pulumi.Map{  
 // any key/value pair you want to override in values.yaml  
 },  
 })  
 return err  
}
  • Chart: Назва Helm чарту (або локальний шлях до файлу).
  • Version: Конкретна версія чарту. Для продакшн-середовища рекомендується заблокувати версію.
  • FetchArgs.Repo: URL репозиторію Helm чарту.
  • Values: Параметри, які ви зазвичай передаєте за допомогою helm install -f values.yaml.
  • Namespace: Простір імен, в якому буде розгорнуто чарт.

Коли ви запускаєте pulumi up, Pulumi викликає Helm у фоновому режимі, встановлюючи чарт та відстежуючи деталі встановлення в стеку Pulumi. На відміну від використання helm install вручну (де ви покладаєтесь на внутрішнє управління релізами Helm), Pulumi автоматично керує життєвим циклом чарту в межах свого стану, що відповідає підходу Infrastructure as Code.

Приклад коду Cluster Autoscaler + Pulumi Helm

Нижче наведено повний код cluster_autoscaler.go, який демонструє налаштування OIDC провайдера, IAM ролі та Pulumi Helm в одному виконанні.
Найважливіша частина — це Крок 3, де ми встановлюємо Cluster Autoscaler за допомогою helm.NewChart і передаємо параметри, такі як clusterName, awsRegion і ServiceAccount.

package main  

import (  
 "fmt"  
 "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iam"  
 corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"  
 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/helm/v3"  
 metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"  
 "github.com/pulumi/pulumi/sdk/v3/go/pulumi"  
)  
// DeployClusterAutoscaler розгортає Cluster Autoscaler та налаштовує IAM роль для ServiceAccount та OIDC провайдера  
func DeployClusterAutoscaler(ctx *pulumi.Context, clusterName, namespace, awsAccountID, awsRegion string) error {  
 // Визначте OIDC Issuer для вашого EKS кластера  
 // Замініть XXXXXXXXX на ваш реальний OIDC Provider ID, наприклад, "oidc.eks.region.amazonaws.com/id/ABCDEFG..."  
 oidcIssuer := "oidc.eks.us-east-1.amazonaws.com/id/XXXXXXXXX"  
 // Крок 0: Створіть OIDC провайдера  
 _, err := iam.NewOpenIdConnectProvider(ctx, "eksOidcProvider", &iam.OpenIdConnectProviderArgs{  
 Url: pulumi.String(fmt.Sprintf("https://%s", oidcIssuer)),  
 ClientIdLists: pulumi.StringArray{  
 pulumi.String("sts.amazonaws.com"),  
 },  
 // Використовуємо зразковий відбиток пальця з документації AWS для EKS OIDC провайдера  
 // ! Для продакшн середовища динамічно отримуйте та регулярно оновлюйте відбиток пальця  
 ThumbprintLists: pulumi.StringArray{  
 pulumi.String("9eada5905e1f7b1cf63f9c521f820dab9df95991"),  
 },  
 })  
 if err != nil {  
 return fmt.Errorf("не вдалося створити OIDC провайдера: %v", err)  
 }  
 ctx.Log.Info("OIDC провайдер успішно створений.", nil)  
 // Крок 1: Створіть IAM роль та прив'яжіть дозволи AutoScaling  
 assumeRolePolicy := fmt.Sprintf(`{  
 "Version": "2012-10-17",  
 "Statement": [  
 {  
 "Effect": "Allow",  
 "Principal": {  
 "Federated": "arn:aws:iam::%s:oidc-provider/%s"  
 },  
 "Action": "sts:AssumeRoleWithWebIdentity",  
 "Condition": {  
 "StringEquals": {  
 "%s:sub": "system:serviceaccount:%s:cluster-autoscaler"  
 }  
 }  
 }  
 ]  
 }`, awsAccountID, oidcIssuer, oidcIssuer, namespace)  
 role, err := iam.NewRole(ctx, "clusterAutoscalerRole", &iam.RoleArgs{  
 AssumeRolePolicy: pulumi.String(assumeRolePolicy),  
 })  
 if err != nil {  
 return fmt.Errorf("не вдалося створити IAM роль: %v", err)  
 }  
 _, err = iam.NewRolePolicyAttachment(ctx, "clusterAutoscalerPolicyAttach", &iam.RolePolicyAttachmentArgs{  
 Role: role.Name,  
 PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AutoScalingFullAccess"),  
 })  
 if err != nil {  
 return fmt.Errorf("не вдалося прикріпити IAM політику: %v", err)  
 }  
 ctx.Log.Info("IAM роль створена та політика прикріплена успішно.", nil)  
 // Крок 2: Створіть Kubernetes ServiceAccount та анотуючи його IAM роллю  
 serviceAccountName := "cluster-autoscaler"  
 _, err = corev1.NewServiceAccount(ctx, serviceAccountName, &corev1.ServiceAccountArgs{  
 Metadata: &metav1.ObjectMetaArgs{  
 Name: pulumi.String(serviceAccountName),  
 Namespace: pulumi.String(namespace),  
 Annotations: pulumi.StringMap{  
 "eks.amazonaws.com/role-arn": role.Arn, // Посилання на IAM роль  
 },  
 },  
 })  
 if err != nil {  
 return fmt.Errorf("не вдалося створити Kubernetes ServiceAccount: %v", err)  
 }  
 ctx.Log.Info("Kubernetes ServiceAccount успішно створено.", nil)  
 // Крок 3: Розгортання Cluster Autoscaler за допомогою Helm  
 _, err = helm.NewChart(ctx, "cluster-autoscaler", helm.ChartArgs{  
 Chart: pulumi.String("cluster-autoscaler"),  
 Version: pulumi.String("9.43.2"),  
 Namespace: pulumi.String(namespace),  
 FetchArgs: helm.FetchArgs{  
 Repo: pulumi.String("https://kubernetes.github.io/autoscaler"),  
 },  
 Values: pulumi.Map{  
 "fullnameOverride": pulumi.String("cluster-autoscaler"),  
 "autoDiscovery": pulumi.Map{  
 "clusterName": pulumi.String(clusterName), // Ім'я EKS кластера  
 },  
 "awsRegion": pulumi.String(awsRegion),  
 "rbac": pulumi.Map{
"create": pulumi.Bool(true),  
 },  
 "serviceAccount": pulumi.Map{  
 "create": pulumi.Bool(false), // Не створювати ServiceAccount  
 "name": pulumi.String(serviceAccountName),  
 },  
 },  
 })  
 if err != nil {  
 return fmt.Errorf("не вдалося розгорнути Cluster Autoscaler: %v", err)  
 }  
 ctx.Log.Info("Cluster Autoscaler успішно розгорнуто!", nil)  
 return nil  
}

Ключові параметри

1.
oidcIssuer`

  • URL вашого OIDC постачальника для кластеру (без https://), наприклад: oidc.eks.ap-northeast-1.amazonaws.com/id/ABCDEFG.... Ось як це виглядає:

pic

Ви можете знайти це на сторінці EKS

2. Thumbprint

  • Показано тут як приклад значення. У реальному виробничому середовищі використовуйте метод для динамічного отримання та регулярного оновлення відбитка сертифіката.

3. autoDiscovery.clusterName

  • Назва кластеру EKS, до якого має звертатися Autoscaler.

4. serviceAccount.create = false

  • Ми вже вручну створили ServiceAccount (з анотаціями IAM Role), тому вимикаємо створення через Helm chart.

Інтеграція Cluster Autoscaler та ключові параметри в main.go

Наступний код показує, як визначити і налаштувати awsAccountID, awsRegion, namespace тощо в основному файлі проєкту Pulumi (main.go). Також викликається раніше визначена функція DeployClusterAutoscaler після того, як кластер EKS та Node Group були створені.
oidcIssuer`

  • URL вашого OIDC постачальника для кластеру (без https://), наприклад: oidc.eks.ap-northeast-1.amazonaws.com/id/ABCDEFG.... Ось як це виглядає:

pic

Ви можете знайти це на сторінці EKS

2. Thumbprint

  • Показано тут як приклад значення. У реальному виробничому середовищі використовуйте метод для динамічного отримання та регулярного оновлення відбитка сертифіката.

3. autoDiscovery.clusterName

  • Назва кластеру EKS, до якого має звертатися Autoscaler.

4. serviceAccount.create = false

  • Ми вже вручну створили ServiceAccount (з анотаціями IAM Role), тому вимикаємо створення через Helm chart.

Інтеграція Cluster Autoscaler та ключові параметри в main.go

Наступний код показує, як визначити і налаштувати awsAccountID, awsRegion, namespace тощо в основному файлі проєкту Pulumi (main.go). Також викликається раніше визначена функція DeployClusterAutoscaler після того, як кластер EKS та Node Group були створені.

package main  

import (  
 eks2 "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/eks"  
 "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iam"  
 "github.com/pulumi/pulumi-awsx/sdk/v2/go/awsx/ec2"  
 "github.com/pulumi/pulumi-eks/sdk/v3/go/eks"  
 "github.com/pulumi/pulumi/sdk/v3/go/pulumi"  
 "github.com/pulumi/pulumi/sdk/v3/go/pulumi/config"  
)  
func main() {  
 pulumi.Run(func(ctx *pulumi.Context) error {  
 clusterName := "DevCluster"  
 namespace := "kube-system"  
 //oidcProviderURL := "oidc.eks.us-east-1.amazonaws.com/id/8797CA303945CF1BA7E1CAEBBCA1FBD6"  
 awsAccountID := "378501681221"  
 awsRegion := "us-east-1"  
 value := eks.ResolveConflictsOnCreate("OVERWRITE")  
 // Отримати значення конфігурації або встановити значення за замовчуванням  
 cfg := config.New(ctx, "")  
 minClusterSize, err := cfg.TryInt("minClusterSize")  
 if err != nil {  
 minClusterSize = 1  
 }  
 maxClusterSize, err := cfg.TryInt("maxClusterSize")  
 if err != nil {  
 maxClusterSize = 3  
 }  
 desiredClusterSize, err := cfg.TryInt("desiredClusterSize")  
 if err != nil {  
 desiredClusterSize = 1  
 }  
 eksNodeInstanceType, err := cfg.Try("eksNodeInstanceType")  
 if err != nil {  
 eksNodeInstanceType = "t3a.medium"  
 }  
 vpcNetworkCidr, err := cfg.Try("vpcNetworkCidr")  
 if err != nil {  
 vpcNetworkCidr = "10.0.0.0/16"  
 }  
 // Створюємо нову VPC, підмережі та супутню інфраструктуру  
 eksVpc, err := ec2.NewVpc(ctx, "eks-vpc", &ec2.VpcArgs{  
 EnableDnsHostnames: pulumi.Bool(true),  
 CidrBlock: &vpcNetworkCidr,  
 })  
 if err != nil {  
 return err  
 }  
 apiAuthMode := eks.AuthenticationModeApi  
 // Створюємо новий EKS кластер  
 eksCluster, err := eks.NewCluster(ctx, "eks-cluster", &eks.ClusterArgs{  
 Name: pulumi.String(clusterName),  
 // Розміщуємо кластер в новій VPC, створеній раніше  
 VpcId: eksVpc.VpcId,  
 // Використовуємо "API" для автентифікації  
 AuthenticationMode: &apiAuthMode,  
 // Публічні підмережі будуть використовуватися для балансувальників навантаження  
 PublicSubnetIds: eksVpc.PublicSubnetIds,  
 // Приватні підмережі будуть використовуватися для вузлів кластера  
 PrivateSubnetIds: eksVpc.PrivateSubnetIds,  
 // Змініть конфігураційні значення вище для зміни будь-яких з наступних налаштувань  
 //InstanceType: pulumi.String(eksNodeInstanceType),  
 //DesiredCapacity: pulumi.Int(desiredClusterSize),  
 //MinSize: pulumi.Int(minClusterSize),  
 //MaxSize: pulumi.Int(maxClusterSize),  
 // Не надавайте публічну IP адресу для робочих вузлів  
 NodeAssociatePublicIpAddress: pulumi.BoolRef(false),  
 // Змінити ці значення для приватного кластера (потрібен доступ через VPN)  
 EndpointPrivateAccess: pulumi.Bool(true),  
 EndpointPublicAccess: pulumi.Bool(true),  
 SkipDefaultNodeGroup: pulumi.BoolRef(true),  
 CorednsAddonOptions: &eks.CoreDnsAddonOptionsArgs{  
 Version: pulumi.String("v1.11.3-eksbuild.2"),  
 Enabled: pulumi.BoolRef(true),  
 ResolveConflictsOnCreate: &value,  
 },  
 //CreateOidcProvider: pulumi.Bool(true),  
 })  
 if err != nil {  
 return err  
 }  
 tagSubnets(ctx, eksVpc.PublicSubnetIds, "kubernetes.io/role/elb", "1")  
 tagSubnets(ctx, eksVpc.PrivateSubnetIds, "kubernetes.io/role/internal-elb", "1")  
 // Створюємо IAM роль для керованої групи вузлів  
 nodeGroupRole, err := iam.NewRole(ctx, "eks-nodegroup-role", &iam.RoleArgs{  
 AssumeRolePolicy: pulumi.String(`{  
 "Version": "2012-10-17",  
 "Statement": [  
 {  
 "Effect": "Allow",  
 "Principal": {  
 "Service": "ec2.amazonaws.com"  
 },  
 "Action": "sts:AssumeRole"  
 }  
 ]  
 }`),  
 })  
 if err != nil {  
 return err  
 }  
 _, err = iam.NewRolePolicyAttachment(ctx, "eks-nodegroup-policy-attachment", &iam.RolePolicyAttachmentArgs{  
 Role: nodeGroupRole.Name,  
 PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"),  
 })  
 if err != nil {  
 return err  
 }  
 _, err = iam.NewRolePolicyAttachment(ctx, "eks-cni-policy-attachment", &iam.RolePolicyAttachmentArgs{
Role: nodeGroupRole.Name,  
 PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"),  
 })  
 if err != nil {  
 return err  
 }  
 _, err = iam.NewRolePolicyAttachment(ctx, "eks-registry-policy-attachment", &iam.RolePolicyAttachmentArgs{  
 Role: nodeGroupRole.Name,  
 PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"),  
 })  
 if err != nil {  
 return err  
 }  
 // Створюємо нову Node Group  
 nodeGroup, err := eks.NewManagedNodeGroup(ctx, "eks-nodegroup", &eks.ManagedNodeGroupArgs{  
 Cluster: eksCluster,  
 NodeGroupName: pulumi.String("dev-ng"),  
 InstanceTypes: pulumi.StringArray{  
 pulumi.String(eksNodeInstanceType),  
 },  
 DiskSize: pulumi.Int(50),  
 ScalingConfig: eks2.NodeGroupScalingConfigArgs{  
 MinSize: pulumi.Int(minClusterSize),  
 MaxSize: pulumi.Int(maxClusterSize),  
 DesiredSize: pulumi.Int(desiredClusterSize),  
 },  
 NodeRoleArn: nodeGroupRole.Arn,  
 CapacityType: pulumi.String("SPOT"),  
 AmiId: pulumi.String("ami-02c0c54a3a6c62ac1"),  
 })  
 if err != nil {  
 return err  
 }  
 err = DeployClusterAutoscaler(ctx, clusterName, namespace, awsAccountID, awsRegion)  
 if err != nil {  
 return err  
 }  
 // Експортуємо деякі значення на випадок, якщо вони знадобляться в інших частинах  
 ctx.Export("kubeconfig", eksCluster.Kubeconfig)  
 ctx.Export("vpcId", eksVpc.VpcId)  
 ctx.Export("eksNodeGroupName", nodeGroup.NodeGroup.NodeGroupName())  
 return nil  
 })  
}

Основні моменти main.go

1.
awsAccountID
, awsRegion, and namespace

  • Ці параметри передаються в DeployClusterAutoscaler.
  • awsAccountID використовується для створення OIDC Provider ARN; awsRegion допомагає Helm Chart вказати правильний регіон AWS; а namespace зазвичай має значення kube-system (хоча його можна налаштувати).

2. ФункціяtagSubnets`

  • Ця функція додає теги на зразок kubernetes.io/role/elb=1 або kubernetes.io/role/internal-elb=1 до підмереж, щоб EKS (та ELB) знали, які підмережі доступні для зовнішніх або внутрішніх балансувальників навантаження.
  • Для публічних підмереж зазвичай використовують тег role/elb; для приватних підмереж — role/internal-elb.

3. DeployClusterAutoscaler

  • Як було описано в попередній статті, ця функція складається з:
  1. Створення OIDC Provider
  2. Створення та прикріплення IAM ролі для Cluster Autoscaler
  3. Створення Kubernetes ServiceAccount з відповідною анотацією IAM ролі
  4. Встановлення Autoscaler chart через Pulumi Helm

Висновок

Виконуючи вищезазначені кроки, ви не тільки розгортаєте Cluster Autoscaler, але й дізнаєтеся, як використовувати Pulumi для керування будь-яким розгортанням Kubernetes через Helm. Такий підхід значно покращує автоматизацію та трасування, оскільки всі налаштування управляються і версійно контролюються в коді.

  • Cluster Autoscaler: дозволяє вашому EKS кластеру автоматично збільшувати чи зменшувати кількість вузлів.
  • Helm CLI vs. Pulumi Helm: хоча Helm CLI чудово підходить для самостійних розгортань через командний рядок, Pulumi Helm інтегрується безпосередньо в процес IaC (Infrastructure as Code), надаючи єдине керування станом та спрощену автоматизацію.

Порада: Якщо ви хочете встановити інші популярні додатки (як-от NGINX Ingress, Metrics Server чи Prometheus), ви можете зробити це, використовуючи подібний підхід Pulumi + Helm, передаючи всі параметри через Pulumi для єдиного досвіду. Будь-які оновлення чи зміни версій потребують лише незначного коригування коду та запуску `pulumi up` — Pulumi самостійно вирішить всі інші питання.

Сподіваємося, що цей посібник допоможе вам налаштувати повністю автоматизоване середовище EKS з автоматичним масштабуванням. Якщо у вас є запитання чи пропозиції, не соромтеся залишати коментарі.
Дякуємо за прочитання!

Завершена картинка:

pic

pulumi up

pic

8М до цього

pic

Не забувайте про вік вузлів

Джерела

[

Отримання відбитка сертифіката для провайдера OpenID Connect

Як вручну отримати відбиток (підпис) сертифіката сервера для провайдера OIDC, щоб перевірити, чи відповідає він…

docs.aws.amazon.com

](https://docs.aws.amazon.com/IAM/latest/UserGuide/idrolesproviderscreateoidcverify-thumbprint.html?source=postpage-----2a0d7d52d9e6--------------------------------)

[

Усунення помилки InvalidIdentityToken при використанні ролі EKS IAM

Відбиток сертифіката для мого кластеру Amazon Elastic Kubernetes Service (Amazon EKS) змінився і викликав помилку з Application Load…

repost.aws

](https://repost.aws/knowledge-center/eks-error-invalid-identity-token?source=post_page-----2a0d7d52d9e6--------------------------------)

[

Helm

Helm — Менеджер пакетів для Kubernetes.

helm.sh

](https://helm.sh/?source=post_page-----2a0d7d52d9e6--------------------------------)

[

Chart

Документація для ресурсу kubernetes.helm.sh/v3.Chart з прикладами, вхідними властивостями, вихідними властивостями, пошуком…

www.pulumi.com

](https://www.pulumi.com/registry/packages/kubernetes/api-docs/helm/v3/chart/?source=post_page-----2a0d7d52d9e6--------------------------------)

[

cluster-autoscaler 9.45.0 · kubernetes/cluster-autoscaler

Масштабування робочих вузлів Kubernetes у межах груп автоскейлінгу.

artifacthub.io

](https://artifacthub.io/packages/helm/cluster-autoscaler/cluster-autoscaler?source=post_page-----2a0d7d52d9e6--------------------------------)

[

Розгортання AWS EKS за допомогою Pulumi та Go: Створення Node Group для EKS

У моїй попередній статті "Розгортання AWS EKS за допомогою Pulumi та Go: Налаштування середовища та інфраструктури мережі" ми розглянули…

awstip.com

](https://awstip.com/deploying-aws-eks-with-pulumi-and-go-creating-the-eks-node-group-67c916ee6109?source=post_page-----2a0d7d52d9e6--------------------------------)

Перекладено з: Deploying AWS EKS with Pulumi and Go: Adding Cluster Autoscaler

Leave a Reply

Your email address will not be published. Required fields are marked *