欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

K8s集群中的DNS服務(wù)CoreDNS實(shí)戰(zhàn)案例詳解

 更新時(shí)間:2025年06月01日 08:11:38   作者:huangSir-devops  
在 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)景,感興趣的朋友一起看看吧

概述

官網(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)詳解

    這篇文章主要為大家介紹了k8s編排之DaemonSet知識(shí)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    這篇文章主要介紹了k8s-部署HADOOP-3.2.2(HDFS)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • DeepSeek-R1 云環(huán)境搭建部署流程

    DeepSeek-R1 云環(huán)境搭建部署流程

    本文主要介紹了DeepSeek-R1 云環(huán)境搭建部署流程,包括注冊(cè)、選擇合適的服務(wù)器配置、部署DeepSeek模型及通過UI界面和SSH連接進(jìn)行操作,感興趣的可以了解一下
    2025-02-02
  • 基于云服務(wù)MRS構(gòu)建DolphinScheduler2調(diào)度系統(tǒng)的案例詳解

    基于云服務(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-05
  • k8s部署rabbitmq集群的方式

    k8s部署rabbitmq集群的方式

    本次部署方式為setafulset的方式部署rabbitmq集群,使用svc的無頭服務(wù),本次涉及使用到的服務(wù)有setafulset、secret、configmap、service、pv、pvc、sa,在rabbitmq的官網(wǎng)中使用的是operator的方式,感興趣的朋友一起看看吧
    2024-03-03
  • Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署

    Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署

    這篇文章主要為大家介紹了Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • k8s如何使用NFS作為StorageClass提供動(dòng)態(tài)存儲(chǔ)

    k8s如何使用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)求可以指向StorageClass
    2024-09-09
  • 一篇文章讀懂K8S的PV和PVC以及實(shí)踐攻略

    一篇文章讀懂K8S的PV和PVC以及實(shí)踐攻略

    本文詳細(xì)介紹了Kubernetes中的存儲(chǔ)卷(Volume)機(jī)制,包括PersistentVolume(PV)、PersistentVolumeClaim(PVC)及其與后端存儲(chǔ)的關(guān)系,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Rainbond云原生部署開源社區(qū)Discourse的配置過程

    Rainbond云原生部署開源社區(qū)Discourse的配置過程

    這篇文章主要為大家介紹了Rainbond云原生部署開源社區(qū)Discourse配置過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Kubernetes部署可視化地圖的十個(gè)步驟

    Kubernetes部署可視化地圖的十個(gè)步驟

    這篇文章主要為大家介紹了十步驟Kubernetes部署的可視化地圖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03

最新評(píng)論