ExternalDNS x AWS
ALBにエイリアスするRoute 53 レコードを自動作成させる。
sourceはIngressのみでいい。
# Helm value
sources:
- ingress
処理対象Ingressの区別
区別するのに使える引数が複数ある
--annotation-filter
--label-filter
--ingress-class
--annotation-filter
と--ingress-class
は併用できない。
他の2つの組み合わせが許されるのか許されないのかはわかってない。
--annotation-filter
を使うことにして、基本的にすべてのIngressを処理対象として
例外にのみ external-dns.alpha.kubernetes.io/exclude: "true"
アノテーションを付けることにする。
Helm valueは以下のようにする。
extraArgs:
- --annotation-filter=external-dns.alpha.kubernetes.io/exclude notin (true)
複数IngressGroup=複数ALBのrules.hostに同じ値が登場して、片方のRoute53レコードを作成済みのとき
共用していたALBから分離させる過程でこのような状況のときにちょうどExternalDNSを導入した。
処理対象外とさせるアノテーションはどのIngressにもまだ付けていなかった。
だが、ExternalDNSはAll records are already up to date
と言ってなにもしなかった。
ログ出どころ
aws.goにも同じ文言のログがあるが
ApplyChangesが呼ばれなかったと思うためcontroller.goで出たと思っている
作成済みのDNSレコードを収集する
// Endpointsは、処理する必要があるホストとターゲットの組み合わせごとにエンドポイント オブジェクトを返します。
// すべての名前空間のすべてのイングレス リソースを取得します
- IngressをまずはList
- annotationによる除外、classによる除外をする
- 各Ingressについてループ
- 別のコントローラー担当なら無視してcontinue
- Ingressから"endpoints"取り出し
- https://github.com/kubernetes-sigs/external-dns/blob/758aa29f0cc1d592a88c3362834fe8a6fbd37c3d/source/ingress.go#L156
-
//endpointsFromIngressはIngressオブジェクトからエンドポイントを抽出します
- https://github.com/kubernetes-sigs/external-dns/blob/758aa29f0cc1d592a88c3362834fe8a6fbd37c3d/source/ingress.go#L350
- Ingressのstatusから”targets”としてALBのDNS名を取り出す
endpointsの収集を完了したとき、DNSNameは同じだがTargetsに別のALBが入ってるendpointがそれぞれ存在するはず
収集したrecordsとendpointsをplanに詰める
plan.Calculateする
HasChangesがfalseだとAll records are already up to date
になる
plan.Calculate