之前的文章<<Kubernetes网络和CNI>>和<<Kubernetes flannel网络分析>>介绍了Kubernetes集群的pod
网络的通信过程。
pod
本质上非固定的,经常发生变化,而pod IP
在pod
销毁和创建的时候会发生变更,因而不能直接对外提供服务。Kubernetes
通过service
资源来对外提供服务,service
的IP
是固定的,它自动绑定一组pod
并根据不同实现将流量转发到这些pod
中, 并在流量转发的过程中实现负载均衡(load balance)。
在Kubernetes
的node
节点上的主要组件有kube-proxy
和kubelet
, kubelet
会调用相关的CNI
实现完成POD
网络的通信。而kube-proxy
则负责上述的service
与POD
之间的流量转发。实际上,在之前文章的实验环境里,即使把node
节点上的kube-proxy
组件都停止,也不会影响pod
网络通信。
service
本质就是将一组pod
通过固定IP
暴露给使用者,可以由ip:port:protocol
来标识。
service
主要以下几种类型:
ClusterIP
: 用Kubernetes
集群内部IP
暴露服务,也就是说只有在Kubernetes
集群内才可以访问这个service
。这是默认的service
类型。ClusterIP
的范围是在kube-apiserver
启动时通过-service-cluster-ip-range
参数指定的。这些IP
只能在kubernetes
集群内进行访问。service
的相关信息是在yaml
文件中定义的,最终暴露的信息可表示为:1
spec.clusterIp:spec.ports[*].port:spec.ports[*].protocol
NodePort
: 在Kubernetes
集群的所有node
节点上使用相同的固定port
来暴露服务。这种类型会自动创建ClusterIP
类型的服务,NodePort
的service
会将流量转发到ClusterIP
类型的服务。服务的使用者可以使用NodeIP:NodePort
来访问该服务。这种类型服务暴露的信息可以表示为:1
2<NodeIP>:spec.ports[*].nodePort:spec.ports[*].protocol
spec.clusterIp:spec.ports[*].port:spec.ports[*].protocolLoadBalancer
: 是通过kubernetes
集群外部设施所提供的IP
来暴露服务。NodePort
和ClusterIP
类型的服务会被自动创建。不同的LoadBalancer
负责实现外部IP:port
与NodePort
服务的映射。这种类型暴露的信息可以表示为:1
2
3spec.loadBalancerIp:spec.ports[*].port:spec.ports[*].protocol
<NodeIP>:spec.ports[*].nodePort:spec.ports[*].protocol
spec.clusterIp:spec.ports[*].port:spec.ports[*].protocol