最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2025年06月01日 08:11:38   作者:huangSir-devops  
在 Kubernetes(K8s)中,DNS 服務是實現(xiàn)服務發(fā)現(xiàn)和 Pod 通信的核心組件之一,用于解決集群內資源通過域名而非 IP 地址進行訪問的需求,本文將詳細解析 K8s DNS 服務的原理、組件、配置及應用場景,感興趣的朋友一起看看吧

概述

官網(wǎng)文檔:https://kubernetes.io/zh-cn/docs/concepts/services-networking/dns-pod-service/

在 Kubernetes(K8s)中,DNS 服務是實現(xiàn)服務發(fā)現(xiàn)和 Pod 通信的核心組件之一,用于解決集群內資源通過域名而非 IP 地址進行訪問的需求。本文將詳細解析 K8s DNS 服務的原理、組件、配置及應用場景。

K8s DNS的作用

服務發(fā)現(xiàn)

  • 允許 Pod 通過服務名稱(Service Name)而非動態(tài)變化的 IP 地址訪問其他服務,簡化網(wǎng)絡配置。
  • 支持跨命名空間(Namespace)的服務訪問,通過域名后綴區(qū)分不同作用域。

Pod 通信

  • 每個 Pod 自動獲取 DNS 配置,可直接通過主機名(Hostname)或服務名進行通信。

解耦服務依賴

  • 服務的 IP 地址變更時,DNS 會自動更新解析結果,避免手動維護 IP 列表。

核心組件:CoreDNS(替代傳統(tǒng) kube-dns)

K8s 早期使用kube-dns作為 DNS 服務器,目前默認采用CoreDNS,因其更輕量、靈活且支持插件機制。

CoreDNS的安裝

如果使用kubeadm部署集群,CoreDNS 會自動部署在kube-system命名空間下,如果需要進行部署,可以使用下面的文件:

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  # 默認2個副本,確保高可用
  selector:
    matchLabels:
      k8s-app: kube-dns  # 歷史遺留標簽,兼容舊版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 服務,供集群內 Pod 訪問(默認 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  # 默認集群IP,Pod的nameserver配置指向此IP
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP
  • ConfigMap:存儲 Corefile 配置。
.:53 {                              #表示監(jiān)聽所有接口的 53 端口(DNS 標準端口)。
    errors                          # 記錄錯誤日志
    health {
        lameduck 5s                 # 健康檢查,延遲5秒標記不健康
    }
    ready                           # 提供 readiness 探針端點(/ready),指示 CoreDNS 是否準備好處理請求
    kubernetes cluster.local in-addr.arpa ip6.arpa {
        fallthrough in-addr.arpa ip6.arpa  # 未匹配到K8s服務時,透傳給下一個插件
        ttl 30                        # DNS記錄的TTL時間
    }
    prometheus :9153                # 暴露Prometheus監(jiān)控指標
    forward . /etc/resolv.conf      # 轉發(fā)外部域名查詢到宿主機的DNS服務器
    cache 30                        # 緩存查詢結果30秒
    loop                            # 檢測配置循環(huán)引用
    reload                          # 自動重新加載配置變更
    loadbalance                     # 對A/AAAA記錄進行負載均衡
}

CoreDNS的組成

  • CoreDNS Pod:運行 CoreDNS 服務,監(jiān)聽 DNS 請求(默認端口 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 暴露集群內部服務,名稱為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:集群的域名,默認為cluster.local

cluster-domain從哪兒獲?。?/h3>
[root@master ~]# grep clusterDomain /var/lib/kubelet/config.yaml 
clusterDomain: cluster.local

CoreDNS實戰(zhàn)案例

驗證同一個命名空間下的CoreDNS訪問

創(chuàng)建兩個Pod和Service

## 第一個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
# 第二個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

驗證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

驗證在不同命名空間下的DNS訪問

示例:

# 創(chuàng)建一個新的命名空間
[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進行驗證

[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

進行驗證

[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

到此這篇關于K8s集群中的DNS服務(CoreDNS)詳解的文章就介紹到這了,更多相關K8s DNS服務CoreDNS內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • 玩客云內置EMMC存儲刷入Armbian系統(tǒng)(圖文詳解)

    玩客云內置EMMC存儲刷入Armbian系統(tǒng)(圖文詳解)

    Armbian是其他項目可以信賴的單板計算機(SBC)的基本操作系統(tǒng)平臺,接下來通過本文給大家介紹玩客云內置EMMC存儲刷入Armbian系統(tǒng),需要的朋友可以參考下
    2022-05-05
  • k8s?pod始終處于pending狀態(tài)的解決方案

    k8s?pod始終處于pending狀態(tài)的解決方案

    新K8s部署后服務重啟導致dashboard無法訪問,所有Pod處于Pending狀態(tài),原因分析顯示,因節(jié)點污點引發(fā)調度失敗,刪除污點后問題解決,總結Pending原因分為三類:調度問題(污點、資源不足)、鏡像問題(拉取失?。⒁蕾囆詥栴}(卷/Secret/ConfigMap缺失)
    2025-08-08
  • k8s中topologyKey的作用及說明

    k8s中topologyKey的作用及說明

    topologyKey定義拓撲域,用于Pod親和/反親和性規(guī)則,調度器根據(jù)其分組節(jié)點,當前配置僅強制節(jié)點標簽匹配,未限制副本數(shù)量,建議補充podAntiAffinity實現(xiàn)隔離
    2025-08-08
  • 青龍面板拉庫解決沒有或丟失依賴can‘t?find?module的保姆級教程(附青龍面板腳本倉庫)

    青龍面板拉庫解決沒有或丟失依賴can‘t?find?module的保姆級教程(附青龍面板腳本倉庫)

    這篇文章主要介紹了青龍面板拉庫解決沒有或丟失依賴can‘t?find?module的保姆級教程(附青龍面板腳本倉庫),需要的朋友可以參考下
    2022-05-05
  • k8s自動化安裝腳本(二進制)的操作步驟

    k8s自動化安裝腳本(二進制)的操作步驟

    Kubernetes?k8s安裝腳本,非常好用,下面這篇文章主要給大家介紹了關于k8s自動化安裝腳本(二進制)的操作步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 云原生技術kubernetes調度單位pod的使用詳解

    云原生技術kubernetes調度單位pod的使用詳解

    這篇文章主要介紹了云原生技術kubernetes調度單位pod的使用詳解,幫助大家更好的理解和學習使用K8S,感興趣的朋友可以了解下
    2021-03-03
  • Kubernetes安裝Jenkins的思路詳解

    Kubernetes安裝Jenkins的思路詳解

    這篇文章主要介紹了Kubernetes安裝Jenkins,Jenkins插件可以在Kubernetes集群中運行動態(tài)jenkins-slave代理,基于Kubernetes的docker,自動化在Kubernetes中運行的Jenkins-slave代理的縮放,需要的朋友可以參考下
    2022-06-06
  • k8s強制刪除一個Pod的詳細步驟

    k8s強制刪除一個Pod的詳細步驟

    有時候遇到node宕機或者失聯(lián)太久導致pod一直處于Terminating狀態(tài),kubectl?delete又刪不掉,其實這個pod已經(jīng)確定已經(jīng)死了,需要強制把他摘掉,這篇文章主要給大家介紹了關于k8s強制刪除一個Pod的詳細步驟,需要的朋友可以參考下
    2024-11-11
  • Podman開機自啟容器實現(xiàn)過程及與Docker對比

    Podman開機自啟容器實現(xiàn)過程及與Docker對比

    這篇文章主要為大家介紹了Podman開機自啟容器實現(xiàn)過程,通過示例代碼的形式進行演繹過程,有需要的朋友可以參考下,希望可以有所幫助
    2021-09-09
  • k8s編排之StatefulSet知識點詳解二

    k8s編排之StatefulSet知識點詳解二

    這篇文章主要為大家介紹了k8s編排之StatefulSet知識點的部分詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論

五常市| 黑龙江省| 桐梓县| 吉林市| 金溪县| 布拖县| 独山县| 武冈市| 阜南县| 桦甸市| 辛集市| 九龙坡区| 宿松县| 舟山市| 个旧市| 峨边| 彭山县| 铁力市| 卢龙县| 南康市| 湄潭县| 明星| 巴南区| 马公市| 峡江县| 西平县| 环江| 博野县| 宁波市| 上饶县| 德化县| 双流县| 常宁市| 会同县| 济源市| 广德县| 通山县| 疏附县| 从江县| 正阳县| 奉新县|