Ack-acm-controller: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| Строка 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