📮

Kubernetes クラスタ内ホスト名に CNAME レコードでエイリアスを付与したい

2022/10/28に公開

Kubernetes クラスタ内で使えるホスト名に CNAME レコード相当でエイリアスを付与したい場合を考えます。
クラスタ内では CoreDNS が使われているものとします。

TL;DR

Corefile(CoreDNS の設定ファイル)で rewrite プラグインを使って記述します。

例えば Service のアドレスである foo.default.svc.cluster.localfoo.example.com にエイリアスしたい場合は以下のように行を追加します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        (省略)
        rewrite name foo.example.com foo.default.svc.cluster.local
        (省略)
    }

ConfigMap を更新したら,CoreDNS の Pod に SIGUSR1 シグナルを送り,無停止でリロードし,設定を反映します。

kubectl exec -n kube-system coredns-980047985-g2748 -- kill -SIGUSR1 1

参考

そのものズバリの記事がありました。

https://coredns.io/2017/05/08/custom-dns-entries-for-kubernetes/

rewrite プラグインは CNAME レコード相当の単純なエイリアス付与以外にも,DNS レコードタイプや TTL の変更などに使えます。

rewrite [continue|stop] FIELD [TYPE] [(FROM TO)|TTL] [OPTIONS]

またパターンマッチには,デフォルトの完全一致以外にも,前方一致,後方一致,部分一致,正規表現が使えます。

rewrite [continue|stop] name [exact|prefix|suffix|substring|regex] STRING STRING [OPTIONS]

補足

今回紹介した方法は,厳密には CNAME レコードとは異なります。

名前解決クエリに対して,該当のエイリアスだった場合に本来のホスト名にクエリを書き換えてから,名前解決を実行するという設定になります。
結果として,本来のホスト名のクエリ結果が返るので,同様の内容を CNAME レコードで設定した場合と同じになります。

Discussion