Aws-alb-controller: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 10 промежуточных версий этого же участника)
Строка 5: Строка 5:
 
[[Категория: SSL]]
 
[[Категория: SSL]]
 
[[Категория: ALB]]
 
[[Категория: ALB]]
  +
   
 
Это заметка про настройку aws-load-balancer-controller<BR>
 
Это заметка про настройку aws-load-balancer-controller<BR>
Строка 25: Строка 26:
 
* При появлении ресурса идет в <code>API</code> AWS и создает <code>ALB</code>
 
* При появлении ресурса идет в <code>API</code> AWS и создает <code>ALB</code>
 
* Для авторизации использует K8s <code>Service account</code>
 
* Для авторизации использует K8s <code>Service account</code>
** Этот <code>Service Account</code> преднастроен заранее и связан с <code>Trust Policy</code> которая через привязанную <code>IAM Role</code> позволяет делать ограниченный набор запросов к code>API</code>
+
** Этот <code>Service Account</code> преднастроен заранее и связан с <code>Trust Policy</code> которая через привязанную <code>IAM Role</code> позволяет делать ограниченный набор запросов к <code>API</code>
  +
** <code>Trust Policy</code> это не отдельная сущность, а часть <code>IAM Role</code> (я встречал иногда что <code>IAM Role</code> называют <code>Trust Policy</code> но это не выглядит правильным)
   
 
=Установка и настройка=
 
=Установка и настройка=
Строка 34: Строка 36:
 
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
 
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
 
</PRE>
 
</PRE>
<PRE>
 
aws iam create-policy \
 
--policy-name AWSLoadBalancerControllerIAMPolicy \
 
--policy-document file://iam-policy.json
 
</PRE>
 
 
   
 
{{#spoiler:show=Прежде чем применять политику - проверить содержимое файла|
 
{{#spoiler:show=Прежде чем применять политику - проверить содержимое файла|
Строка 297: Строка 293:
   
 
}}
 
}}
  +
 
<PRE>
 
aws iam create-policy \
 
--policy-name AWSLoadBalancerControllerIAMPolicy \
 
--policy-document file://iam-policy.json
 
</PRE>
   
 
==<code>IAM Role</code>==
 
==<code>IAM Role</code>==
Эта роль по сути связывает <code>Service Account</code> (тут это видно из части <code>"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount:kube-system:aws-load-balancer-controller"],</code> и <code>Trust Policy</code>
+
Эта роль по сути связывает <code>Service Account</code> (тут это видно из части <code>"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount:kube-system:aws-load-balancer-controller"],</code> и <code>Policy</code>
 
<BR>
 
<BR>
 
* Создфть файл <code>iam-role.json</code> с содержимым (естественно ID всегда различаются)
 
* Создфть файл <code>iam-role.json</code> с содержимым (естественно ID всегда различаются)
Строка 354: Строка 356:
 
* <code>AWSLoadBalancerControllerIAMPolicy</code> соответсвует имени роли <code> --role-name AWSLoadBalancerControllerIAMRole </code> при создании роли
 
* <code>AWSLoadBalancerControllerIAMPolicy</code> соответсвует имени роли <code> --role-name AWSLoadBalancerControllerIAMRole </code> при создании роли
   
  +
==<code>Service Account</code>==
=SA=
 
  +
Далее требуется создать Service Account который будет привязан к роли.
  +
<BR>
  +
Формат (в общем случае) такой:
 
<PRE>
 
<PRE>
 
apiVersion: v1
 
apiVersion: v1
Строка 364: Строка 369:
 
eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<generated-role-name>
 
eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<generated-role-name>
 
</PRE>
 
</PRE>
  +
<BR>
????
 
  +
И с учетом имени роли и Account ID:
  +
<BR>
 
<PRE>
 
<PRE>
 
apiVersion: v1
 
apiVersion: v1
Строка 375: Строка 382:
 
</PRE>
 
</PRE>
   
=helm=
+
==helm==
  +
После того как подготовительная работа проделана, сожно установить <code>aws-load-balancer-controller</code> <BR>
  +
Используя <code>helm</code>
 
<PRE>
 
<PRE>
 
helm repo add eks https://aws.github.io/eks-charts
 
helm repo add eks https://aws.github.io/eks-charts
Строка 391: Строка 400:
 
</PRE>
 
</PRE>
   
  +
Я не уверене что все параметры строго обязательные, но этот документ следует за официальной документацией :)
  +
* <code>clusterName=<CLUSTER_NAME></code> - имя кластера, должно быть известно (хотя не понятно зачем это знание контроллеру. надо посмотреть код)
  +
* <code> serviceAccount.create=false</code> - не создавать <code> Service Account</code>
  +
* <code> serviceAccount.name=aws-load-balancer-controller</code> использовать созданный заранее <code>Serivce Account</code>
  +
* <code>region=<REGION></code>
 
Регион можно узнать например так
  +
<PRE>
 
aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.arn"
 
"arn:aws:eks:us-east-1:54XXXXXXXXXX:cluster/education-eks-1o3RFCvh"
  +
</PRE>
   
  +
* <code>vpcId=<VPC_ID></code>
  +
<PRE>
 
aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.resourcesVpcConfig.vpcId"
 
aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.resourcesVpcConfig.vpcId"
 
"vpc-0cc5209fbf68dXXXX"
 
"vpc-0cc5209fbf68dXXXX"
  +
</PRE>
  +
* <code>ingressClass=alb</code> - какое значение <code>ingressClassName</code> трактовать как то что требуется создавать балансер типа ALB
   
  +
=Использование =
   
  +
Пример Ingress
Регион можно узнать например так
 
 
<PRE>
 
<PRE>
  +
kind: Ingress
aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.arn"
 
  +
metadata:
"arn:aws:eks:us-east-1:54XXXXXXXXXX:cluster/education-eks-1o3RFCvh"
 
  +
annotations:
  +
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 8080}]'
  +
alb.ingress.kubernetes.io/scheme: internet-facing
  +
finalizers:
  +
- ingress.k8s.aws/resources
  +
spec:
  +
ingressClassName: alb
 
</PRE>
 
</PRE>
  +
* <code> ingressClassName: alb</code> - указывает на то что этот Ingress должен обслуживаться <code>aws-alb-controller</code>. Это значение должно совпадать с <code>--set ingressClass=alb</code>

Текущая версия на 10:55, 29 июня 2025


Это заметка про настройку aws-load-balancer-controller
https://github.com/kubernetes-sigs/aws-load-balancer-controller/tree/main
Просто что бы не забыть шаги

Что такое aws-load-balancer-controller и зачем нужно

Так как блядский цирк AWS не позволяет использовать свои сертефикаты нигде кроме как
на своих ресурсах, то приходится вместо божественного nginx ingress controller
пользоваться ALB
Естественно, что создавать руками (накликивать) каждый раз балансер это не вариант, то хочется что бы
при создании ресурса типа Ingress балансер создавался автоматически.

Для этого и нужен aws-load-balancer-controller

Логика работы (коротко)

Устроено все, если смотреть обзорно, довольно просто

  • aws-load-balancer-controller следит за появлением ресурса типа Ingress
  • При появлении ресурса идет в API AWS и создает ALB
  • Для авторизации использует K8s Service account
    • Этот Service Account преднастроен заранее и связан с Trust Policy которая через привязанную IAM Role позволяет делать ограниченный набор запросов к API
    • Trust Policy это не отдельная сущность, а часть IAM Role (я встречал иногда что IAM Role называют Trust Policy но это не выглядит правильным)

Установка и настройка

Policy

Создать политику (пример идет в комплекте с кодом)

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
aws iam create-policy \
  --policy-name AWSLoadBalancerControllerIAMPolicy \
  --policy-document file://iam-policy.json

IAM Role

Эта роль по сути связывает Service Account (тут это видно из части "oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount:kube-system:aws-load-balancer-controller"], и Policy

  • Создфть файл iam-role.json с содержимым (естественно ID всегда различаются)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Principal": {
                "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012"
            },
            "Condition": {
                "StringEquals": {
                    "oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": [
                        "system:serviceaccount:kube-system:aws-load-balancer-controller"
                    ],
                    "oidc.eks.us-east-1.amazonaws.com/id/123456789085475EA0123456789012:aud": [
                        "sts.amazonaws.com"
                    ]
                }
            }
        }
    ]
}

Значения

  • arn:aws:iam::54XXXXXXXXXX это ID аккаунта
  • oidc.eks.us-east-1.amazonaws.com/id/5918A6B3305CXXXXXXXXXXXXXXXXXXXX как правильно называется это значение,
    я не знаю, но получить его можно следующей коммандой:

aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.identity.oidc.issuer"

  • education-eks-1o3RFCvh это имя кластера

Вывод команды будет примерно таким:

"https://oidc.eks.us-east-1.amazonaws.com/id/5918A6B3305CXXXXXXXXXXXXXXXXXXXX"


Создать роль из подготовленного файла iam-role.json

aws iam create-role \
  --role-name AWSLoadBalancerControllerIAMRole \
  --assume-role-policy-document file://iam-role.json

Attach Policy to Role

aws iam attach-role-policy \
  --role-name AWSLoadBalancerControllerIAMRole \
  --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy

Все очевидно

  • AWSLoadBalancerControllerIAMRole соответвует --policy-name AWSLoadBalancerControllerIAMPolicy ... при создании политики
  • AWSLoadBalancerControllerIAMPolicy соответсвует имени роли --role-name AWSLoadBalancerControllerIAMRole при создании роли

Service Account

Далее требуется создать Service Account который будет привязан к роли.
Формат (в общем случае) такой:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<generated-role-name>


И с учетом имени роли и Account ID:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::54XXXXXXXXXX:role/AWSLoadBalancerControllerIAMRole

helm

После того как подготовительная работа проделана, сожно установить aws-load-balancer-controller
Используя helm

helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=<CLUSTER_NAME> \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller \
  --set region=<REGION> \
  --set vpcId=<VPC_ID> \
  --set ingressClass=alb

Я не уверене что все параметры строго обязательные, но этот документ следует за официальной документацией :)

  • clusterName=<CLUSTER_NAME> - имя кластера, должно быть известно (хотя не понятно зачем это знание контроллеру. надо посмотреть код)
  • serviceAccount.create=false - не создавать Service Account
  • serviceAccount.name=aws-load-balancer-controller использовать созданный заранее Serivce Account
  • region=<REGION>

Регион можно узнать например так

aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.arn"
"arn:aws:eks:us-east-1:54XXXXXXXXXX:cluster/education-eks-1o3RFCvh"
  • vpcId=<VPC_ID>
aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.resourcesVpcConfig.vpcId"
"vpc-0cc5209fbf68dXXXX"
  • ingressClass=alb - какое значение ingressClassName трактовать как то что требуется создавать балансер типа ALB

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

Пример Ingress

kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 8080}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
  finalizers:
  - ingress.k8s.aws/resources
spec:
  ingressClassName: alb
  • ingressClassName: alb - указывает на то что этот Ingress должен обслуживаться aws-alb-controller. Это значение должно совпадать с --set ingressClass=alb