什么是service
k8s中的服务发现和负载均衡。通俗的说就是映射一个虚拟IP(VIP)到指定的端口,通过代理客户端发来的请求会转发到后端一组Pods中的一台(也就是endpoint)上。为什么不直接访问pod端口呢?之前了解到,pod一般不单独存在,通过deployment管理pod生命周期,在pod销毁重建后ip和hostname都会改变,所以一般不直接访问pod服务,通过service vip做代理将客户端请求转发到pod。
service的实现方式
kube-proxy
那service的请求转发是怎么实现的呢,通过kube-proxy组件实现。kube-proxy运行在每个node上,通过watch监听API Server 中service资源的create,update,delete事件,以获取新的Pod 和 vip映射关系,然后通过更新 iptables 规则来实现请求数据的转发,构建并维护各节点路由信息。
在k8s更新过程中,kube-proxy有三种实现模式:User space proxy mode,iptables proxy mode和IPVS proxy mode。
在详细了解kube-porxy前,先看下service的配置文件,这里面定义了转发涉及到的了3个port,对外的service port(port),中间转发的node port(nodePort)和提供服务的pod port(targetPort)。
# cat service-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: mynginx
namespace: default
spec:
selector:
app: mynginx
clusterIP: 10.10.98.98 # service ip
type: NodePort # service 类型
ports:
- port: 80 # service端口
targetPort: 8000 # pod端口
nodePort: 30080 # node端口
用户空间代理模式(不推荐使用)
版本:k8s 1.1+
在这一版本,对于每个服务请求,kube-proxy的代理方式实现如下:
- kube-proxy监听API Server 已添加和删除service和Endpoint对象,获取映射关系。
- 在本地节点上打开一个随机端口(nodePort),访问该随机