文章目录
参考视频:https://ke.qq.com/user/index/index.html#/plan/cid=1709963&term_id=102815140
一、概念
1.1.Service存在的意义
1.防止Pod失联(服务发现)
2.定义一组Pod的访问策略(负载均衡)
1.2.三种常用类型
(1)ClusterIP(集群内部使用)
默认方式,分配一个稳定的IP地址,即VIP,只能在集群内部访问
(2)NodePort(对外暴露应用)
在每个节点启用一个端口来暴露服务,可以在集群外部访问,通过NodeIP:NodePort访问
(3)LoadBalancer(对外暴露应用,适用于公有云)
与NodePort类似,在每个节点启用一个端口来暴露服务。除此之外,K8s请求底层云平台的负载均衡器,把每个[Node IP]:[NodePort]作为后端添加进去
二、Service代理模式
Service是由kube-proxy实现的
通过两种方式实现负载均衡规则,分别是iptables和IPVS
2.1.iptables模式
查看规则
iptables-save |grep <Service Name>
实现流程
接受流量->概率分配请求->根据分配请求转发到实际Pod
2.2.IPVS模式【推荐使用】
2.2.1.修改代理模式为ipvs
加载ip_vs相关内核模块
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
设置模式为ipvs
kubectl edit configmaps kube-proxy -nkube-system
删除kube-proxy的Pod,使配置文件生效
kubectl delete pod kube-proxy-9lvgh -nkube-system
查看Pod日志可以看到已改为ipvs模式
ipvsadm -Ln #查看规则
三、示例
3.1.tomcat-service.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
type: NodePort
ports:
- port: 8080
name: service-port
nodePort: 31005
- port: 8005
name: shutdown-port
selector:
tier: frontend
kubectl apply -f tomcat-service.yaml
3.2.解释
定义了一个名为tomcat-service的Service,服务端口为8080和8005,采用NodePort的方式对外提供服务,拥有“tier=frontend”这个标签的所有Pod示例都属于它。
3.3.验证
kubectl get svc
tomcat-service分配了一个ClusterIP为10.1.9.124,该Service的虚端口为8080和8005,8080指定了nodePort端口为31005,而8005没有指定,K8S会随机分配一个端口给它。
3.3.1.集群内通过ClusterIP+虚端口可以访问服务
3.3.2.集群外通过NodeIP+nodePort端口可以访问Service服务
kubectl get endpoints
10.244.1.15为Pod的IP地址,端口8080是容器暴露的端口,可以通过PodIP+端口号访问
kubectl get svc tomcat-service -o yaml
可以看到Service更详细的信息,如名字、命名空间、clusterIP、虚端口
port端口为ClusterIP的端口,用于集群内部访问;
targetPort为提供该服务的容器所暴露的端口号,如果在yaml文件没有指定targetPort,则默认targetPort与port相同