1.service概念
service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。
kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。
举个例子,现在有podA,podB,podC和serviceAB。serviceAB是podA,podB的服务抽象(service)。
那么kube-proxy的作用就是可以将pod(不管是podA,podB或者podC)向serviceAB的请求,进行转发到service所代表的一个具体pod(podA或者podB)上。
请求的分配方法一般分配是采用轮询方法进行分配。
2.暴露node端口与service访问
另外,kubernetes还提供了一种在node节点上暴露一个端口,从而提供从外部访问service的方式。
比如我们使用这样的一个manifest来创建service
apiVersion: v1
kind: Service
metadata:
labels:
name: mysql
role: service
name: mysql-service
spec:
ports:
- port: 3306
targetPort: 3306
nodePort: 30964
type: NodePort
selector:
mysql-service: "true"
含义是在node上暴露出30964端口。当访问node上的30964端口时,其请求会转发到service对应的cluster IP的3306端口,并进一步转发到pod的3306端口。
3.kube-proxy实现方式
kuer-proxy目前有userspace和iptables两种实现方式。
(1) userspace是在用户空间,通过kuber-proxy实现LB的代理服务。这个是kube-proxy的最初的版本,较为稳定,但是效率也自然不太高。
(2) iptables的方式。是纯采用iptables来实现LB。是目前一般kube默认的方式
4.service 和 ep(endpoint)是如何关联和相互影响的
(1) api-server创建service对象,与service绑定的pod地址:称之为endpoints
(2) 服务发现方面:kube-proxy监控service后端endpoint的动态变化,并且维护service和endpoint的映射关系