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

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 58: Строка 58:
 
==<code>IAM Role</code>==
 
==<code>IAM Role</code>==
 
<PRE>
 
<PRE>
  +
Эта роль по сути связывает <code>Service Account</code> (тут это видно из части <code>"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount:kube-system:aws-acm-controller"],</code> и <code>Policy</code>
  +
<BR>
  +
* Создфть файл <code>AWSLoadBalancerControllerIAMRole.json</code> с содержимым (естественно ID всегда различаются)
  +
<PRE>
  +
{
  +
"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"
  +
]
  +
}
  +
}
  +
}
  +
]
  +
}
  +
</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>
  +
<BR>
  +
Создать роль из подготовленного файла <code>iam-role.json</code>
  +
<PRE>
  +
aws iam create-role \
  +
--role-name AWSLoadBalancerControllerIAMRole \
  +
--assume-role-policy-document file://AWSLoadBalancerControllerIAMRole.json
 
</PRE>
 
</PRE>
   

Версия 13:14, 23 июня 2025

Задача

Если уже пользоваться AWS то хотелось бы получить максимум за свои деньги, и отказаться от использования Let's Encrypt,
а выписывать сертефикаты от AWS
К сожалению, жадный AWS не дает ключ от сертификата, и единственный доступный вариант использования - это ALB

acm-controller

Аналогично другим контроллерам, позволяет создавать сертефикаты (но блять без ключей, ебучий ты AWS) как ресурсы в k8s

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

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

  • acm-controller следит за появлением ресурса типа Certificate
  • При появлении ресурса идет в API и что-то там делает

TODO

Установка и настройка acm-controller

Policy

Создать файл с Policy - имя конечно не принципиально, для простоты пусть будет AWSACMControllerIAMPolicy.json
Это рекомендованная политика

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "acm:DescribeCertificate",
                "acm:ImportCertificate",
                "acm:RequestCertificate",
                "acm:UpdateCertificateOptions",
                "acm:DeleteCertificate",
                "acm:AddTagsToCertificate",
                "acm:RemoveTagsFromCertificate",
                "acm:ListTagsForCertificate"
            ],
            "Resource": "*"
        }
    ]
}

Далее из файла создать политику:

aws iam create-policy \
  --policy-name AWSACMControllerIAMPolicy \
  --policy-document file://AWSACMControllerIAMPolicy.json

IAM Role

Эта роль по сути связывает <code>Service Account</code> (тут это видно из  части <code>"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount:kube-system:aws-acm-controller"],</code> и <code>Policy</code>
<BR>
* Создфть файл <code>AWSLoadBalancerControllerIAMRole.json</code> с содержимым (естественно ID всегда различаются) 
<PRE>
{
    "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://AWSLoadBalancerControllerIAMRole.json

Helm

helm repo add ack https://aws.github.io/eks-charts
helm repo update


helm install ack-acm-controller ack/ack-acm-controller \
  --namespace ack-system \
  --create-namespace \
  --set aws.region=us-east-1 \
  --set serviceAccount.create=false \
  --set serviceAccount.name=ack-acm-controller