Ack-acm-controller: различия между версиями
Sirmax (обсуждение | вклад) (→Задача) |
Sirmax (обсуждение | вклад) м (Sirmax переименовал страницу Aws-acm-controller в Ack-acm-controller) |
||
| (не показано 30 промежуточных версий этого же участника) | |||
| Строка 6: | Строка 6: | ||
[[Категория: ALB]] |
[[Категория: ALB]] |
||
[[Категория: ACM]] |
[[Категория: ACM]] |
||
| + | [[Категория: aws-controllers-k8s]] |
||
=Задача= |
=Задача= |
||
Если уже пользоваться AWS то хотелось бы получить максимум за свои деньги, и отказаться от использования Let's Encrypt,<BR> |
Если уже пользоваться AWS то хотелось бы получить максимум за свои деньги, и отказаться от использования Let's Encrypt,<BR> |
||
| Строка 22: | Строка 23: | ||
TODO |
TODO |
||
| + | =Установка и настройка <code>acm-controller</code>= |
||
| − | =Policy= |
||
| + | |||
| + | ==<code>Policy</code>== |
||
| + | Создать файл с <code>Policy</code> - имя конечно не принципиально, для простоты пусть будет <code>AWSACMControllerIAMPolicy.json</code> |
||
| + | <BR> |
||
| + | Это [https://github.com/aws-controllers-k8s/acm-controller/blob/main/config/iam/recommended-inline-policy рекомендованная политика] |
||
<PRE> |
<PRE> |
||
{ |
{ |
||
| − | "Version": "2012-10-17", |
+ | "Version": "2012-10-17", |
| − | "Statement": [ |
+ | "Statement": [ |
| − | { |
+ | { |
| − | "Effect": "Allow", |
+ | "Effect": "Allow", |
| − | "Action": [ |
+ | "Action": [ |
| − | "acm: |
+ | "acm:DescribeCertificate", |
| − | "acm: |
+ | "acm:ImportCertificate", |
| − | "acm: |
+ | "acm:RequestCertificate", |
| − | "acm: |
+ | "acm:UpdateCertificateOptions", |
| − | "acm: |
+ | "acm:DeleteCertificate", |
| − | "acm: |
+ | "acm:AddTagsToCertificate", |
| − | "acm: |
+ | "acm:RemoveTagsFromCertificate", |
| + | "acm:ListTagsForCertificate" |
||
| − | ], |
||
| − | + | ], |
|
| + | "Resource": "*" |
||
| − | }, |
||
| − | + | } |
|
| + | ] |
||
| − | "Effect": "Allow", |
||
| − | "Action": [ |
||
| − | "route53:ChangeResourceRecordSets", |
||
| − | "route53:GetChange", |
||
| − | "route53:ListHostedZonesByName", |
||
| − | "route53:ListHostedZones", |
||
| − | "route53:GetHostedZone" |
||
| − | ], |
||
| − | "Resource": "*" |
||
| − | } |
||
| − | ] |
||
} |
} |
||
| + | </PRE> |
||
| + | Далее из файла создать политику: |
||
| + | <PRE> |
||
| + | aws iam create-policy \ |
||
| + | --policy-name AWSACMControllerIAMPolicy \ |
||
| + | --policy-document file://AWSACMControllerIAMPolicy.json |
||
</PRE> |
</PRE> |
||
| + | ==<code>IAM Role</code>(<code>Trust Policy</code>)== |
||
| + | Эта роль по сути связывает <code>Service Account</code> <BR> |
||
| + | (тут это видно из части <code>"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount:ack-system:aws-acm-controller"],</code> и <code>Policy</code><BR> |
||
| + | <BR> |
||
| + | Если сказать чуть точнее то "будет связывать" - на момент создания это просто правило определяющее что с <BR> |
||
| + | такой ролью могут представляться внешний по отношению к IAM аккаунты в частности <code>aws-acm-controller</code> <BR> |
||
| + | Какие именно права им будут назначены зависит от того какие политики будут "приаттачены" |
||
| + | <BR> |
||
| + | * Создфть файл <code>AWSACMControllerIAMRole.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:ack-system:aws-acm-controller" |
||
| + | ], |
||
| + | "oidc.eks.us-east-1.amazonaws.com/id/123456789085475EA0123456789012:aud": [ |
||
| + | "sts.amazonaws.com" |
||
| + | ] |
||
| + | } |
||
| + | } |
||
| + | } |
||
| + | ] |
||
| + | } |
||
| + | </PRE> |
||
| + | Значения |
||
| − | =Helm= |
||
| + | * <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> |
<PRE> |
||
| + | "https://oidc.eks.us-east-1.amazonaws.com/id/5918A6B3305CXXXXXXXXXXXXXXXXXXXX" |
||
| − | helm repo add ack https://aws.github.io/eks-charts |
||
| + | </PRE> |
||
| − | helm repo update |
||
| + | <BR> |
||
| + | Создать роль из подготовленного файла <code>AWSACMControllerIAMRole.json</code> |
||
| + | <PRE> |
||
| + | aws iam create-role \ |
||
| + | --role-name AWSACMControllerIAMRole \ |
||
| + | --assume-role-policy-document file://AWSACMControllerIAMRole.json |
||
| + | </PRE> |
||
| + | ==Attach Policy to Role == |
||
| + | Собственно это и есть момент назначения прав - "прикрепление" политик к роли, при этом роль по сути <code>Trut Policy</code>, <BR> |
||
| + | другими словами она описывает какие <code>Service Account</code> и из какого кластера могут ей представляться ю |
||
| + | <PRE> |
||
| + | aws iam attach-role-policy \ |
||
| + | --role-name AWSACMControllerIAMRole \ |
||
| + | --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/AWSACMControllerIAMPolicy |
||
| + | </PRE> |
||
| + | Все очевидно |
||
| + | * <code> AWSACMControllerIAMRole </code> соответвует <code> --policy-name AWSACMControllerIAMPolicy ... </code> при создании политики |
||
| + | * <code> AWSACMControllerIAMPolicy</code> соответсвует имени роли <code> --role-name AWSACMControllerIAMRole </code> при создании роли |
||
| + | ==<code>Service Account</code>== |
||
| − | helm install ack-acm-controller ack/ack-acm-controller \ |
||
| + | Создать <code>Service Account</code>, который будет иметь анннотауию указывающую на правильную <code>IAM Role</code> |
||
| − | --namespace ack-system \ |
||
| + | (который будет "привязан" к роли). |
||
| − | --create-namespace \ |
||
| + | ===<code>Namespace</code>=== |
||
| − | --set aws.region=us-east-1 \ |
||
| + | {{caution|text= |
||
| − | --set serviceAccount.create=false \ |
||
| + | Для ACK = AWS Controllers for Kubernetes (ACK-чарты — это Helm-чарты для установки AWS Controllers for Kubernetes (ACK) — набора контроллеров, которые позволяют управлять ресурсами AWS напрямую из Kubernetes, как будто это обычные Kubernetes-объекты.) рекомендуется создать отдельный <code>Namespace</code> |
||
| − | --set serviceAccount.name=ack-acm-controller |
||
| + | }} |
||
| + | <PRE> |
||
| + | kubectl create namespace ack-system |
||
</PRE> |
</PRE> |
||
| + | |||
| + | ===Примеры=== |
||
| + | <BR> |
||
| + | Формат (в общем случае) такой: |
||
| + | <PRE> |
||
| + | apiVersion: v1 |
||
| + | kind: ServiceAccount |
||
| + | metadata: |
||
| + | name: aws-acm-controller |
||
| + | namespace: ack-system |
||
| + | annotations: |
||
| + | eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<generated-role-name> |
||
| + | </PRE> |
||
| + | <BR> |
||
| + | И с учетом имени роли и Account ID - создать файл <code>ServiceAccount.yaml</code> (имя файла произвольное) |
||
| + | <BR> |
||
| + | <PRE> |
||
| + | apiVersion: v1 |
||
| + | kind: ServiceAccount |
||
| + | metadata: |
||
| + | name: aws-acm-controller |
||
| + | namespace: ack-system |
||
| + | annotations: |
||
| + | eks.amazonaws.com/role-arn: arn:aws:iam::54XXXXXXXXXX:role/AWSACMControllerIAMRole |
||
| + | </PRE> |
||
| + | |||
| + | * <code>AWSACMControllerIAMRole</code> соответвует <code>aws iam create-role --role-name AWSACMControllerIAMRole ... </code> |
||
| + | |||
| + | |||
| + | Создать <code>Service Account</code> |
||
| + | <PRE> |
||
| + | kubectl -n ack-system apply -f ServiceAccount.yaml |
||
| + | </PRE> |
||
| + | |||
| + | ==Helm== |
||
| + | Так как AWS <s>настоящие пидорасы</s> то скачать чарт в лоб (<code>helm pull</code>) не получается, <BR> |
||
| + | А ставить не пойми что не хочется. |
||
| + | |||
| + | * https://gallery.ecr.aws/aws-controllers-k8s/acm-chart - можно посмотреть теги и все, больше ничего |
||
| + | Забрать из гита |
||
| + | <PRE> |
||
| + | git clone https://github.com/aws-controllers-k8s/acm-controller.git |
||
| + | cd acm-controller/helm |
||
| + | </PRE> |
||
| + | Или второй вариант |
||
| + | <PRE> |
||
| + | helm pull oci://public.ecr.aws/aws-controllers-k8s/acm-chart --version 1.0.12 |
||
| + | </PRE> |
||
| + | |||
| + | OCI:// расшифровывается как Open Container Initiative — это стандарт, разработанный для: |
||
| + | * Образов контейнеров (image) |
||
| + | * Манифестов (manifest) |
||
| + | * Регистрирования артефактов (registry) |
||
| + | Изначально стандарт создавался для Docker-образов, но теперь его используют и для других артефактов — таких как Helm-чарты, WASM-модули, плагины и пр. |
||
| + | |||
| + | <PRE> |
||
| + | helm \ |
||
| + | install \ |
||
| + | ack-acm-controller \ |
||
| + | acm-chart-1.0.12.tgz \ |
||
| + | --namespace ack-system \ |
||
| + | --set aws.region=us-east-1 \ |
||
| + | --set serviceAccount.create=false \ |
||
| + | --set serviceAccount.name=aws-acm-controller |
||
| + | </PRE> |
||
| + | |||
| + | * <code>namespace ack-system</code> - предварительно созданный <code>Namespace</code> |
||
| + | * <code>aws.region=us-east-1</code> - регион |
||
| + | * <code>serviceAccount.create=false</code> - не создавать <code>Service Account</code>, а воспользоваться предварительно созданным |
||
| + | * <code>serviceAccount.name=aws-acm-controller</code> - передварительно созданный <code>Service Account</code> (в <code>namespace ack-system</code>) |
||
Текущая версия на 10:51, 29 июня 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(Trust Policy)
Эта роль по сути связывает Service Account
(тут это видно из части "oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount:ack-system:aws-acm-controller"], и Policy
Если сказать чуть точнее то "будет связывать" - на момент создания это просто правило определяющее что с
такой ролью могут представляться внешний по отношению к IAM аккаунты в частности aws-acm-controller
Какие именно права им будут назначены зависит от того какие политики будут "приаттачены"
- Создфть файл
AWSACMControllerIAMRole.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:ack-system:aws-acm-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"
Создать роль из подготовленного файла AWSACMControllerIAMRole.json
aws iam create-role \ --role-name AWSACMControllerIAMRole \ --assume-role-policy-document file://AWSACMControllerIAMRole.json
Attach Policy to Role
Собственно это и есть момент назначения прав - "прикрепление" политик к роли, при этом роль по сути Trut Policy,
другими словами она описывает какие Service Account и из какого кластера могут ей представляться ю
aws iam attach-role-policy \ --role-name AWSACMControllerIAMRole \ --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/AWSACMControllerIAMPolicy
Все очевидно
AWSACMControllerIAMRoleсоответвует--policy-name AWSACMControllerIAMPolicy ...при создании политикиAWSACMControllerIAMPolicyсоответсвует имени роли--role-name AWSACMControllerIAMRoleпри создании роли
Service Account
Создать Service Account, который будет иметь анннотауию указывающую на правильную IAM Role
(который будет "привязан" к роли).
Namespace
|
Для ACK = AWS Controllers for Kubernetes (ACK-чарты — это Helm-чарты для установки AWS Controllers for Kubernetes (ACK) — набора контроллеров, которые позволяют управлять ресурсами AWS напрямую из Kubernetes, как будто это обычные Kubernetes-объекты.) рекомендуется создать отдельный |
kubectl create namespace ack-system
Примеры
Формат (в общем случае) такой:
apiVersion: v1
kind: ServiceAccount
metadata:
name: aws-acm-controller
namespace: ack-system
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<generated-role-name>
И с учетом имени роли и Account ID - создать файл ServiceAccount.yaml (имя файла произвольное)
apiVersion: v1
kind: ServiceAccount
metadata:
name: aws-acm-controller
namespace: ack-system
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::54XXXXXXXXXX:role/AWSACMControllerIAMRole
AWSACMControllerIAMRoleсоответвуетaws iam create-role --role-name AWSACMControllerIAMRole ...
Создать Service Account
kubectl -n ack-system apply -f ServiceAccount.yaml
Helm
Так как AWS настоящие пидорасы то скачать чарт в лоб (helm pull) не получается,
А ставить не пойми что не хочется.
- https://gallery.ecr.aws/aws-controllers-k8s/acm-chart - можно посмотреть теги и все, больше ничего
Забрать из гита
git clone https://github.com/aws-controllers-k8s/acm-controller.git cd acm-controller/helm
Или второй вариант
helm pull oci://public.ecr.aws/aws-controllers-k8s/acm-chart --version 1.0.12
OCI:// расшифровывается как Open Container Initiative — это стандарт, разработанный для:
- Образов контейнеров (image)
- Манифестов (manifest)
- Регистрирования артефактов (registry)
Изначально стандарт создавался для Docker-образов, но теперь его используют и для других артефактов — таких как Helm-чарты, WASM-модули, плагины и пр.
helm \
install \
ack-acm-controller \
acm-chart-1.0.12.tgz \
--namespace ack-system \
--set aws.region=us-east-1 \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-acm-controller
namespace ack-system- предварительно созданныйNamespaceaws.region=us-east-1- регионserviceAccount.create=false- не создаватьService Account, а воспользоваться предварительно созданнымserviceAccount.name=aws-acm-controller- передварительно созданныйService Account(вnamespace ack-system)