自宅 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です.
設定も同じく下記の公式ページの「Layer 2 Configuration」のように行うだけ.
当然ながら,ここで割り当てるアドレス範囲は,クラスタ外のネットワークの DHCP サーバーが使わないものにしておく必要があります.
CoreDNS
クラスタ外に,Docker で配置します.HAProxy 等のリバースプロキシを置くホストで動かすと良いと思います.
作成するのは次の3つのファイル.
- docker-compose.yml
- coredns/Dockerfile
- coredns/conf/Corefile
docker-compose.yml
DNS 用のポート 53 を公開するように指定します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
version: "2" services: coredns: build: coredns container_name: coredns restart: on-failure expose: - '53' - '53/udp' ports: - '53:53' - '53:53/udp' volumes: - './coredns/conf:/etc/coredns' etcd: image: quay.io/coreos/etcd:v3.5.8 container_name: etcd ports: - "2379:2379" - "2380:2380" command: >- /usr/local/bin/etcd -name etcd -data-dir /etcd-data -listen-client-urls http://0.0.0.0:2379 -advertise-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-advertise-peer-urls http://0.0.0.0:2380 -initial-cluster etcd=http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster-state new |
coredns/Dockerfile
同じく,DNS 用のポート 53 を公開設定します.
1 2 3 4 5 6 7 8 |
FROM coredns/coredns:1.10.1 EXPOSE 53 EXPOSE 53/udp ENTRYPOINT ["/coredns"] CMD ["-conf", "/etc/coredns/Corefile"] |
coredns/conf/Corefile
CoreDNS でハンドリングするドメインと,それ以外の名前解決を中継する DNS サーバのアドレスを設定します.
「kubernetes.green-rabbit.net」や「192.168.0.1」を環境に合わせて適宜書き換えてください.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
kubernetes.green-rabbit.net { etcd { path /skydns endpoint http://etcd:2379 fallthrough } cache errors log } . { any forward . 192.168.0.1 } |
起動と動作確認
以上の3点のファイルが準備できたら,コンテナを立ち上げておきます.
1 |
$ docker-compose up -d |
下記のようにすると,ホスト名「test.kubernetes.green-rabbit.net」の IP アドレスとして「192.168.0.254」を登録できます.
1 |
$ docker exec -it etcd etcdctl put /skydns/net/green-rabbit/kubernetes/test '{"host":"192.168.0.254","ttl":60}' |
dig
で名前解決できることを確認しておきます.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ dig test.kubernetes.green-rabbit.net @localhost ; <<>> DiG 9.18.12-0ubuntu0.22.04.1-Ubuntu <<>> test.kubernetes.green-rabbit.net @localhost ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18308 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: 983e8a8dde1ebd9e (echoed) ;; QUESTION SECTION: ;test.kubernetes.green-rabbit.net. IN A ;; ANSWER SECTION: test.kubernetes.green-rabbit.net. 60 IN A 192.168.0.254 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(localhost) (UDP) ;; WHEN: Wed May 10 23:52:27 JST 2023 ;; MSG SIZE rcvd: 121 |
ExternalDNS
インストールは下記の公式ページのドキュメントの「Manifest (for clusters with RBAC enabled)」を使用します.
下記のように2箇所だけ書き換えておきます.「192.168.0.20」の部分は,先ほど CoreDNS を設置したホストの IP アドレスに置き換えてください.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- original +++ external_dns.yaml @@ -54,9 +54,9 @@ - name: external-dns image: registry.k8s.io/external-dns/external-dns:v0.13.4 args: - - --source=ingress + - --source=service - --provider=coredns - --log-level=debug # debug only env: - name: ETCD_URLS - value: http://10.105.68.165:2379 + value: http://192.168.0.20:2379 |
動作確認
Kubernetes の Service に対して次の2つの annotation を設定すると,IP の振り出しとCoreDNS への登録が行われるようになります.
- metallb.universe.tf/address-pool
- external-dns.alpha.kubernetes.io/hostname
具体的には,下記のような感じです.
1 2 3 4 5 6 7 8 9 10 |
kind: Service apiVersion: v1 metadata: annotations: metallb.universe.tf/address-pool: first-pool external-dns.alpha.kubernetes.io/hostname: grafana.kubernetes.green-rabbit.net (snip) spec: (snip) type: LoadBalancer |
参考文献
- 自宅 k8s クラスタのサービスに FQDN で繋がるようにした
- 引用元といった方が良いかも.ほぼここに書かれている内容をなぞっています.
コメント