一場糾結,事關Microk8s,Alpine和kubedns

事情開始的很簡單,並沒有顯露出日後猙獰的面孔。

我試圖創建一個k8s的環境,用於測試和學習,選項不多:

鬼才知道我爲啥選擇了Microk8s,不過後來的事實證明,選Kind,路途也不會平坦,但比起Miicrok8s,就是坦途了。

 

Microk8s安裝非常簡單,除了microk8s.kubectl需要用snap(https://tutorials.ubuntu.com/tutorial/basic-snap-usage#0)做個轉換。

但很快發現了問題,我用於測試的Tekton-pipeline(https://github.com/tektoncd/pipeline)的例子死活跑不通,一直在保無法解析github.com, 這就奇怪了,難道k8s cluster中沒有dns?一看還真是!

問題一:

Microk8s默認不啓動kubedns,需要使用microk8s.enable dns, kubedns纔會啓動。

好吧,但是啓動以後仍然不能解析,首先用kubectl exec登入不能工作的pod container, 使用ping 8.8.8.8(機器在牆外),是通的但是ping google.com得到的是bad address 'google.com', 看來是DNS的問題了。

cat /etc/resolv.conf

nameserver 100.64.0.10
search namespace.svc.cluster.local svc.cluster.local cluster.local eu-west-1.compute.internal
options ndots:5

大概是這樣, nameserver所配置的ip是我kubedns的service,沒有問題。

search domain開起來也還好

options ndots:引起了我的懷疑, 查了查(https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html):

這個設置表示被解析的hostname中的點(.)數目如果超過該值,那麼就直接解析該hostname,否則,解析hostname.${search domain}, 舉個例子www.google.com, 因爲點(.)的數目是2 < 5, 那麼會依次嘗試解析:

www.google.com.namespace.svc.cluster.local

www.google.com..svc.cluster.local

www.googl.com.cluster.local

www.google.com.en-west-1.computer.internal

www.google.com

這裏就非常想知道直接解析www.google.com是什麼結果,很簡單,刪掉options ndots:5 這個選項。結果是,通的!

接着開始懷疑是container鏡像的問題,爲了簡化問題,拋棄了tekton,徒手創建了一個image是alpine的pod,發現同樣的問題。

接着使用busybox做鏡像,神奇的是沒有問題,然後又換爲ubuntu,也沒問題,難道問題真處在alpine身上。

好吧,趕緊又找了一個k8s cluster,非Microk8s,神奇的事情繼續發生,alpine和其他測試鏡像都是OK的!

這使我陷入了沉思,難道得Microk8s背這個鍋?

事情沒那麼簡單,既然是DNS處的錯,會不會問題在kubedns上呢?

趕緊查了查Microk8s的kubedns的鏡像,呵呵,alpine,再查查那個正常cluster的kubedns,也是alpine,事情又陷入僵局。

找了找google,哈,還真是得alpine背:

https://github.com/kubernetes/kubernetes/issues/30215

https://github.com/gliderlabs/docker-alpine/issues/8

https://seanj.dev/post/alpine-kubernetes-dns/

https://github.com/gliderlabs/docker-alpine/issues/255

https://forums.docker.com/t/resolved-service-name-resolution-broken-on-alpine-and-docker-1-11-1-cs1/19307

什麼叫做罄竹難書,這個問題從alpine3.3開始一直到現在都沒解決,最後逼得有人發出警告,在k8s中請謹慎使用alpine。

可是alpine爲啥不fix呢,原來這個問題來自musl libc(https://www.musl-libc.org/intro.html

https://github.com/rancher/rancher/issues/5041
https://bugs.alpinelinux.org/issues/9017

怎麼說呢,鍋還是要有人被的,火速去Microk8s開了個issue:

https://github.com/ubuntu/microk8s/issues/493

怎麼說呢,最後用以爲無奈的程序員的打油詩結尾:

https://www.reddit.com/r/homelab/comments/5i6kza/a_haiku_about_dns/?st=j6vq0tcs&sh=f8e9032c

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章