近期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]#
發現無法解析。
此官方文檔繁瑣的說明了兩件事,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 全部通過正常。