[12] 為什麼 CoreDNS 可以解析 VPC endpoint 及外部 DNS
預設 EKS1 使用了 CoreDNS2 作為 Kubernetes 內部 DNS 服務器,我們也可以根據 kubectl get deploy
命令查看 CoreDNS 資源:
$ kubectl -n kube-system get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 2/2 2 2 12d
於 Day 3 所提及於 EKS node bootstrap script 內提供了 --dns-cluster-ip
設定 CoreDNS service IP。但是這部分僅能了解 Pods 使用此 IP 作為 resolver,那為什麼 CoreDNS Pod 不會繼承此 CoreDNS Service Cluster IP,倘若繼承了此 IP 豈不是也造成了遞迴無法解析 VPC endpoint 及外部 DNS 域名。
故本文將探討 CoreDNS 設定及 EKS DNS 解析流程。
kubelet 設定檔
再次複習一下 EKS AMI Build Specification bootstrap.sh3 中,取得 --dns-cluster-ip
變數設定後更新至 kubelet 設定檔 clusterDNS
flag。
echo "$(jq ".clusterDNS=[\"$DNS_CLUSTER_IP\"]" $KUBELET_CONFIG)" > $KUBELET_CONFIG
我們也可以於 EKS worker node 上檢視相應設定,預設為 10.100.0.10
。
[ec2-user@ip-192-168-3-47 ~]$ jq .clusterDNS /etc/kubernetes/kubelet/kubelet-config.json
[
"10.100.0.10"
]
根據 kubelet4 文件 --cluster-dns
,為 DNS IP 地址 list,適用於每個 dnsPolicy=ClusterFirst
的 Pod。
Pod's DNS Policy
Kubernetes Pod DNS Policy4 有以下四種:
Default
:Pod 繼承所在的 node 上的 DNS 解析設定。ClusterFirst
:與預設 cluster domain suffix 不相符時,如cluster.local
,則會轉發至 node 所繼承的上游 DNS 服務器。ClusterFirstWithHostNet
:對於已設定hostNetwork
的 Pod,則應該設置此 DNS 策略ClusterFirstWithHostNet
。None
:此設定允許 Pod 忽略 Kubernetes 環境中的 DNS 設定。
驗證測試
預設 Pod
透過 kubectl run
執行啟用一個 aws-cli
Pod 並無額外設定。
$ kubectl run aws-cli --image="amazon/aws-cli" --command sleep infinity
pod/aws-cli created
檢視 dnsPolicy 確認預設使用 ClusterFirst
。這邊需要注意的是 Default
並非預設值,而 Kubernetes dnsPolicy 預設值為 ClusterFirst
。
$ kubectl get po aws-cli -o yaml | grep "dnsPolicy"
dnsPolicy: ClusterFirst
同時,檢視 Pods resolver 設定檔 /etc/resolv.conf
也能確認 nameserver
設定為 10.100.0.10
。
$ kubectl exec -it aws-cli -- cat /etc/resolv.conf
nameserver 10.100.0.10
search default.svc.cluster.local svc.cluster.local cluster.local eu-west-1.compute.internal
options ndots:5