自宅ではオンプレでk8sのクラスターを運用しているが、一部データベースなどはk8sのクラスター外の自宅サーバー上に構築していて、クラスター内からアクセスすることが多々ある。 自宅内ではunboundでDNSサーバーを運用していて各種データベースのサーバーの名前などはここに登録しているが、k8sのクラスターの中からでも自宅のDNSサーバーを参照して名前解決できるようにしたい。
nodelocaldnsのdisable
Kubernetesではサービスディスカバリーなどpodやserviceの名前解決のDNSとしてCoreDNSが用いられているが、その前段にDNS cacheによってパフォーマンスを向上させるnodelocaldnsの機構が導入されている(参考)。nodelocaldnsは各ノードのdaemonsetとして起動しており、各種podなどのnameserverとしてはこれが参照される。 nodelocaldns自体もCorefileによってconfigmapから値が設定されている。
$ kubectl get configmaps --namespace=kube-system nodelocaldns -o yaml
apiVersion: v1data: Corefile: | cluster.local:53 { errors cache { success 9984 30 denial 9984 5 } reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 health 169.254.25.10:9254 } in-addr.arpa:53 { errors cache 30 reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 } ip6.arpa:53 { errors cache 30 reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 } .:53 { errors cache 30 reload loop bind 169.254.25.10 forward . /etc/resolv.conf prometheus :9253 }kind: ConfigMapmetadata: annotations: ...
色々と試したがDNSキャッシュ有りの状態では上手く自宅DNSの設定ができず、今回は一旦簡略化のため、nodelocaldnsをdisableにして設定することにする。k8sクラスターはkubesprayで構築しており、クラスター設定のパラメータ集からnodelocaldnsをdisableにすることができる(コード)。
CoreDNSの設定
バックエンドのCoreDNSも専用のconfigmapがあり、ここから自宅のDNSを参照するように設定する。自宅ではmana-ysh.home
というdomain名を運用しているので、その名前にヒットするものは自宅DNSによって名前解決するような設定を適用して、CoreDNSのpodをrestart。
$ cat configmap.yaml
apiVersion: v1kind: ConfigMapmetadata: name: coredns namespace: kube-systemdata: Corefile: | .:53 { errors health { lameduck 5s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance } mana-ysh.home:53 { errors cache 30 forward . <IP address of your DNS server> }
$ kubectl apply -f configmap.yaml$ kubectl -n kube-system rollout restart deployment coredns
必要な設定は以上。
動作確認
busyboxでコンテナを立てて動作確認。
$ kubectl run -it --rm busybox --image=busybox -- shIf you don't see a command prompt, try pressing enter./ # nslookup work01.mana-ysh.homeServer: 10.233.0.3Address: 10.233.0.3:53
Name: work01.mana-ysh.homeAddress: 192.168.0.14