Kubernetesのcluster使うDNSはClusterアドオンとして用意されています。今回は以下のアドオンを使ってserviceとkube-dnsのpodを作りpodで名前解決が出来るようにします。
以下に設定が用意されているので、これを使ってkube-dnsを動かしてみます。
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns
apiserverの設定
kubernetesの認証とアクセス制御を動かしてみるで構築したKubernetesのClusterがインストールされている前提で記述します。
まず、apiserverの設定を追加します。--advertise-address
はkebeletから接続させるためのipアドレスを設定します。kube-apiserver -h
で確認すると--bind-address
を設定しているときは同じアドレスが--advertise-address
に設定されると記述されていますが0.0.0.0
がアドバタイズするアドレスとして設定できないようで、kubeleteから接続出来るipアドレスを設定する必要があります。
podからはapiserverのclusterIP(10.254.0.1)にsslで通信できるように鍵を設定します。
$ cat /etc/kubernetes/apiserver |
policyの設定
kube-dnsのnamespaceがkube-system
なのでnamespaceがdefaultのapiserverに接続するためのpolicyを追加する必要があります。
$ cat /etc/kubernetes/policy/abac-policy.jsonl |
再起動
apiserverを再起動します。
$ systemctl restart kube-apiserver |
kubeletの設定
kubeletにapiserverと同じ鍵を設定して、dnsの設定も追加します。
$ cat /etc/kubernetes/kubelet |
鍵はapiserverで設定した同じものをコピペして設定します。--cluster-dns
はdnsに割り当てるclusteripを設定します。--cluster-domain
はcluster内で使うドメインを指定します。デフォルトはcluster.local
なのでとりあえずデフォルトを設定しておきます。
再起動
kubeletを再起動します。
$ systemctl restart kubelet.service |
kube-dnsを作る
次のkubernetesのレポジトリのファイルを作ってpodとserviceを作ります。
https://github.com/kubernetes/kubernetes/tree/f7305e6f4375a34cb6e2f47b6e164527370e8871/cluster/addons/dns
まず、serviceから。dnsのipアドレスを設定してサービスを作成します。
$ wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/kubedns-svc.yaml.base |
次にkube-dnsを作ります。設定は使うドメインのみ設定しています。
$ wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/kubedns-controller.yaml.base |
正しく起動できた場合は上記のように表示されます。podはkube-dns, sidecar, dnsmasqが作成されます。この3つのpodでdnsの機能を提供する様に設定されています。sidecarがLeader election、dnsmasqがinternal dnsとして動作するようです。
うまく起動しない場合はminionの/var/log/messages
にkubeletのログが出ているので確認できます。
以下の様なログが出ている場合はapiserverと通信ができてないのでapiserverの認証やadvertise-addressが設定されているか確認する必要があります。Failed to list *v1.Service: Get https://10.254.0.1:443/api/v1/services?resourceVersion=0: dial tcp 10.254.0.1:443: getsockopt: connection refused
Failed to list *v1.Endpoints: Get https://10.254.0.1:443/api/v1/endpoints?resourceVersion=0: dial tcp 10.254.0.1:443: getsockopt: connection refused
Failed to list *v1.ConfigMap: Get https://10.254.0.1:443/api/v1/namespaces/kube-system/configmaps?fieldSelector=metadata.name%3Dkube-dns&resourceVersion=0: dial tcp 10.254.0.1:443: getsockopt: connection refused
動作確認
以下の手順を参考にdnsが正しく動作しているか確認します。
https://kubernetes.io/docs/admin/dns/
以下の設定を作成してpodを作ります。
$ cat busybox.yaml |
podの中からkubernetes.default
をlookupするとアドレスが確認できます。$ kubectl get pods busybox
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 21s
$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server: 10.254.254.254
Address 1: 10.254.254.254 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.254.0.1 kubernetes.default.svc.cluster.local
podに付けた名前とipアドレスで正引き・逆引きが出来ることが確認できます。$ kubectl exec -ti busybox -- nslookup busybox
Server: 10.254.254.254
Address 1: 10.254.254.254 kube-dns.kube-system.svc.cluster.local
Name: busybox
Address 1: 172.30.62.3 busybox
$ kubectl exec -ti busybox -- nslookup 172.30.67.4
Server: 10.254.254.254
Address 1: 10.254.254.254 kube-dns.kube-system.svc.cluster.local
Name: 172.30.62.3
Address 1: 172.30.62.3 busybox
pod内の/etc/resolv.conf
を確認するとnameserverにkube-dnsのipアドレスが追加されていることが確認できます。domainではなくsearchに3つの名前が追加されていることが確認できます。
$ kubectl exec busybox cat /etc/resolv.conf |
最後に作成したリソースを記載しておきます。$ kubectl get all --all-namespaces -o wide
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default svc/kubernetes 10.254.0.1 <none> 443/TCP 3h <none>
kube-system svc/kube-dns 10.254.254.254 <none> 53/UDP,53/TCP 3h k8s-app=kube-dns
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
default po/busybox 1/1 Running 2 2h 172.30.62.3 centos-minion-1
kube-system po/kube-dns-3216771805-8swlk 3/3 Running 0 3h 172.30.62.2 centos-minion-1
おわり。