Ack-acm-controller: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) м (Sirmax переименовал страницу Aws-acm-controller в Ack-acm-controller) |
||
| (не показано 10 промежуточных версий этого же участника) | |||
| Строка 6: | Строка 6: | ||
[[Категория: ALB]] |
[[Категория: ALB]] |
||
[[Категория: ACM]] |
[[Категория: ACM]] |
||
| + | [[Категория: aws-controllers-k8s]] |
||
=Задача= |
=Задача= |
||
Если уже пользоваться AWS то хотелось бы получить максимум за свои деньги, и отказаться от использования Let's Encrypt,<BR> |
Если уже пользоваться AWS то хотелось бы получить максимум за свои деньги, и отказаться от использования Let's Encrypt,<BR> |
||
| Строка 58: | Строка 59: | ||
==<code>IAM Role</code>(<code>Trust Policy</code>)== |
==<code>IAM Role</code>(<code>Trust Policy</code>)== |
||
Эта роль по сути связывает <code>Service Account</code> <BR> |
Эта роль по сути связывает <code>Service Account</code> <BR> |
||
| − | (тут это видно из части <code>"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": ["system:serviceaccount: |
+ | (тут это видно из части <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> |
||
Если сказать чуть точнее то "будет связывать" - на момент создания это просто правило определяющее что с <BR> |
Если сказать чуть точнее то "будет связывать" - на момент создания это просто правило определяющее что с <BR> |
||
| Строка 78: | Строка 79: | ||
"StringEquals": { |
"StringEquals": { |
||
"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": [ |
"oidc.eks.us-east-1.amazonaws.com/id/12345678901285475EA0123456789012:sub": [ |
||
| − | "system:serviceaccount: |
+ | "system:serviceaccount:ack-system:aws-acm-controller" |
], |
], |
||
"oidc.eks.us-east-1.amazonaws.com/id/123456789085475EA0123456789012:aud": [ |
"oidc.eks.us-east-1.amazonaws.com/id/123456789085475EA0123456789012:aud": [ |
||
| Строка 122: | Строка 123: | ||
Создать <code>Service Account</code>, который будет иметь анннотауию указывающую на правильную <code>IAM Role</code> |
Создать <code>Service Account</code>, который будет иметь анннотауию указывающую на правильную <code>IAM Role</code> |
||
(который будет "привязан" к роли). |
(который будет "привязан" к роли). |
||
| + | ===<code>Namespace</code>=== |
||
| + | {{caution|text= |
||
| + | Для ACK = AWS Controllers for Kubernetes (ACK-чарты — это Helm-чарты для установки AWS Controllers for Kubernetes (ACK) — набора контроллеров, которые позволяют управлять ресурсами AWS напрямую из Kubernetes, как будто это обычные Kubernetes-объекты.) рекомендуется создать отдельный <code>Namespace</code> |
||
| + | }} |
||
| + | <PRE> |
||
| ⚫ | |||
| + | </PRE> |
||
| + | |||
| + | ===Примеры=== |
||
<BR> |
<BR> |
||
Формат (в общем случае) такой: |
Формат (в общем случае) такой: |
||
| Строка 129: | Строка 139: | ||
metadata: |
metadata: |
||
name: aws-acm-controller |
name: aws-acm-controller |
||
| − | namespace: |
+ | namespace: ack-system |
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> |
</PRE> |
||
<BR> |
<BR> |
||
| − | И с учетом имени роли и Account ID |
+ | И с учетом имени роли и Account ID - создать файл <code>ServiceAccount.yaml</code> (имя файла произвольное) |
<BR> |
<BR> |
||
<PRE> |
<PRE> |
||
| Строка 141: | Строка 151: | ||
metadata: |
metadata: |
||
name: aws-acm-controller |
name: aws-acm-controller |
||
| − | namespace: |
+ | namespace: ack-system |
annotations: |
annotations: |
||
eks.amazonaws.com/role-arn: arn:aws:iam::54XXXXXXXXXX:role/AWSACMControllerIAMRole |
eks.amazonaws.com/role-arn: arn:aws:iam::54XXXXXXXXXX:role/AWSACMControllerIAMRole |
||
| Строка 148: | Строка 158: | ||
* <code>AWSACMControllerIAMRole</code> соответвует <code>aws iam create-role --role-name AWSACMControllerIAMRole ... </code> |
* <code>AWSACMControllerIAMRole</code> соответвует <code>aws iam create-role --role-name AWSACMControllerIAMRole ... </code> |
||
| + | |||
| ⚫ | |||
| + | Создать <code>Service Account</code> |
||
<PRE> |
<PRE> |
||
| + | kubectl -n ack-system apply -f ServiceAccount.yaml |
||
| − | helm repo add ack https://aws.github.io/eks-charts |
||
| + | </PRE> |
||
| − | helm repo update |
||
| ⚫ | |||
| + | Так как AWS <s>настоящие пидорасы</s> то скачать чарт в лоб (<code>helm pull</code>) не получается, <BR> |
||
| + | А ставить не пойми что не хочется. |
||
| + | * https://gallery.ecr.aws/aws-controllers-k8s/acm-chart - можно посмотреть теги и все, больше ничего |
||
| ⚫ | |||
| + | Забрать из гита |
||
| ⚫ | |||
| + | <PRE> |
||
| − | --create-namespace \ |
||
| + | git clone https://github.com/aws-controllers-k8s/acm-controller.git |
||
| ⚫ | |||
| + | cd acm-controller/helm |
||
| ⚫ | |||
| ⚫ | |||
</PRE> |
</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 \ |
||
| ⚫ | |||
| + | acm-chart-1.0.12.tgz \ |
||
| + | --namespace ack-system \ |
||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
| + | </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)