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

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
м (Sirmax переименовал страницу Aws-acm-controller в Ack-acm-controller)
 
(не показано 19 промежуточных версий этого же участника)
Строка 6: Строка 6:
 
[[Категория: ALB]]
 
[[Категория: ALB]]
 
[[Категория: ACM]]
 
[[Категория: ACM]]
  +
[[Категория: aws-controllers-k8s]]
 
=Задача=
 
=Задача=
 
Если уже пользоваться AWS то хотелось бы получить максимум за свои деньги, и отказаться от использования Let's Encrypt,<BR>
 
Если уже пользоваться AWS то хотелось бы получить максимум за свои деньги, и отказаться от использования Let's Encrypt,<BR>
Строка 56: Строка 57:
 
</PRE>
 
</PRE>
   
==<code>IAM Role</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:kube-system:aws-acm-controller"],</code> и <code>Policy</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>
 
Если сказать чуть точнее то "будет связывать" - на момент создания это просто правило определяющее что с <BR>
 
Если сказать чуть точнее то "будет связывать" - на момент создания это просто правило определяющее что с <BR>
Строка 64: Строка 65:
 
Какие именно права им будут назначены зависит от того какие политики будут "приаттачены"
 
Какие именно права им будут назначены зависит от того какие политики будут "приаттачены"
 
<BR>
 
<BR>
* Создфть файл <code>AWSLoadBalancerControllerIAMRole.json</code> с содержимым (естественно ID всегда различаются)
+
* Создфть файл <code>AWSACMControllerIAMRole.json</code> с содержимым (естественно ID всегда различаются)
 
<PRE>
 
<PRE>
 
{
 
{
Строка 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:kube-system:aws-acm-controller"
+
"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": [
Строка 100: Строка 101:
 
</PRE>
 
</PRE>
 
<BR>
 
<BR>
Создать роль из подготовленного файла <code>iam-role.json</code>
+
Создать роль из подготовленного файла <code>AWSACMControllerIAMRole.json</code>
 
<PRE>
 
<PRE>
 
aws iam create-role \
 
aws iam create-role \
--role-name AWSLoadBalancerControllerIAMRole \
+
--role-name AWSACMControllerIAMRole \
--assume-role-policy-document file://AWSLoadBalancerControllerIAMRole.json
+
--assume-role-policy-document file://AWSACMControllerIAMRole.json
 
</PRE>
 
</PRE>
   
  +
==Attach Policy to Role ==
=Helm=
 
  +
Собственно это и есть момент назначения прав - "прикрепление" политик к роли, при этом роль по сути <code>Trut Policy</code>, <BR>
  +
другими словами она описывает какие <code>Service Account</code> и из какого кластера могут ей представляться ю
 
<PRE>
 
<PRE>
  +
aws iam attach-role-policy \
helm repo add ack https://aws.github.io/eks-charts
 
  +
--role-name AWSACMControllerIAMRole \
helm repo update
 
  +
--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>==
  +
Создать <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>
 
kubectl create namespace ack-system
  +
</PRE>
   
  +
===Примеры===
helm install ack-acm-controller ack/ack-acm-controller \
 
  +
<BR>
--namespace ack-system \
 
  +
Формат (в общем случае) такой:
--create-namespace \
 
  +
<PRE>
--set aws.region=us-east-1 \
 
  +
apiVersion: v1
--set serviceAccount.create=false \
 
  +
kind: ServiceAccount
--set serviceAccount.name=ack-acm-controller
 
  +
metadata:
  +
name: aws-acm-controller
  +
namespace: ack-system
  +
annotations:
  +
eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<generated-role-name>
 
</PRE>
 
</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

Icon-caution.gif

Для ACK = AWS Controllers for Kubernetes (ACK-чарты — это Helm-чарты для установки AWS Controllers for Kubernetes (ACK) — набора контроллеров, которые позволяют управлять ресурсами AWS напрямую из Kubernetes, как будто это обычные Kubernetes-объекты.) рекомендуется создать отдельный Namespace

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) не получается,
А ставить не пойми что не хочется.

Забрать из гита

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 - предварительно созданный Namespace
  • aws.region=us-east-1 - регион
  • serviceAccount.create=false - не создавать Service Account, а воспользоваться предварительно созданным
  • serviceAccount.name=aws-acm-controller - передварительно созданный Service Accountnamespace ack-system)