解決:kubernetes 集群DNS配置及容器內CoreDNS解析外部域名配置問題


近期devops過程中發現在kubernetes 中啟動Jenkins master 執行job 啟動slave時 出現概率事件解析不到gitlab的域名。第一時間反射到的是dns問題,具體是DNS哪里的配置問題 慢慢刨根。

   

排查過程:

1.首先在kubernetes 集群中run起來一個容器busybox 嘗試解析gitlab的域名:

   

[root@k8s-1 libj]# kubectl delete -f dns-busybox.yaml

pod "busybox-a" deleted

[root@k8s-1 libj]#

[root@k8s-1 libj]#

[root@k8s-1 libj]#

[root@k8s-1 libj]# kubectl apply -f dns-busybox.yaml

pod/busybox-a created

[root@k8s-1 libj]#

[root@k8s-1 libj]#

[root@k8s-1 libj]#

[root@k8s-1 libj]# kubectl get pods |grep busybox

busybox-a 1/1 Running 0 10s

[root@k8s-1 libj]#
[root@k8s-1 libj]# kubectl exec -ti busybox-a -- nslookup gitlab.手動馬賽克.com

Server: 10.1.0.10

Address: 10.1.0.10:53

   

*** Can't find gitlab.手動馬賽克.com: No answer

   

*** Can't find gitlab.手動馬賽克.com: No answer

   

[root@k8s-1 libj]#  

發現無法解析。

2.然后開始查官方文檔:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/?spm=a2c6h.12873639.0.0.4e9e5cb0ph0Om9

  此官方文檔繁瑣的說明了兩件事,1.可以自己自定義配置coredns 的configmap文件 添加需要轉發and需要解析的主機地址;2.可以配置pod模版文件中單獨設置一個容器的dns設置。

   幾經波折,我們這里嘗試了配置cm文件的hosts

 

[root@k8s-1 libj]# cat coredns-cm.yaml
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        hosts {
           10.120.20.x gitlab.yourname.com
           fallthrough
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2019-09-18T06:24:26Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "44405526"
  selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
  uid: f81c618d-e6b0-4a4b-801d-04c8b840b6f7

 

  

 

   還嘗試配置了forward . Nameserver

 

[root@k8s-1 libj]# cat coredns-cm-10.96.1.\*.yaml
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . 10.96.1.18
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2019-09-18T06:24:26Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "44405526"
  selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
  uid: f81c618d-e6b0-4a4b-801d-04c8b840b6f7
[root@k8s-1 libj]#

 

 還嘗試配置了pod dnspolicy

 

[root@k8s-1 libj]# cat dns-busybox-default.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
  dnsPolicy: Default
[root@k8s-1 libj]#

 

  

 

  以上的各種嘗試配置都還有有幾率性問題,Dnspolicy 設置之后貌似立竿見影的好使了。但是我們覺得單獨設置Jenkins slave 不太現實。這里還有一個小配置插曲 是在Jenkins 的pod模版設置的時候有使用host network 選項打勾。也是可以解決這個解析的問題。

Jenkins pod template 這個地方打勾。

3.最后經過一頓操作 得出大致三種方法可以解決容器內解析外部DNS問題,,1配置kube-dns的configmap文件 添加host記錄 已到達解析目的,2.配置k8s服務器集群的resolv.conf 增加dns服務器,然后刷新k8s集群kube-dns 重建 ,已到達解析目錄,3,就是配置Jenkins pod模版使用hostnetwork,已達到解析目的 。

這里我們選擇了第二種方案,重整kubernetes集群內所有node節點nameserver配置然后重建kubernetes coredns。

檢查集群內部resolv.confg文件就不貼圖了。一定要保證集群內所有dns配置都一致。

下圖是獲取kubernetes 集群內 coredns容器,然后delete coredns pods。

   

等待kube-coredns重新拉起。

   

測試啟動pod ping gitlab域名正常。測試Jenkins執行job 全部通過正常。

   

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM