前言
本文為「Kubernetes 實作手冊:基礎入門篇」課程的學習筆記。
簡介
CoreDNS 是一個可擴充的 DNS 伺服器,可以做為 Kubernetes 叢集的 DNS 伺服器。與 Kubernetes 一樣,CoreDNS 專案由 CNCF 托管。透過在現有的叢集中替換 kube-dns,可以在叢集中使用 CoreDNS 部署,或者使用 kubeadm 等工具來部署和升級叢集。CoreDNS 本身使用 ClusterIP Service 暴露服務到全叢集。
Service Name 與 ClusterIP 的轉換仰賴 CoreDNS。當 Pod 運行起來的時候,Kubernetes 預設會修改 /etc/resolv.conf
檔,把 Name Server 指向 CoreDNS,因此發出的請求,都會被導向 CoreDNS。
Pod DNS Policy 可以指定 Kubernetes 如何處理 Pod 的 DNS,有以下四個選項:
- Default:Pod 的 DNS 繼承自節點的 DNS。
- None:忽略所有配置,使用 Pod 的 YAML 配置檔中的
dnsConfig
欄位自定義 DNS。
- ClusterFirst:預設的選項,所有請求會優先在叢集所在域查詢,如果沒有才會轉發到上游 DNS。
- ClusterFirstWithHostNet:和 ClusterFirst 選項一樣,但是可以使 Pod 被外部網路直接訪問,也可以被叢集內的其他 Pod 訪問。
實作
查看 Pod 列表,只有 coredns
是透過 CNI 框架去部署的 IP 位址,其餘的 Pod 皆是與 Host Network 、節點共享網路。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| kubectl -n kube-system get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-6955765f44-4tvlr 1/1 Running 0 3m23s 10.244.0.2 kind-control-plane <none> <none> coredns-6955765f44-584jr 1/1 Running 0 3m23s 10.244.0.4 kind-control-plane <none> <none> etcd-kind-control-plane 1/1 Running 0 3m39s 172.17.0.3 kind-control-plane <none> <none> kindnet-55gvb 1/1 Running 0 3m8s 172.17.0.4 kind-worker2 <none> <none> kindnet-fpt7k 1/1 Running 0 3m8s 172.17.0.2 kind-worker <none> <none> kindnet-xgxtj 1/1 Running 0 3m23s 172.17.0.3 kind-control-plane <none> <none> kube-apiserver-kind-control-plane 1/1 Running 0 3m39s 172.17.0.3 kind-control-plane <none> <none> kube-controller-manager-kind-control-plane 1/1 Running 0 3m39s 172.17.0.3 kind-control-plane <none> <none> kube-proxy-6s4j2 1/1 Running 0 3m8s 172.17.0.2 kind-worker <none> <none> kube-proxy-89jhj 1/1 Running 0 3m8s 172.17.0.4 kind-worker2 <none> <none> kube-proxy-qdbb8 1/1 Running 0 3m23s 172.17.0.3 kind-control-plane <none> <none> kube-scheduler-kind-control-plane 1/1 Running 0 3m39s 172.17.0.3 kind-control-plane <none> <none>
|
查看 Service 列表,在 kube-system
命名空間中已有 kube-dns
服務。在叢集裡,可以使用 10.96.0.10
這個 Cluster IP 去存取 coredns
的服務。
1 2 3
| kubectl -n kube-system get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 103s
|
使用配置檔創建範例資料夾中的所有 Pod。
1
| kubectl apply -R -f introduction/pod_dns
|
Default
查看配置檔。
1
| cat introduction/pod_dns/basic.yaml
|
配置檔如下:
1 2 3 4 5 6 7 8 9 10 11
| apiVersion: v1 kind: Pod metadata: name: default labels: app: myapp spec: containers: - name: default image: hwchiu/netutils dnsPolicy: Default
|
查看 Pod 中的 /etc/resolv.conf
檔。
1 2 3
| kubectl exec default -- cat /etc/resolv.conf search hitronhub.home nameserver 10.0.2.3
|
查看名為 default
的 Pod 所在的節點。
1 2 3 4 5 6 7 8
| kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES clusterfirst 1/1 Running 0 4m57s 10.244.2.2 kind-worker <none> <none> clusterfirst-true 1/1 Running 0 4m57s 172.17.0.4 kind-worker2 <none> <none> clusterfirstwithhost 1/1 Running 0 4m57s 10.244.2.3 kind-worker <none> <none> clusterfirstwithhost-true 1/1 Running 0 4m57s 172.17.0.4 kind-worker2 <none> <none> default 1/1 Running 0 4m57s 10.244.1.2 kind-worker2 <none> <none> none 1/1 Running 0 4m57s 10.244.2.4 kind-worker <none> <none>
|
查看名為 kind-worker2
的節點中的 /etc/resolv.conf
檔。
1 2 3
| docker exec kind-worker2 cat /etc/resolv.conf nameserver 10.0.2.3 search hitronhub.home
|
Pod 與節點的 Name Server相同。
None
查看配置檔。
1
| cat introduction/pod_dns/none.yaml
|
配置檔如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| apiVersion: v1 kind: Pod metadata: name: none labels: app: myapp spec: containers: - name: none image: hwchiu/netutils dnsPolicy: None dnsConfig: nameservers: - 8.8.8.8 searches: - ns1.svc.cluster-domain.example - my.dns.search.suffix options: - name: ndots value: "2" - name: edns0
|
查看 Pod 中的 /etc/resolv.conf
檔。
1 2 3 4
| kubectl exec -it none -- cat /etc/resolv.conf search ns1.svc.cluster-domain.example my.dns.search.suffix nameserver 8.8.8.8 options ndots:2 edns0
|
與自定義的配置相同。
ClusterFirst
查看配置檔。
1
| cat introduction/pod_dns/clusterFirst.yaml
|
配置檔如下:
1 2 3 4 5 6 7 8 9 10 11
| apiVersion: v1 kind: Pod metadata: name: clusterfirst labels: app: myapp spec: containers: - name: clusterfirst image: hwchiu/netutils dnsPolicy: ClusterFirst
|
查看 Pod 中的 /etc/resolv.conf
檔,Pod 的 Name Server 指向 CoreDNS 的 Cluster IP。
1 2 3 4
| kubectl exec clusterfirst -- cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local hitronhub.home nameserver 10.96.0.10 options ndots:5
|
ClusterFirstWithHostNet
查看配置檔。
1
| cat introduction/pod_dns/clusterwithhost.yaml
|
配置檔如下:
1 2 3 4 5 6 7 8 9 10 11
| apiVersion: v1 kind: Pod metadata: name: clusterfirstwithhost labels: app: myapp spec: containers: - name: clusterfirstwithhost image: hwchiu/netutils dnsPolicy: ClusterFirstWithHostNet
|
查看 Pod 中的 /etc/resolv.conf
檔,Pod 的 Name Server 指向 CoreDNS 的 Cluster IP。
1 2 3 4
| kubectl exec -it clusterfirstwithhost -- cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local hitronhub.home nameserver 10.96.0.10 options ndots:5
|
參考資料