Aws-alb-controller: различия между версиями
Sirmax (обсуждение | вклад) (→role) |
Sirmax (обсуждение | вклад) |
||
| (не показано 29 промежуточных версий этого же участника) | |||
| Строка 5: | Строка 5: | ||
[[Категория: SSL]] |
[[Категория: SSL]] |
||
[[Категория: ALB]] |
[[Категория: ALB]] |
||
| + | |||
Это заметка про настройку aws-load-balancer-controller<BR> |
Это заметка про настройку aws-load-balancer-controller<BR> |
||
https://github.com/kubernetes-sigs/aws-load-balancer-controller/tree/main<BR> |
https://github.com/kubernetes-sigs/aws-load-balancer-controller/tree/main<BR> |
||
Просто что бы не забыть шаги<BR> |
Просто что бы не забыть шаги<BR> |
||
| + | =Что такое <code>aws-load-balancer-controller</code> и зачем нужно= |
||
| + | Так как <s>блядский цирк</s> AWS не позволяет использовать свои сертефикаты нигде кроме как<BR> |
||
| + | на своих ресурсах, то приходится вместо божественного <code>nginx ingress controller</code> <BR> |
||
| + | пользоваться <code>ALB</code> |
||
| + | <BR> |
||
| + | Естественно, что создавать руками (накликивать) каждый раз балансер это не вариант, то хочется что бы <BR> |
||
| + | при создании ресурса типа <code>Ingress</code> балансер создавался автоматически. |
||
| + | <BR> |
||
| + | <BR> |
||
| + | Для этого и нужен <code>aws-load-balancer-controller</code> |
||
| + | =Логика работы (коротко)= |
||
| − | =Policy= |
||
| + | Устроено все, если смотреть обзорно, довольно просто |
||
| + | * <code>aws-load-balancer-controller</code> следит за появлением ресурса типа <code>Ingress</code> |
||
| + | * При появлении ресурса идет в <code>API</code> AWS и создает <code>ALB</code> |
||
| + | * Для авторизации использует K8s <code>Service account</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> но это не выглядит правильным) |
||
| + | |||
| + | =Установка и настройка= |
||
| + | |||
| + | ==Policy== |
||
| + | Создать политику (пример идет в комплекте с кодом) |
||
<PRE> |
<PRE> |
||
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> |
||
| + | |||
| + | {{#spoiler:show=Прежде чем применять политику - проверить содержимое файла| |
||
| + | <PRE> |
||
| + | { |
||
| + | "Version": "2012-10-17", |
||
| + | "Statement": [ |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "iam:CreateServiceLinkedRole" |
||
| + | ], |
||
| + | "Resource": "*", |
||
| + | "Condition": { |
||
| + | "StringEquals": { |
||
| + | "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "ec2:DescribeAccountAttributes", |
||
| + | "ec2:DescribeAddresses", |
||
| + | "ec2:DescribeAvailabilityZones", |
||
| + | "ec2:DescribeInternetGateways", |
||
| + | "ec2:DescribeVpcs", |
||
| + | "ec2:DescribeVpcPeeringConnections", |
||
| + | "ec2:DescribeSubnets", |
||
| + | "ec2:DescribeSecurityGroups", |
||
| + | "ec2:DescribeInstances", |
||
| + | "ec2:DescribeNetworkInterfaces", |
||
| + | "ec2:DescribeTags", |
||
| + | "ec2:GetCoipPoolUsage", |
||
| + | "ec2:DescribeCoipPools", |
||
| + | "ec2:GetSecurityGroupsForVpc", |
||
| + | "ec2:DescribeIpamPools", |
||
| + | "ec2:DescribeRouteTables", |
||
| + | "elasticloadbalancing:DescribeLoadBalancers", |
||
| + | "elasticloadbalancing:DescribeLoadBalancerAttributes", |
||
| + | "elasticloadbalancing:DescribeListeners", |
||
| + | "elasticloadbalancing:DescribeListenerCertificates", |
||
| + | "elasticloadbalancing:DescribeSSLPolicies", |
||
| + | "elasticloadbalancing:DescribeRules", |
||
| + | "elasticloadbalancing:DescribeTargetGroups", |
||
| + | "elasticloadbalancing:DescribeTargetGroupAttributes", |
||
| + | "elasticloadbalancing:DescribeTargetHealth", |
||
| + | "elasticloadbalancing:DescribeTags", |
||
| + | "elasticloadbalancing:DescribeTrustStores", |
||
| + | "elasticloadbalancing:DescribeListenerAttributes", |
||
| + | "elasticloadbalancing:DescribeCapacityReservation" |
||
| + | ], |
||
| + | "Resource": "*" |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "cognito-idp:DescribeUserPoolClient", |
||
| + | "acm:ListCertificates", |
||
| + | "acm:DescribeCertificate", |
||
| + | "iam:ListServerCertificates", |
||
| + | "iam:GetServerCertificate", |
||
| + | "waf-regional:GetWebACL", |
||
| + | "waf-regional:GetWebACLForResource", |
||
| + | "waf-regional:AssociateWebACL", |
||
| + | "waf-regional:DisassociateWebACL", |
||
| + | "wafv2:GetWebACL", |
||
| + | "wafv2:GetWebACLForResource", |
||
| + | "wafv2:AssociateWebACL", |
||
| + | "wafv2:DisassociateWebACL", |
||
| + | "shield:GetSubscriptionState", |
||
| + | "shield:DescribeProtection", |
||
| + | "shield:CreateProtection", |
||
| + | "shield:DeleteProtection" |
||
| + | ], |
||
| + | "Resource": "*" |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "ec2:AuthorizeSecurityGroupIngress", |
||
| + | "ec2:RevokeSecurityGroupIngress" |
||
| + | ], |
||
| + | "Resource": "*" |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "ec2:CreateSecurityGroup" |
||
| + | ], |
||
| + | "Resource": "*" |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "ec2:CreateTags" |
||
| + | ], |
||
| + | "Resource": "arn:aws:ec2:*:*:security-group/*", |
||
| + | "Condition": { |
||
| + | "StringEquals": { |
||
| + | "ec2:CreateAction": "CreateSecurityGroup" |
||
| + | }, |
||
| + | "Null": { |
||
| + | "aws:RequestTag/elbv2.k8s.aws/cluster": "false" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "ec2:CreateTags", |
||
| + | "ec2:DeleteTags" |
||
| + | ], |
||
| + | "Resource": "arn:aws:ec2:*:*:security-group/*", |
||
| + | "Condition": { |
||
| + | "Null": { |
||
| + | "aws:RequestTag/elbv2.k8s.aws/cluster": "true", |
||
| + | "aws:ResourceTag/elbv2.k8s.aws/cluster": "false" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "ec2:AuthorizeSecurityGroupIngress", |
||
| + | "ec2:RevokeSecurityGroupIngress", |
||
| + | "ec2:DeleteSecurityGroup" |
||
| + | ], |
||
| + | "Resource": "*", |
||
| + | "Condition": { |
||
| + | "Null": { |
||
| + | "aws:ResourceTag/elbv2.k8s.aws/cluster": "false" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:CreateLoadBalancer", |
||
| + | "elasticloadbalancing:CreateTargetGroup" |
||
| + | ], |
||
| + | "Resource": "*", |
||
| + | "Condition": { |
||
| + | "Null": { |
||
| + | "aws:RequestTag/elbv2.k8s.aws/cluster": "false" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:CreateListener", |
||
| + | "elasticloadbalancing:DeleteListener", |
||
| + | "elasticloadbalancing:CreateRule", |
||
| + | "elasticloadbalancing:DeleteRule" |
||
| + | ], |
||
| + | "Resource": "*" |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:AddTags", |
||
| + | "elasticloadbalancing:RemoveTags" |
||
| + | ], |
||
| + | "Resource": [ |
||
| + | "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*", |
||
| + | "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*", |
||
| + | "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*" |
||
| + | ], |
||
| + | "Condition": { |
||
| + | "Null": { |
||
| + | "aws:RequestTag/elbv2.k8s.aws/cluster": "true", |
||
| + | "aws:ResourceTag/elbv2.k8s.aws/cluster": "false" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:AddTags", |
||
| + | "elasticloadbalancing:RemoveTags" |
||
| + | ], |
||
| + | "Resource": [ |
||
| + | "arn:aws:elasticloadbalancing:*:*:listener/net/*/*/*", |
||
| + | "arn:aws:elasticloadbalancing:*:*:listener/app/*/*/*", |
||
| + | "arn:aws:elasticloadbalancing:*:*:listener-rule/net/*/*/*", |
||
| + | "arn:aws:elasticloadbalancing:*:*:listener-rule/app/*/*/*" |
||
| + | ] |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:ModifyLoadBalancerAttributes", |
||
| + | "elasticloadbalancing:SetIpAddressType", |
||
| + | "elasticloadbalancing:SetSecurityGroups", |
||
| + | "elasticloadbalancing:SetSubnets", |
||
| + | "elasticloadbalancing:DeleteLoadBalancer", |
||
| + | "elasticloadbalancing:ModifyTargetGroup", |
||
| + | "elasticloadbalancing:ModifyTargetGroupAttributes", |
||
| + | "elasticloadbalancing:DeleteTargetGroup", |
||
| + | "elasticloadbalancing:ModifyListenerAttributes", |
||
| + | "elasticloadbalancing:ModifyCapacityReservation", |
||
| + | "elasticloadbalancing:ModifyIpPools" |
||
| + | ], |
||
| + | "Resource": "*", |
||
| + | "Condition": { |
||
| + | "Null": { |
||
| + | "aws:ResourceTag/elbv2.k8s.aws/cluster": "false" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:AddTags" |
||
| + | ], |
||
| + | "Resource": [ |
||
| + | "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*", |
||
| + | "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*", |
||
| + | "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*" |
||
| + | ], |
||
| + | "Condition": { |
||
| + | "StringEquals": { |
||
| + | "elasticloadbalancing:CreateAction": [ |
||
| + | "CreateTargetGroup", |
||
| + | "CreateLoadBalancer" |
||
| + | ] |
||
| + | }, |
||
| + | "Null": { |
||
| + | "aws:RequestTag/elbv2.k8s.aws/cluster": "false" |
||
| + | } |
||
| + | } |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:RegisterTargets", |
||
| + | "elasticloadbalancing:DeregisterTargets" |
||
| + | ], |
||
| + | "Resource": "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*" |
||
| + | }, |
||
| + | { |
||
| + | "Effect": "Allow", |
||
| + | "Action": [ |
||
| + | "elasticloadbalancing:SetWebAcl", |
||
| + | "elasticloadbalancing:ModifyListener", |
||
| + | "elasticloadbalancing:AddListenerCertificates", |
||
| + | "elasticloadbalancing:RemoveListenerCertificates", |
||
| + | "elasticloadbalancing:ModifyRule", |
||
| + | "elasticloadbalancing:SetRulePriorities" |
||
| + | ], |
||
| + | "Resource": "*" |
||
| + | } |
||
| + | ] |
||
| + | } |
||
| + | </PRE> |
||
| + | |||
| + | }} |
||
| + | |||
| + | <PRE> |
||
aws iam create-policy \ |
aws iam create-policy \ |
||
--policy-name AWSLoadBalancerControllerIAMPolicy \ |
--policy-name AWSLoadBalancerControllerIAMPolicy \ |
||
| Строка 18: | Строка 300: | ||
</PRE> |
</PRE> |
||
| + | ==<code>IAM Role</code>== |
||
| − | =role= |
||
| + | Эта роль по сути связывает <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> |
||
| + | * Создфть файл <code>iam-role.json</code> с содержимым (естественно ID всегда различаются) |
||
<PRE> |
<PRE> |
||
{ |
{ |
||
| Строка 42: | Строка 327: | ||
] |
] |
||
} |
} |
||
| + | </PRE> |
||
| + | Значения |
||
| + | * <code>arn:aws:iam::54XXXXXXXXXX</code> это ID аккаунта |
||
| + | * <code>oidc.eks.us-east-1.amazonaws.com/id/5918A6B3305CXXXXXXXXXXXXXXXXXXXX</code> как правильно называется это значение, <BR> я не знаю, но получить его можно следующей коммандой: |
||
| + | <code>aws eks describe-cluster --name education-eks-1o3RFCvh --query "cluster.identity.oidc.issuer"</code> |
||
| + | * <code>education-eks-1o3RFCvh это имя кластера</code> |
||
| + | Вывод команды будет примерно таким: |
||
| + | <PRE> |
||
| + | "https://oidc.eks.us-east-1.amazonaws.com/id/5918A6B3305CXXXXXXXXXXXXXXXXXXXX" |
||
</PRE> |
</PRE> |
||
| + | <BR> |
||
| + | Создать роль из подготовленного файла <code>iam-role.json</code> |
||
<PRE> |
<PRE> |
||
aws iam create-role \ |
aws iam create-role \ |
||
| − | --role-name |
+ | --role-name AWSLoadBalancerControllerIAMRole \ |
| − | --assume-role-policy-document file:// |
+ | --assume-role-policy-document file://iam-role.json |
</PRE> |
</PRE> |
||
| + | ==Attach Policy to Role == |
||
| − | =attach= |
||
<PRE> |
<PRE> |
||
aws iam attach-role-policy \ |
aws iam attach-role-policy \ |
||
| − | --role-name |
+ | --role-name AWSLoadBalancerControllerIAMRole \ |
| − | --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/ |
+ | --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy |
</PRE> |
</PRE> |
||
| + | Все очевидно |
||
| + | * <code>AWSLoadBalancerControllerIAMRole</code> соответвует <code> --policy-name AWSLoadBalancerControllerIAMPolicy ... </code> при создании политики |
||
| + | * <code>AWSLoadBalancerControllerIAMPolicy</code> соответсвует имени роли <code> --role-name AWSLoadBalancerControllerIAMRole </code> при создании роли |
||
| + | ==<code>Service Account</code>== |
||
| − | =SA= |
||
| + | Далее требуется создать Service Account который будет привязан к роли. |
||
| + | <BR> |
||
| + | Формат (в общем случае) такой: |
||
<PRE> |
<PRE> |
||
apiVersion: v1 |
apiVersion: v1 |
||
| Строка 66: | Строка 368: | ||
annotations: |
annotations: |
||
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> |
||
| + | <BR> |
||
| + | И с учетом имени роли и Account ID: |
||
| + | <BR> |
||
| + | <PRE> |
||
| + | 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 |
||
</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 |
||
| Строка 83: | Строка 399: | ||
--set ingressClass=alb |
--set ingressClass=alb |
||
</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" |
||
| + | "vpc-0cc5209fbf68dXXXX" |
||
| + | </PRE> |
||
| + | * <code>ingressClass=alb</code> - какое значение <code>ingressClassName</code> трактовать как то что требуется создавать балансер типа ALB |
||
| + | |||
| + | =Использование = |
||
| + | |||
| + | Пример Ingress |
||
| + | <PRE> |
||
| + | 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 |
||
| + | </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- При появлении ресурса идет в
APIAWS и создает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 AccountserviceAccount.name=aws-load-balancer-controllerиспользовать созданный заранееSerivce Accountregion=<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