Azure部署K8s网络问题

总结

最近公司需要在Azure上部署K8s集群(不是直接购买AKS,自己部署),部署过程中遇到了一些问题,最后发现都出在网络问题上,总结如下:
(1)Azure上不支持Calico网络插件,最终调整为Flannel;
(2)Azure上CoreDns无法访问宿主机DNS配置 (宿主机上/etc/resolv.conf含有自定义的nameserver),最终调整kube-system.configMap.coredns -> forward到自定义的nameserver

网络插件

最起初的现象就是运维配置了master ApiServer的NAT后,却无法通过链接:
https://{公网IP}:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
访问到K8s dashboard,并且浏览器中返回如下的提示:

Error: 'dial tcp xxx:8443: getsockopt: connection timed out'
Trying to reach: 'http://xxx:8443/'

仔细排查后发现xxx即为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也可以访问成功了。

DNS配置

本来以为一切都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…

猜你喜欢

转载自blog.csdn.net/luo15242208310/article/details/107838100