K8s集群中的DNS服務(wù)CoreDNS實(shí)戰(zhàn)案例詳解
概述
官網(wǎng)文檔:https://kubernetes.io/zh-cn/docs/concepts/services-networking/dns-pod-service/
在 Kubernetes(K8s)中,DNS 服務(wù)是實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和 Pod 通信的核心組件之一,用于解決集群內(nèi)資源通過域名而非 IP 地址進(jìn)行訪問的需求。本文將詳細(xì)解析 K8s DNS 服務(wù)的原理、組件、配置及應(yīng)用場(chǎng)景。
K8s DNS的作用
服務(wù)發(fā)現(xiàn)
- 允許 Pod 通過服務(wù)名稱(Service Name)而非動(dòng)態(tài)變化的 IP 地址訪問其他服務(wù),簡(jiǎn)化網(wǎng)絡(luò)配置。
- 支持跨命名空間(Namespace)的服務(wù)訪問,通過域名后綴區(qū)分不同作用域。
Pod 通信
- 每個(gè) Pod 自動(dòng)獲取 DNS 配置,可直接通過主機(jī)名(Hostname)或服務(wù)名進(jìn)行通信。
解耦服務(wù)依賴
- 服務(wù)的 IP 地址變更時(shí),DNS 會(huì)自動(dòng)更新解析結(jié)果,避免手動(dòng)維護(hù) IP 列表。
核心組件:CoreDNS(替代傳統(tǒng) kube-dns)
K8s 早期使用kube-dns作為 DNS 服務(wù)器,目前默認(rèn)采用CoreDNS,因其更輕量、靈活且支持插件機(jī)制。
CoreDNS的安裝
如果使用kubeadm部署集群,CoreDNS 會(huì)自動(dòng)部署在kube-system命名空間下,如果需要進(jìn)行部署,可以使用下面的文件:
kubectl apply -f https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
部署CoreDNS通常包含
- StatefulSet/Deployment:定義 CoreDNS Pod 副本。
apiVersion: apps/v1 kind: Deployment metadata: name: coredns namespace: kube-system spec: replicas: 2 # 默認(rèn)2個(gè)副本,確保高可用 selector: matchLabels: k8s-app: kube-dns # 歷史遺留標(biāo)簽,兼容舊版kube-dns template: metadata: labels: k8s-app: kube-dns spec: containers: - name: coredns image: coredns/coredns:v1.10.1 # CoreDNS版本 args: [ "-conf", "/etc/coredns/Corefile" ] ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP volumeMounts: - name: config-volume mountPath: /etc/coredns volumes: - name: config-volume configMap: name: coredns items: - key: Corefile path: Corefile
- Service:暴露 CoreDNS 服務(wù),供集群內(nèi) Pod 訪問(默認(rèn) IP 為10.96.0.10)。
apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system spec: selector: k8s-app: kube-dns clusterIP: 10.96.0.10 # 默認(rèn)集群IP,Pod的nameserver配置指向此IP ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP
- ConfigMap:存儲(chǔ) Corefile 配置。
.:53 { #表示監(jiān)聽所有接口的 53 端口(DNS 標(biāo)準(zhǔn)端口)。 errors # 記錄錯(cuò)誤日志 health { lameduck 5s # 健康檢查,延遲5秒標(biāo)記不健康 } ready # 提供 readiness 探針端點(diǎn)(/ready),指示 CoreDNS 是否準(zhǔn)備好處理請(qǐng)求 kubernetes cluster.local in-addr.arpa ip6.arpa { fallthrough in-addr.arpa ip6.arpa # 未匹配到K8s服務(wù)時(shí),透?jìng)鹘o下一個(gè)插件 ttl 30 # DNS記錄的TTL時(shí)間 } prometheus :9153 # 暴露Prometheus監(jiān)控指標(biāo) forward . /etc/resolv.conf # 轉(zhuǎn)發(fā)外部域名查詢到宿主機(jī)的DNS服務(wù)器 cache 30 # 緩存查詢結(jié)果30秒 loop # 檢測(cè)配置循環(huán)引用 reload # 自動(dòng)重新加載配置變更 loadbalance # 對(duì)A/AAAA記錄進(jìn)行負(fù)載均衡 }
CoreDNS的組成
- CoreDNS Pod:運(yùn)行 CoreDNS 服務(wù),監(jiān)聽 DNS 請(qǐng)求(默認(rèn)端口 53)。
[root@master ~]# kubectl get po -o wide -n kube-system NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-787d4945fb-jb4t9 1/1 Running 1 (2d23h ago) 9d 100.117.144.135 node01 <none> <none> coredns-787d4945fb-z47x7 1/1 Running 1 (2d23h ago) 9d 100.117.144.138 node01 <none> <none>
- Service 資源:為 CoreDNS Pod 暴露集群內(nèi)部服務(wù),名稱為kube-dns(或coredns,取決于部署方式),IP 通常為10.96.0.10(集群 IP 范圍)。
[root@master ~]# kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9d [root@master ~]# kubectl describe svc kube-dns -n kube-system Name: kube-dns Namespace: kube-system Labels: k8s-app=kube-dns kubernetes.io/cluster-service=true kubernetes.io/name=CoreDNS Annotations: prometheus.io/port: 9153 prometheus.io/scrape: true Selector: k8s-app=kube-dns Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: 10.96.0.10 IPs: 10.96.0.10 Port: dns 53/UDP TargetPort: 53/UDP Endpoints: 100.117.144.135:53,100.117.144.138:53 Port: dns-tcp 53/TCP TargetPort: 53/TCP Endpoints: 100.117.144.135:53,100.117.144.138:53 Port: metrics 9153/TCP TargetPort: 9153/TCP Endpoints: 100.117.144.135:9153,100.117.144.138:9153 Session Affinity: None Events: <none>
- ConfigMap 配置:通過 ConfigMap 定義 CoreDNS 的解析規(guī)則和插件。
[root@master ~]# kubectl describe cm coredns -n kube-system Name: coredns Namespace: kube-system Labels: <none> Annotations: <none> Data ==== Corefile: ---- .:53 { errors health { lameduck 5s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance } BinaryData ==== Events: <none>
CoreDNS域名解析規(guī)則
K8s集群中Pod之間通過域名互相訪問需要遵守特定的規(guī)則,規(guī)則如下
<service-name>.<namespace>.svc.<cluster-domain>
- service-name:表示service的名稱
- namespace:service所在的命名空間
- cluster-domain:集群的域名,默認(rèn)為
cluster.local
cluster-domain從哪兒獲???
[root@master ~]# grep clusterDomain /var/lib/kubelet/config.yaml clusterDomain: cluster.local
CoreDNS實(shí)戰(zhàn)案例
驗(yàn)證同一個(gè)命名空間下的CoreDNS訪問
創(chuàng)建兩個(gè)Pod和Service
## 第一個(gè)Pod和 Service [root@master ~/coredns]# cat test-1.yaml apiVersion: v1 kind: Pod metadata: name: dns-target-pod labels: app: dns-test spec: containers: - name: busybox image: busybox command: ["sh", "-c", "while true; do sleep 3600; done"] --- apiVersion: v1 kind: Service metadata: name: dns-target-service spec: type: ClusterIP selector: app: dns-test ports: - protocol: TCP port: 80 targetPort: 80 [root@master ~/coredns]# kubectl apply -f test-1.yaml pod/dns-target-pod unchanged service/dns-target-service created # 第二個(gè)Pod和Service [root@master ~/coredns]# cat test-2.yaml apiVersion: v1 kind: Pod metadata: name: dns-source-pod labels: app: dns-source-test spec: containers: - name: busybox image: busybox command: ["sh", "-c", "while true; do sleep 3600; done"] --- apiVersion: v1 kind: Service metadata: name: dns-source-service spec: type: ClusterIP selector: app: dns-source-test ports: - protocol: TCP port: 80 targetPort: 80 [root@master ~/coredns]# kubectl apply -f test-2.yaml pod/dns-source-pod created service/dns-source-service created # 檢查一下 [root@master ~/coredns]# kubectl get po,svc NAME READY STATUS RESTARTS AGE pod/dns-source-pod 1/1 Running 0 111s pod/dns-target-pod 1/1 Running 0 8s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dns-source-service ClusterIP 10.96.0.192 <none> 80/TCP 81s service/dns-target-service ClusterIP 10.96.3.51 <none> 80/TCP 3m56s
驗(yàn)證DNS
[root@master ~/coredns]# kubectl exec -it pod/dns-source-pod -- sh / # nslookup dns-target-service.default.svc.cluster.local Server: 10.96.0.10 Address: 10.96.0.10:53 Name: dns-target-service.default.svc.cluster.local Address: 10.96.3.51
驗(yàn)證在不同命名空間下的DNS訪問
示例:
# 創(chuàng)建一個(gè)新的命名空間 [root@master ~/coredns]# kubectl create ns coredns namespace/coredns created [root@master ~/coredns]# kubectl get ns coredns NAME STATUS AGE coredns Active 15s
創(chuàng)建Pod和Service進(jìn)行驗(yàn)證
[root@master ~/coredns]# cat test-3.yaml apiVersion: v1 kind: Pod metadata: name: dns-coredns-pod namespace: coredns labels: app: dns-coredns-test spec: containers: - name: busybox image: busybox command: ["sh", "-c", "while true; do sleep 3600; done"] --- apiVersion: v1 kind: Service metadata: name: dns-coredns-service namespace: coredns spec: type: ClusterIP selector: app: dns-coredns-test ports: - protocol: TCP port: 80 targetPort: 80 [root@master ~/coredns]# kubectl apply -f test3.yaml pod/dns-coredns-pod created service/dns-coredns-service created [root@master ~]# kubectl get all -n coredns NAME READY STATUS RESTARTS AGE pod/dns-coredns-pod 1/1 Running 0 4m36s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dns-coredns-service ClusterIP 10.96.0.119 <none> 80/TCP 4m36s
進(jìn)行驗(yàn)證
[root@master ~/coredns]# kubectl exec -it dns-target-pod -- sh / # nslookup dns-coredns-service.coredns.svc.cluster.local Server: 10.96.0.10 Address: 10.96.0.10:53 Name: dns-coredns-service.coredns.svc.cluster.local Address: 10.96.0.119
到此這篇關(guān)于K8s集群中的DNS服務(wù)(CoreDNS)詳解的文章就介紹到這了,更多相關(guān)K8s DNS服務(wù)CoreDNS內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
k8s編排之DaemonSet知識(shí)點(diǎn)詳解
這篇文章主要為大家介紹了k8s編排之DaemonSet知識(shí)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01教你在k8s上部署HADOOP-3.2.2(HDFS)的方法
這篇文章主要介紹了k8s-部署HADOOP-3.2.2(HDFS)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04基于云服務(wù)MRS構(gòu)建DolphinScheduler2調(diào)度系統(tǒng)的案例詳解
這篇文章主要介紹了基于云服務(wù)MRS構(gòu)建DolphinScheduler2調(diào)度系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署
這篇文章主要為大家介紹了Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04k8s如何使用NFS作為StorageClass提供動(dòng)態(tài)存儲(chǔ)
本文主要介紹了k8s中的StorageClass,包括其定義、引入的原因、實(shí)現(xiàn)方式、定義方法以及回收策略對(duì)數(shù)據(jù)的影響等,首先,StorageClass是在K8s集群中創(chuàng)建用于動(dòng)態(tài)PV的管理,可以鏈接至不同的后端存儲(chǔ),對(duì)存儲(chǔ)的請(qǐng)求可以指向StorageClass2024-09-09Rainbond云原生部署開源社區(qū)Discourse的配置過程
這篇文章主要為大家介紹了Rainbond云原生部署開源社區(qū)Discourse配置過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04