External-dnsにexcludeフィルタを掛ける


external-dnsとともに挿入された内容を記録します.
これは正確な原理を把握していないために挿入された内容である可能性がある.
私と差が少ないかもしれませんが、入り口を排除したいだけです.もし誰かがこのような状況で
参考までにシャベルを最小化できると思います.△私だけがシャベルをしているようです.

🚪external-dnsは気持ちいいですね。え...?


EKS、external-dnsalb-ingress-controllerと一緒にいれば、コントローラたちは自分でALBとDNS記録を管理することができ、これは良い世界のようです.
しかし、最近WAFが適用された場合、サービスをWAFでアクセスさせるためにDNSレコードを設定する必要があり、このときexternal-dnsは管理レコードを変更して元の状態に戻すことができなかった.△そうです.

Ingressからコメントを消せばいいんじゃないですか?


そうですね.external-dnsのドキュメントでは、ingressは次の注釈を使用してレコードを管理するように起動されます.
つまり、ingressにexternal-dns.alpha.kubernetes.io/hostnameの注釈があれば
external-dnsは定期的にチェックされ、route 53に対応する設定値が加算される.

だから私もこれを削除すればDNS記録を自由に修正できると思っています.
でもIngressのルールがどうなのかもわからないので、これを外しても記録があります.
△正確な身分があれば教えてください.
今の仕事は明日再開します・・・だから、いくつかの入力を排除できるかどうかと思います.
例外処理の検索を開始します.

👷🏽すくい取る


external-dns?


もちろん思いもよらなかった.
レコードのために、みんなあきらめてはいけない.

ではexternal-dnsにrecordを掛ける前に、登録しておきましょう!

external-dnsのGithub問題から見ると、これが既存のDNS記録を破壊したらどうしますか?このような問題がよく見られます.彼に対する回答は,TXTを用いて追跡可能な記録のみを制御する.
I'm afraid you will mess up my DNS records!
...
ExternalDNS since v0.3 implements the concept of owning DNS records. This means that ExternalDNS will keep track of which records it has control over, and will never modify any records over which it doesn't have control.
...
For now ExternalDNS uses TXT records to label owned records, and there might be other alternatives coming in the future releases.
- External-dns document
だからこれらを逆(?)にしますそれを利用して、TXTレコードが走る前に、まずレコードを登録したいです.
すると、次のようなexternal−dnsは400個のエラーを放出し始めた.
level=error msg="InvalidChangeBatch: [Tried to create resource record set [name='abc.example.com.', type='TXT'] but it already exists]\n\tstatus code: 400, request id: 474634fd-0cc8-4a08-be3e-45cf2944d6a8"
無視するのではないかと心配していますが、ログを表示するのもよくありません.配置ミスで予想外の問題が発生したくないです.実はそう思うこと自体がおかしい.

--exclude-domainsに設定があります!


external−dnsのAWS tutorialから見ると、--exclude-domains構成が存在する.
--exclude-domains=ignore.this.example.com to exclude a domain or subdomain
ああ...external-dnsに書いてみましたが、何の反応もありませんでした.
本文の冒頭にも述べたように、私が間違っている確率は高い.
このほか、各種フィルタ・オプションも調べたが、適当なものは見られなかった.
app.Flag("provider", "The DNS provider where the DNS records will be created (required, options: aws, aws-sd, godaddy, google, azure, azure-dns, azure-private-dns, bluecat, cloudflare, rcodezero, digitalocean, hetzner, dnsimple, akamai, infoblox, dyn, designate, coredns, skydns, inmemory, ovh, pdns, oci, exoscale, linode, rfc2136, ns1, transip, vinyldns, rdns, scaleway, vultr, ultradns, gandi)").Required().PlaceHolder("provider").EnumVar(&cfg.Provider, "aws", "aws-sd", "google", "azure", "azure-dns", "hetzner", "azure-private-dns", "alibabacloud", "cloudflare", "rcodezero", "digitalocean", "dnsimple", "akamai", "infoblox", "dyn", "designate", "coredns", "skydns", "inmemory", "ovh", "pdns", "oci", "exoscale", "linode", "rfc2136", "ns1", "transip", "vinyldns", "rdns", "scaleway", "vultr", "ultradns", "godaddy", "bluecat", "gandi")
app.Flag("domain-filter", "Limit possible target zones by a domain suffix; specify multiple times for multiple domains (optional)").Default("").StringsVar(&cfg.DomainFilter)
app.Flag("exclude-domains", "Exclude subdomains (optional)").Default("").StringsVar(&cfg.ExcludeDomains)
app.Flag("regex-domain-filter", "Limit possible domains and target zones by a Regex filter; Overrides domain-filter (optional)").Default(defaultConfig.RegexDomainFilter.String()).RegexpVar(&cfg.RegexDomainFilter)
app.Flag("regex-domain-exclusion", "Regex filter that excludes domains and target zones matched by regex-domain-filter (optional)").Default(defaultConfig.RegexDomainExclusion.String()).RegexpVar(&cfg.RegexDomainExclusion)
app.Flag("zone-name-filter", "Filter target zones by zone domain (For now, only AzureDNS provider is using this flag); specify multiple times for multiple zones (optional)").Default("").StringsVar(&cfg.ZoneNameFilter)
app.Flag("zone-id-filter", "Filter target zones by hosted zone id; specify multiple times for multiple zones (optional)").Default("").StringsVar(&cfg.ZoneIDFilter)

Disable external-dns for specific ingresses #1910


こうしてグーグルで検索したとき、githubに登録されているissueと似たような悩みを抱えているエンジニアに出会った.
ずっと...読んで読んで…!あ!

🛠フィルタ設定


今になってやっと本題がある.
以上を参考に設定を開始します.

0. External-dns Image Update


まず、私たちの現在のビジネス/開発環境では、external-dnsのcontroller役を演じているやつがずっと前から創造され、かなり古いバージョンで運行されています.
そこで、まずexternal-dnsの画像を最新バージョンに更新する.
kubectl set image deployments/external-dns external-dns=k8s.gcr.io/external-dns/external-dns:v0.7.
これでdeploymentの画像を交換するだけでいいです.
このように画像を交換すると既存の記録が破壊されると思いますが、私が前に言ったようにTXTに追跡された記録を制御し、ingressが消えなければ記録は削除されないので問題ありません.
ここでimage update後、以下のエラーが発生した場合は、timed out waiting for the conditionで使用されているexternal-dns権限をよく確認してください.
time="2022-01-12T10:08:20Z" level=fatal msg="failed to sync cache: timed out waiting for the condition"
フォーマル (?)次の権限が必要です.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: external-dns
rules:
  - apiGroups: ['']
    resources: ['endpoints', 'pods', 'services']
    verbs: ['get', 'watch', 'list']
  - apiGroups: ['extensions']
    resources: ['ingresses']
    verbs: ['get', 'watch', 'list']
  - apiGroups: ["networking.k8s.io"]
    resources: ["ingresses"]
    verbs: ["get","watch","list"]
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["watch", "list"]

1.外部-dnsへのannotation-filetr annotationの追加


コントローラとして機能するclueterrole podにexternal-dnsを追加します.
これがあれば、入力中のexludeフィルタを識別して無視することができます.--annotation-filter podに直接掛けられている場合、問題のためpodが再起動されると削除されます.配置に掛けてください.
kubectl edit deployment external-dns
 containers:
  - args:
    - --source=service
    - --source=ingress
    - --domain-filter=exmaple.com
    - --provider=aws
    - --policy=upsert-only
    - --aws-zone-type=public
    - --registry=txt
    - --txt-owner-id=my-identifier
+   - --annotation-filter=external-dns.alpha.kubernetes.io/exclude notin (true)

2.例外を処理したいインポートにexcludedコメントを追加

external-dnsに特定の注釈があれば、記録の処理は無視されます!あなたがそう言った以上、これからは例外を処理したい入力の注釈から除外しましょう.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
         kubernetes.io/ingress.class: alb
         alb.ingress.kubernetes.io/listen-ports: ***
         alb.ingress.kubernetes.io/actions.ssl-redirect: '***
         alb.ingress.kubernetes.io/inbound-cidrs: 0.0.0.0/0 
         alb.ingress.kubernetes.io/scheme: "internet-facing" 
         alb.ingress.kubernetes.io/target-type: ip 
         alb.ingress.kubernetes.io/certificate-arn: ***
         alb.ingress.kubernetes.io/load-balancer-name: ***
         external-dns.alpha.kubernetes.io/hostname: ***
         alb.ingress.kubernetes.io/healthcheck-path: ***
         alb.ingress.kubernetes.io/load-balancer-attributes: ***
+        external-dns.alpha.kubernetes.io/exclude: "true"
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80
これにより、インポートに必要なレコードは処理されずに無視されます.

🚀の最後の部分


現在参加しているサービスは、Infraを最小限に抑え、Kubernetesのcontrollerなどを最大限に活用することです.△実は、これがkubernetesを本当に使っている理由だと思います.
そのため、LBやDNSもこのようにKubernetesコントローラを用いて制御しており、この過程で既存の動作方式とは異なる方法を探す必要があることが多い.
私は初めてKubernetesに触れて、このチームに参加したので、このようなことが起こるたびに、私はシャベルをしますが、これからはもっと深くシャベル(?)やってみたいです.やるからにはリソース制限やネットワーク制御をしてください...