はじめに
Amazon EKSでExternalDNSを利用する方法をまとめます。
ExternalDNSは、パブリック DNS サーバーを介して Kubernetes リソースを検出します。
Mac環境を想定しています。
実行環境の準備
-
AWS CLIの設定
AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。 -
EKSクラスタの構築
Macでeksctlを利用してAmazon EKSのクラスターを構築するを参考にしてください。 -
EKSのコンテキストの設定
MacにてAmazon EKSの設定をするを参考にしてください。 -
Helmの設定
Amazon EKSでHelmを利用するを参考にしてください。 -
ArgoCDの設定
Amazon EKSでArgoCDを利用するを参考にしてください。
Route53のホストゾーンの作成
- Route53のホストゾーンを作成する
※今回はdev-akane.com
というドメイン名にするaws route53 create-hosted-zone \ --name dev-akane.com \ --caller-reference `date +%Y-%m-%d_%H-%M-%S`
IAM OIDC IDプロバイダの作成
クラスター用の IAM OIDC プロバイダーの作成を参考にしてください。
-
クラスター名を設定する
CLUSTER_NAME=${クラスター名}
-
IDプロバイダを作成する
eksctl utils associate-iam-oidc-provider \ --cluster ${CLUSTER_NAME} \ --approve
-
IDプロバイダのARNを取得する
OIDC_ARN=$(aws iam list-open-id-connect-providers \ --query "OpenIDConnectProviderList[*].Arn" \ --output text \ | grep $( \ aws eks describe-cluster \ --name ${CLUSTER_NAME} \ --query "cluster.identity.oidc.issuer" \ --output text \ | cut -d '/' -f 5 \ ) )
-
IDプロバイダ名を取得する
OIDC_NAME=$(aws iam get-open-id-connect-provider \ --query "Url" \ --output text \ --open-id-connect-provider-arn \ $( \ aws iam list-open-id-connect-providers \ --query "OpenIDConnectProviderList[*].Arn" \ --output text \ | grep $( \ aws eks describe-cluster \ --name ${CLUSTER_NAME} \ --query "cluster.identity.oidc.issuer" \ --output text \ | cut -d '/' -f 5 \ ) \ ) )
IAMロールの作成
-
IAMロールを作成する
※今回はロール名をakane-dev-external-dns-role
にしています。ROLE_POLICY=$(echo -n '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "'; echo -n "${OIDC_ARN}"; echo -n '" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "'; echo -n "${OIDC_NAME}"; echo -n ':sub": "system:serviceaccount:default:external-dns" } } } ] }') aws iam create-role \ --role-name akane-dev-external-dns-role \ --assume-role-policy-document "${ROLE_POLICY}"
-
ポリシーを作成する
※IAMポリシーを参考にしてください。
※今回はポリシー名をakane-dev-external-dns-policy
にしています。aws iam create-policy \ --policy-name akane-dev-external-dns-policy \ --policy-document \ '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/*" ] }, { "Effect": "Allow", "Action": [ "route53:ListHostedZones", "route53:ListResourceRecordSets" ], "Resource": [ "*" ] } ] }'
-
ポリシーをロールにアタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam attach-role-policy \ --role-name akane-dev-external-dns-role \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-external-dns-policy
環境設定
※事前にKubernetesクラスターのコンテキストの設定をします。
※ArgoCDのインストールが必要です。
-
IAMロールのARNを取得する
※今回はロール名をakane-dev-external-dns-role
にしています。aws iam get-role \ --role-name akane-dev-external-dns-role \ --query "Role.Arn" \ --output text
-
external-dns.yaml
を作成する
※targetRevisionは6.7.5
としています。
※IAMロールのARN、Route53のドメイン名を設定します。external-dns.yamlapiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: external-dns namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.io spec: project: default source: repoURL: 'https://charts.bitnami.com/bitnami' targetRevision: 6.7.5 helm: values: | aws: zoneType: public txtOwnerId: my-hostedzone-identifier parameters: - name: "rbac.serviceAccountAnnotations.eks\\.amazonaws\\.com/role-arn" value: "${IAMロールのARN}" - name: "domainFilters[0]" value: "${Route53のドメイン名}" chart: external-dns destination: server: 'https://kubernetes.default.svc' namespace: default syncPolicy: automated: prune: true
-
クラスターに適用する
kubectl apply -f external-dns.yaml
クリーンアップ
-
クラスターから削除する
kubectl delete -f external-dns.yaml
-
ポリシーをロールからデタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam detach-role-policy \ --role-name akane-dev-external-dns-role \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-external-dns-policy
-
ポリシーを削除する
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam delete-policy \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-external-dns-policy
-
IAMロールを削除する
aws iam delete-role \ --role-name akane-dev-external-dns-role
-
IAM OIDC IDを削除する
eksctl delete cluster
を実行するとクラスターと一緒に削除されます。 -
Route53のホストゾーンを削除する
aws route53 delete-hosted-zone \ --id $( \ aws route53 list-hosted-zones-by-name \ --dns-name dev-akane.com \ --query "HostedZones[0].Id" \ --output text \ | sed "s#/hostedzone/##" \ )