Azure部署K8s網路問題

2021-10-23 09:55:37 字數 2442 閱讀 9325

最近公司需要在azure上部署k8s集群(不是直接購買aks,自己部署),部署過程中遇到了一些問題,最後發現都出在網路問題上,總結如下:

(1)azure上不支援calico網路外掛程式,最終調整為flannel;

(2)azure上coredns無法訪問宿主機dns配置(宿主機上/etc/resolv.conf含有自定義的nameserver),最終調整kube-system.configmap.coredns -> forward到自定義的nameserver

仔細排查後發現***即為k8s集群中的pod kubernetes-dashboard的podip,即如下網路不通:

瀏覽器 -> lb -> k8s master上的apiserver程序 -> 跨node中的podip

經過進一步排查,最終發現問題出在 k8s master上的apiserver程序 -> 跨node中的podip,即k8s master節點無法ping通其他節點上的podip。

在查閱了calico官方文件後about calico on azure,發現了azure不支援calico網路外掛程式的說明:

其後也檢視了一些azure的相關文件:

azure文件:為 kubernetes 群集部署外掛程式

azure支援自家的azure-vnet-cni網路外掛程式,但是配置前還得為每個虛擬機器上預分配虛擬網路 ip 位址池,ip 位址從中分配給 pod,不知道要幹啥,實在是讀不懂。

最終決定切換網路模型,選用了flannel,把k8s集群重新裝了一遍,之後在master節點上直接ping podip,可以訪問到,如此k8s dashboard也可以訪問成功了。

本來以為一切都ok了,但是後續運維在發布服務的時候,發現k8s pod中的服務無法訪問到自定義的網域名稱(如公司網域名稱字尾形式: xx.mycompany.com),通常在集群中我們都會部署自己的dns伺服器,然後將集群中主機節點的dns指到我們自己的dns伺服器,即設定/etc/resolv.conf中的nameserver指向自己的dns伺服器,而之前在其他環境(華為雲、阿里雲)中k8s中pod是可以直接訪問到我們自己的dns伺服器的,即可以訪問到我們自定義的網域名稱的,但是在azure上卻失敗了。

於是研究了下k8s的dns機制,如下圖所示:

(1)k8s集群中存在dns服務kube-dns,該服務指向後端的coredns pod;

(2)k8s集群中的所有pod內都設定nameserver指向kube-dns服務;

即k8s中的pod是通過coredns進行dns查詢的;

(3)k8s集群中coredns的配置是掛載到configmap.coredns中的,即可以通過修改該configmap即可調整coredns相關配置;

關於coredns相關說明,可參見:coredns manual

通過以上配置可以看到,預設所有網域名稱(.)的預設dns解析(:53)都會先有coredns解析k8s網段內的網域名稱,其他網域名稱都會foward到coredns容器內的./etc/resolv.conf來進行解析,而在azure上pod內的resolv.conf和宿主機不一樣,所以導致coredns內解析不到我們自定義的網域名稱。

最後查閱coredns官方文件,發現可以將forward直接指向我們自定義的dns伺服器ip(預設53埠)即可,則coredns可將k8s網段外的網域名稱解析直接轉到forward所指向的自搭建dns伺服器,修改配置如下:

修改完後,就可以在pod中訪問我們自定義的網域名稱了。

話外

azure aks也不香,買完服務連個vm都看不到,且作為乙個整體服務**的,省事是省事,但是沒有自建k8s靈活度高,運維兄弟說永遠不想再用azure…

K8s部署prometheus監控K8s細節

prometheus 一些配置檔案可以再github上找到。部署 root kube prometheus manifests 目錄下所有檔案 部署 root kube prometheus manifests setup 目錄下所有檔案 要注意的是自己要建立乙個工作空間 如果報錯執行下面語句 部署...

k8s集群部署 docker部署k8s安裝篇

1 安裝docker 緊接著配置乙個穩定 stable 的倉庫 倉庫配置會儲存到 etc yum.repos.d docker ce.repo檔案中 yum config manager add repo 更新yum安裝的相關docke軟體包 安裝docker ce yum update y yum...

單機部署k8s

安裝docker ce systemctl enable docker systemctl start docker 修改cgroup driver 為systemd 預設為cgroups echo kubelet kubeadm extra args cgroup driver systemd e...