Back

/ 4 min read

Kubernetes上のワークロードで自宅DNSを使った名前解決

自宅ではオンプレでk8sのクラスターを運用しているが、一部データベースなどはk8sのクラスター外の自宅サーバー上に構築していて、クラスター内からアクセスすることが多々ある。 自宅内ではunboundでDNSサーバーを運用していて各種データベースのサーバーの名前などはここに登録しているが、k8sのクラスターの中からでも自宅のDNSサーバーを参照して名前解決できるようにしたい。

nodelocaldnsのdisable

Kubernetesではサービスディスカバリーなどpodやserviceの名前解決のDNSとしてCoreDNSが用いられているが、その前段にDNS cacheによってパフォーマンスを向上させるnodelocaldnsの機構が導入されている(参考)。nodelocaldnsは各ノードのdaemonsetとして起動しており、各種podなどのnameserverとしてはこれが参照される。 nodelocaldns自体もCorefileによってconfigmapから値が設定されている。

Terminal window
$ kubectl get configmaps --namespace=kube-system nodelocaldns -o yaml
apiVersion: v1
data:
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: ConfigMap
metadata:
annotations:
...

色々と試したがDNSキャッシュ有りの状態では上手く自宅DNSの設定ができず、今回は一旦簡略化のため、nodelocaldnsをdisableにして設定することにする。k8sクラスターはkubesprayで構築しており、クラスター設定のパラメータ集からnodelocaldnsをdisableにすることができる(コード)。

CoreDNSの設定

バックエンドのCoreDNSも専用のconfigmapがあり、ここから自宅のDNSを参照するように設定する。自宅ではmana-ysh.homeというdomain名を運用しているので、その名前にヒットするものは自宅DNSによって名前解決するような設定を適用して、CoreDNSのpodをrestart。

Terminal window
$ cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
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でコンテナを立てて動作確認。

Terminal window
$ kubectl run -it --rm busybox --image=busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup work01.mana-ysh.home
Server: 10.233.0.3
Address: 10.233.0.3:53
Name: work01.mana-ysh.home
Address: 192.168.0.14