时隔多年,又开始玩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可以实现负责均衡)