Closed2

external-dnsをEKSに入れるメモ

not75743not75743

メモ

必要なポリシー

ここを参照
https://kubernetes-sigs.github.io/external-dns/v0.14.2/tutorials/aws/#iam-policy

IRSAを利用する場合のサービスアカウント

ドキュメントでは以下のようにSAを定義しているが、IRSAを使う際はIAMロールのArnを指定すること

apiVersion: v1
kind: ServiceAccount
metadata:
  name: external-dns
+  annotations:
+    eks.amazonaws.com/role-arn: arn:aws:iam::<account id>:role/<iam role name>
  labels:
    app.kubernetes.io/name: external-dns

clusterrolebindingのnamespace

デフォルトではdefaultが指定されているが、external-dnsをapplyしたnamespaceと合わせること

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: external-dns-viewer
  labels:
    app.kubernetes.io/name: external-dns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: external-dns
subjects:
  - kind: ServiceAccount
    name: external-dns
-    namespace: default # change to desired namespace: externaldns, kube-addons
+    namespace: <ここ> # change to desired namespace: externaldns, kube-addons

ホストゾーンを追加したい

--domainでドメインを、--txt-owner-idでホストゾーンのIDを指定します

      containers:
        - name: external-dns
          image: registry.k8s.io/external-dns/external-dns:v0.14.2
          args:
            - --source=service
            - --source=ingress
            - --domain-filter=<domain># will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
            - --txt-owner-id=<hostzone id>

recordの削除がしたい

--policyでsyncを指定します
デフォルトはupsert-onlyで、レコードの削除が行われません

      containers:
        - name: external-dns
          image: registry.k8s.io/external-dns/external-dns:v0.14.2
          args:
            - --policy=sync # would prevent ExternalDNS from deleting any records, omit to enable full synchronization

helmでインストールする

https://artifacthub.io/packages/helm/external-dns/external-dns

helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/
helm repo update external-dns
helm upgrade external-dns external-dns/external-dns \
  --install --version 1.14.4 \
  --namespace kube-system \
  --set provider=aws \
  --set aws.region=ap-northeast-1 \
  --set aws.zoneType=public \
  --set serviceAccount.create=false \
  --set serviceAccount.name=external-dns \
  --set domainFilters[0]=<domain> \
  --set policy=sync \
  --wait

external-dnsが正常に起動した際のログ

time="2024-07-06T03:39:23Z" level=info msg="Instantiating new Kubernetes client"
time="2024-07-06T03:39:23Z" level=info msg="Using inCluster-config based on serviceaccount-token"
time="2024-07-06T03:39:23Z" level=info msg="Created Kubernetes client https://172.20.0.1:443"
time="2024-07-06T03:39:24Z" level=info msg="Applying provider record filter for domains: [<domain>. .<domain>.]"
time="2024-07-06T03:39:24Z" level=info msg="All records are already up to date"

external-dnsが正常に起動しないログ

clusterrolebindingのnamespaceがexternal-dnsとあっていない場合

time="2024-07-06T03:34:24Z" level=info msg="Instantiating new Kubernetes client"
time="2024-07-06T03:34:24Z" level=info msg="Using inCluster-config based on serviceaccount-token"
time="2024-07-06T03:34:24Z" level=info msg="Created Kubernetes client https://172.20.0.1:443"
time="2024-07-06T03:35:24Z" level=fatal msg="failed to sync *v1.Service: context deadline exceeded"

レコードが追加されたときのログ

Aレコード、TXTレコード*2が作成されました

time="2024-07-06T03:47:23Z" level=info msg="Desired change: CREATE <ingressで指定したドメイン> A [Id: /hostedzone/<hostzone id>]"
time="2024-07-06T03:47:23Z" level=info msg="Desired change: CREATE <ingressで指定したドメイン>  TXT [Id: /hostedzone/<hostzone id>]"
time="2024-07-06T03:47:23Z" level=info msg="Desired change: CREATE cname-<ingressで指定したドメイン>  TXT [Id: /hostedzone/<hostzone id>]"

レコードが削除されたときのログ

time="2024-07-06T03:44:22Z" level=info msg="Desired change: DELETE <ingressで指定したドメイン> A [Id: /hostedzone/<hostzone id>]"
time="2024-07-06T03:44:22Z" level=info msg="Desired change: DELETE <ingressで指定したドメイン>  TXT [Id: /hostedzone/<hostzone id>]"
time="2024-07-06T03:44:22Z" level=info msg="Desired change: DELETE cname-<ingressで指定したドメイン>  TXT [Id: /hostedzone/<hostzone id>]"
このスクラップは5ヶ月前にクローズされました