モチベーション
最近案件でAKSのマルチクラスタ化における外部K8sサービスの名前解決で、CoreDNSをいじる案を出したのですが、ちゃんと記事化してなかったことに気が付きました。なお、筆者は以前マルチクラスタ案件でCoreDNSいじってた経験はあります。
今回は、CoreDNSのいじり方に焦点を当てて、DNSゾーンに登録したVMのAレコードを、AKSから名前解決してみます。
Microsoftからは以下のドキュメントも公開されているので、見てみてください。 learn.microsoft.com
構成
今回の構成は以下の通りです。
なお、Azure内であれば、AKSからカスタムドメインの名前解決する場合は、CoreDNSをいじらずとも、プライベートDNSゾーンを使うことで可能です。
今回はCoreDNSをいじることが主目的なので、「AKSの対向のVMとDNSがオンプレにある」といったシナリオで、Azure上の、プライベートでないDNSゾーンを使い、疑似的にAzure-オンプレを再現しています。
DNSゾーンには、VMのプライベートIPアドレスをAレコードとして登録しています。
そして、DNSゾーンのネーム サーバー 1(ns1-XX.azure-dns.com みたいなやつ)を、AKSのkube-system namespaceにあるcoredns-customというConfigMapリソースにforward設定として登録させることで、Aレコードを名前解決させます。
なお、今回はネーム サーバーのIPをAKSに登録し、名前解決は図りますが、Q&Aにもあるように、IPアドレスが変わる可能性もあるため、CoreDNSをいじる検証目的でのみやってみてます。
実装してみよう
Azure構成
まずは、Azureリソースの構成をお見せします。
VMのプライベートIPアドレスは、192.168.10.4
です。
DNSゾーンには、VMのプライベートIPアドレス 192.168.10.4
をAレコードとして、登録します。
この時、Aレコードはforward-dnsとしています。
なお、以下のスクショのネームサーバの箇所はマスクしていますが、この箇所にネームサーバ名が書いています。このネームサーバ1をAKSに登録します。
次に、ネームサーバ1のIPアドレスを確認します。
Cloud Shellでnslookupを叩いて、IPアドレスを取得しました。
$ nslookup ns1-XX.azure-dns.com. Server: 168.63.129.16 Address: 168.63.129.16#53 Non-authoritative answer: Name: ns1-XX.azure-dns.com Address: XXX.XXX.XXX.XXX ←★ Name: ns1-33.azure-dns.com Address: 2603:1061:0:10::21
これで、AKSのCoreDNSに登録する準備は完了しました。
また、AKS上から、熱VNet上のVMにpingなどのリクエストを送る場合は、VNetピアリングの上、NSGの受信ルールでも許可しておきましょう。
AKS構成
まずは、ConfigMap coredns-customの定義を確認してみましょう。
以下の通り、dataには何もありません。
$ kubectl -n kube-system edit configmaps coredns-custom -oyaml apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: "2024-01-15T10:35:02Z" labels: addonmanager.kubernetes.io/mode: EnsureExists k8s-app: kube-dns kubernetes.io/cluster-service: "true" name: coredns-custom namespace: kube-system resourceVersion: "353244" uid: 9d750aa8-886a-4079-94c1-ca5f7eee3afc
確認用のPodから名前解決を試みると、当たり前ですが、失敗します。
$ kubectl exec debug -it -- bash root@debug:/# nslookup forward-dns.test.ap-com.app Server: 10.0.0.10 Address: 10.0.0.10#53 ** server can't find forward-dns.test.ap-com.app: NXDOMAIN
次に以下の通り、ConfigMap coredns-customにforward設定を追加します。
$ kubectl -n kube-system get configmaps coredns-custom -oyaml apiVersion: v1 data: yourdns.server: | # XXXXX.server形式で記述 test.ap-com.app:53 { # ドメイン(DNSゾーン名) errors cache 1 forward . XXX.XXX.XXX.XXX # ネームサーバ1のIPアドレス } kind: ConfigMap metadata: creationTimestamp: "2024-01-15T10:35:02Z" labels: addonmanager.kubernetes.io/mode: EnsureExists k8s-app: kube-dns kubernetes.io/cluster-service: "true" name: coredns-custom namespace: kube-system resourceVersion: "355403" uid: 9d750aa8-886a-4079-94c1-ca5f7eee3afc
変更後は、一定時間待つか、Deployment corednsを再起動します。
$ kubectl -n kube-system rollout restart deployment coredns
では、Pod内から名前解決できるか確認してみましょう。
$ kubectl exec debug -it -- bash root@debug:/# nslookup forward-dns.test.ap-com.app Server: 10.0.0.10 Address: 10.0.0.10#53 Name: forward-dns.test.ap-com.app Address: 192.168.10.4 # ping forward-dns.test.ap-com.app PING forward-dns.test.ap-com.app (192.168.10.4) 56(84) bytes of data. 64 bytes from 192.168.10.4 (192.168.10.4): icmp_seq=1 ttl=63 time=2.83 ms 64 bytes from 192.168.10.4 (192.168.10.4): icmp_seq=2 ttl=63 time=2.10 ms 64 bytes from 192.168.10.4 (192.168.10.4): icmp_seq=3 ttl=63 time=2.09 ms 64 bytes from 192.168.10.4 (192.168.10.4): icmp_seq=4 ttl=63 time=2.69 ms
上記の結果より、AKSのCoreDNSのServiceリソース(10.0.0.10)にリクエストを送り、Pod corednsで、AzureのDNSゾーンにforwardして、名前解決していることが分かります。また、ping送信もできますね!最高!!!!
さいごに
いかがでしょうか?
CoreDNSのカスタマイズというとハードル高いイメージあるかと思いますが、結構簡単にできちゃいます。
是非皆さんもAKS外のカスタムドメインを名前解決したい場合はチャレンジしてみてください。
これで君もCoreDNSマスターだ!
今後は、CoreDNSいじって、AKSのマルチクラスタ構成で、双方にK8sリソースの名前解決できないか検証していく予定です。(できたらブログ書きます)
ACS事業部のご紹介
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化やGitHub Enterpriseの導入のご支援をしております。
www.ap-com.co.jp
www.ap-com.co.jp
また、一緒に働いていただける仲間も募集中です!
我々の事業部のCultureDeckはコチラ。
www.ap-com.co.jp 今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp