APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

君もAKSのCoreDNSをカスタマイズしてみない?

モチベーション

最近案件で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をいじる検証目的でのみやってみてます。

learn.microsoft.com

実装してみよう

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

本記事の投稿者: 谷合純也
AKS/ACA、GitHubをメインにインフラ系のご支援を担当しています。
junya0530さんの記事一覧 | Zenn