Kubernetes服务发现之ClusterIP

栏目: 编程工具 · 发布时间: 5年前

内容简介:在Kubernetes中服务发现主要通过每个主机上的kube-proxy组件实现,其作用是通过控制iptables将对Service ClusterIP的请求,转发到后端Endpoints中,剩下就交给容器网络。以default命名空间下的nginx svc为例:

《Flannel网络以及在阿里云下的实现解析》 中说过在Kubernetes中网络中,主要包含两种IP,分别是Pod IP和Cluster IP。 Pod IP是实际存在于网卡之上(如VETH的虚拟网卡),而Cluster IP则是一个虚拟的IP地址,该虚拟机IP由kube-proxy进行维护,kube-proxy目前提供了两种实现方式,包括默认的ip tables实现以及在K8S 1.8之后开始支持的ipvs实现。文章中以阿里云Kubernetes集群为例,从Pod IP的角度介绍了Pod和Pod之间是如何通讯的。这篇文章,笔者将解释基于ClusterIP的服务发现是个什么鬼。

基于ClusterIP的服务发现

Kubernetes中服务发现主要通过每个主机上的kube-proxy组件实现,其作用是通过控制iptables将对Service ClusterIP的请求,转发到后端Endpoints中,剩下就交给容器网络。

以default命名空间下的nginx svc为例:

$ kubectl get svc --selector app=nginx
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx     ClusterIP   172.19.0.166   <none>        80/TCP    1m

查看Service详情:

$ kubectl describe svc nginx
Name:              nginx
Namespace:         default
Labels:            app=nginx
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP:                172.19.0.166
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         172.16.2.125:80,172.16.2.229:80
Session Affinity:  None
Events:            <none>

上述信息中可以看出该svc的ClusterIP为172.19.0.166,后端代理了2个Pod实例:172.16.2.125:80,172.16.2.229:80

在任意Node节点中找到flannel实例,查看iptables信息:

$ k -n kube-system exec -it kube-flannel-ds-hjlb4 -c kube-flannel -- iptables -S -t nat
# 省略输出
-A KUBE-SERVICES -d 39.96.133.156/32 -p tcp -m comment --comment "default/wrinkled-crocodile-selenium-hub:hub loadbalancer IP" -m tcp --dport 4444 -j KUBE-FW-SI6MMWWVN6LUBWIY
-A KUBE-SERVICES ! -s 172.16.0.0/16 -d 172.19.15.240/32 -p tcp -m comment --comment "default/nginx: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 172.19.15.240/32 -p tcp -m comment --comment "default/nginx: cluster IP" -m tcp --dport 80 -j KUBE-SVC-4N57TFCL4MD7ZTDA
# 省略出书

根据路由转发规则,从Pod访问ClusterIP 172.19.0.166的80端口的请求,匹配到转发规则:

-A KUBE-SERVICES ! -s 172.16.0.0/16 -d 172.19.0.166/32 -p tcp -m comment --comment "default/nginx: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 172.19.0.166/32 -p tcp -m comment --comment "default/nginx: cluster IP" -m tcp --dport 80 -j KUBE-SVC-4N57TFCL4MD7ZTDA

直接跳转到KUBE-SVC-4N57TFCL4MD7ZTDA:

-A KUBE-SVC-4N57TFCL4MD7ZTDA -m comment --comment "default/nginx:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-ZWDBLNQ3XRBMUP33
-A KUBE-SVC-4N57TFCL4MD7ZTDA -m comment --comment "default/nginx:" -j KUBE-SEP-H2XFNPZ6MLIHFOVM

通过iptables的–probability的特性,使连接有50%的概率进入到KUBE-SEP-ZWDBLNQ3XRBMUP33,KUBE-SEP-H2XFNPZ6MLIHFOVM的作用是把请求转发到172.16.2.125:80:

-A KUBE-SEP-ZWDBLNQ3XRBMUP33 -s 172.16.2.125/32 -m comment --comment "default/nginx:" -j KUBE-MARK-MASQ
-A KUBE-SEP-ZWDBLNQ3XRBMUP33 -p tcp -m comment --comment "default/nginx:" -m tcp -j DNAT --to-destination 172.16.2.125:80

另外50%的请求,则可能进入到KUBE-SEP-QKRDMLY5MWSFYSJG,同理,该规则的作用是把请求转发到172.16.2.229:80:

-A KUBE-SEP-H2XFNPZ6MLIHFOVM -s 172.16.2.229/32 -m comment --comment "default/nginx:" -j KUBE-MARK-MASQ
-A KUBE-SEP-H2XFNPZ6MLIHFOVM -p tcp -m comment --comment "default/nginx:" -m tcp -j DNAT --to-destination 172.16.2.229:80

Kubernetes通过iptables规则,将对ClusterIP的访问,负载到后端的PodID,剩下的事情,就是在文章 《Flannel网络以及在阿里云下的实现解析》 介绍的部分了


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人类2.0

人类2.0

皮埃罗∙斯加鲁菲(Piero Scaruffi) / 闫景立、牛金霞 / 中信出版集团股份有限公司 / 2017-2-1 / CNY 68.00

《人类2.0:在硅谷探索科技未来》从在众多新技术中选择了他认为最有潜力塑造科技乃至人类未来的新技术进行详述,其中涉及大数据、物联网、人工智能、纳米科技、虚拟现实、生物技术、社交媒体、区块链、太空探索和3D打印。皮埃罗用一名硅谷工程师的严谨和一名历史文化学者的哲学视角,不仅在书中勾勒出这些新技术的未来演变方向和面貌,还对它们对社会和人性的影响进行了深入思考。 为了补充和佐证其观点,《人类2.0......一起来看看 《人类2.0》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具