kubernetes kube-proxy原理

时隔多年,又开始玩csdn。



k8s中的service是个虚拟概念,完全靠kube-proxy实现


每创建一个service,需要定义三个变量:clusterIP   port    targetPort   nodePort

其中:

clusterIP + port是内部pod访问service用的,随即分配

targetPort是容器的port

nodePort是外部访问service对应的后端pod用的,任何以节点的nodePort都可以访问到;




Userspace模式:

创建服务时:

1)api-server创建service对象,与service绑定的pod地址:称之为endpoints

2)每个节点上的kube-proxy从 api-server中获取到service,创建一个tcpsocketserver_for_serviceA,该服务使用随即端口

3)tcpsocketserver_for_serviceA,实时从apiservice中,获取endpoint的更新,任何对该服务的访问,都会被转发到后端pod中;



访问服务时:

内部pod访问cluster时: 自动被kube-proxy自动创建好的iptables规则,重定向到 tcpsocketserver_for_serviceA,该服务通过round算法转发到后端pod上

外部访问nodeIP+ nodePort时:自动被kube-proxy自动创建好的iptables规则,重定向到 tcpsocketserver_for_serviceA,该服务通过round算法转发到后端pod上


$ sudo iptables -S -t nat
...
-A KUBE-NODEPORT-CONTAINER -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 30239 -j REDIRECT --to-ports 36463
-A KUBE-NODEPORT-HOST -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 30239 -j DNAT --to-destination 10.0.0.5:36463
-A KUBE-PORTALS-CONTAINER -d 10.254.132.107/32 -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 2222 -j REDIRECT --to-ports 36463
-A KUBE-PORTALS-HOST -d 10.254.132.107/32 -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.5:36463



iptables模式:

创建服务时:

kuberpeoxy会在每个节点上创建好iptables规则


访问服务时:

直接被iptables规则重定向;(iptables   probability可以实现负责均衡)


你可能感兴趣的:(虚拟化技术)