https://blog.51cto.com/13641616/2442005
排錯背景:在一次生產環境的部署過程中,配置文件中配置的訪問地址為集群的Service,配置好后發現服務不能正常訪問,遂啟動了一個busybox進行測試,測試發現在busybox中,能通過coredns正常的解析到IP,然后去ping了一下service,發現不能ping通,ping clusterIP也不能ping通。
排錯經歷:首先排查了kube-proxy是否正常,發現啟動都是正常的,然后也重啟了,還是一樣ping不通,然后又排查了網絡插件,也重啟過flannel,依然沒有任何效果。后來想到自己的另一套k8s環境,是能正常ping通service的,就對比這兩套環境檢查配置,發現所有配置中只有kube-proxy的配置有一點差別,能ping通的環境kube-proxy使用了--proxy-mode=ipvs ,不能ping通的環境使用了默認模式(iptables)。
iptables沒有具體設備響應。
然后就是開始經過多次測試,添加--proxy-mode=ipvs 后,清空node上防火牆規則,重啟kube-proxy后就能正常的ping通了。
在學習K8S的時候,自己一直比較忽略底層流量轉發,也即IPVS和iptables的相關知識,認為不管哪種模式,只要能轉發訪問到pod就可以,不用太在意這些細節,以后還是得更加仔細才行。
補充:kubeadm 部署方式修改kube-proxy為 ipvs模式。
默認情況下,我們部署的kube-proxy通過查看日志,能看到如下信息:Flag proxy-mode="" unknown,assuming iptables proxy
這里我們需要修改kube-proxy的配置文件,添加mode 為ipvs。
ipvs模式需要注意的是要添加ip_vs相關模塊:
重啟kube-proxy 的pod
在pod重啟后再查看日志,發現模式已經變為ipvs了。
再次測試ping service