Kubernetes 上のサービスにホスト名でアクセス

サーバー
スポンサーリンク

自宅 Kubernetes クラスタで動かしているサービスに外部からホスト名でアクセスできるようにしたので手順を紹介します.

スポンサーリンク

やりたいこと

Fluentd と Raspberry Pi で作るセンサーネットワーク』で紹介したシステムを Kubernetes 上で動かし,ホスト名でアクセスできるようにしたい.

これにより,クラスタを再構築した際に,サービスに割り当てられる IP アドレスが変化しても影響が出ないようにします.

必要なもの

以下の3つを導入します.

  • MetalLB
  • CoreDNS
  • ExternalDNS

MetalLB は Kubernetes で動作するロードバランサですが,自宅 Kubernetes では単に Pod 上の Service に IP を割り振るツールとして使えます.

ExternalDNS は,MetalLB が降り出した IP を名前引きできるように CoreDNS に登録する機能を提供します.

それぞれの設定手順を順に説明します.

MetalLB

インストールは下記の公式ページの「Installation By Manifest」の通り,metallb-native.yaml を apply するだけでOKです.

MetalLB, bare metal load-balancer for Kubernetes

設定も同じく下記の公式ページの「Layer 2 Configuration」のように行うだけ.

MetalLB, bare metal load-balancer for Kubernetes

当然ながら,ここで割り当てるアドレス範囲は,クラスタ外のネットワークの DHCP サーバーが使わないものにしておく必要があります.

CoreDNS

クラスタ外に,Docker で配置します.HAProxy 等のリバースプロキシを置くホストで動かすと良いと思います.

作成するのは次の3つのファイル.

  • docker-compose.yml
  • coredns/Dockerfile
  • coredns/conf/Corefile

docker-compose.yml

DNS 用のポート 53 を公開するように指定します.

coredns/Dockerfile

同じく,DNS 用のポート 53 を公開設定します.

coredns/conf/Corefile

CoreDNS でハンドリングするドメインと,それ以外の名前解決を中継する DNS サーバのアドレスを設定します.

「kubernetes.green-rabbit.net」や「192.168.0.1」を環境に合わせて適宜書き換えてください.

起動と動作確認

以上の3点のファイルが準備できたら,コンテナを立ち上げておきます.

下記のようにすると,ホスト名「test.kubernetes.green-rabbit.net」の IP アドレスとして「192.168.0.254」を登録できます.

dig で名前解決できることを確認しておきます.

ExternalDNS

インストールは下記の公式ページのドキュメントの「Manifest (for clusters with RBAC enabled)」を使用します.

external-dns/docs/tutorials/coredns.md at master · kubernetes-sigs/external-dns
Configure external DNS servers (AWS Route53, Google CloudDNS and others) for Kubernetes Ingresses and Services - kuberne...

下記のように2箇所だけ書き換えておきます.「192.168.0.20」の部分は,先ほど CoreDNS を設置したホストの IP アドレスに置き換えてください.

動作確認

Kubernetes の Service に対して次の2つの annotation を設定すると,IP の振り出しとCoreDNS への登録が行われるようになります.

  • metallb.universe.tf/address-pool
  • external-dns.alpha.kubernetes.io/hostname

具体的には,下記のような感じです.

参考文献

自宅 k8s クラスタのサービスに FQDN で繋がるようにした
引用元といった方が良いかも.ほぼここに書かれている内容をなぞっています.

コメント