赞
踩
参考视频:https://ke.qq.com/user/index/index.html#/plan/cid=1709963&term_id=102815140
1.1.Service存在的意义
1.防止Pod失联(服务发现)
Service通过label-selector关联Pod
2.定义一组Pod的访问策略(4层负载均衡)
1.2.三种常用类型
默认方式,分配一个稳定的IP地址,即VIP,只能在集群内部访问
在每个节点启用一个端口来暴露服务,可以在集群外部访问,通过NodeIP:NodePort访问
端口范围:30000~32767
与NodePort类似,在每个节点启用一个端口来暴露服务。除此之外,K8s请求底层云平台的负载均衡器,把每个[Node IP]:[NodePort]作为后端添加进去
Service是由kube-proxy实现的
通过两种方式实现负载均衡规则,分别是iptables和IPVS
2.1.iptables模式
以web这个Service为例,关联了两个Pod
查看规则
iptables-save |grep web
MARK表示打标记,可以不用看
把访问30018的请求转发给KUBE-SVC-LOLE4ISW44XBNF3G
#NodePort转发规则
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/web" -m tcp --dport 30018 -j KUBE-SVC-LOLE4ISW44XBNF3G
iptables-save |grep KUBE-SVC-LOLE4ISW44XBNF3G
#ClusterIP转发规则,10.98.116.150为ClusterIP地址
-A KUBE-SERVICES -d 10.98.116.150/32 -p tcp -m comment --comment "default/web cluster IP" -m tcp --dport 80 -j KUBE-SVC-LOLE4ISW44XBNF3G
#Port转发规则
#0.50000000000表示该条规则被匹配的概率为50%,那么后面一条被匹配的概率为100%
-A KUBE-SVC-LOLE4ISW44XBNF3G -m comment --comment "default/web" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-WM2JAV2WVEC2WHK4
-A KUBE-SVC-LOLE4ISW44XBNF3G -m comment --comment "default/web" -j KUBE-SEP-WT22VOHQFMRGULTR
假设匹配到第一条规则,也即把请求转发给KUBE-SEP-WM2JAV2WVEC2WHK4
iptables-save |grep KUBE-SEP-WM2JAV2WVEC2WHK4
#转发到具体的Pod,10.244.235.234:80
-A KUBE-SEP-WM2JAV2WVEC2WHK4 -p tcp -m comment --comment "default/web" -m tcp -j DNAT --to-destination 10.244.235.234:80
实现流程
客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点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 #查看规则
2.3.Iptables VS IPVS
两者都是基于Netfilter实现的
Iptables灵活,功能强大;规则遍历匹配和更新,呈线性时延
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端口为Service的端口,用于集群内部访问;
targetPort为提供该服务的容器所暴露的端口,如果在yaml文件没有指定targetPort,则默认targetPort与port相同
3.3.3.在Pod里面,建议通过ServiceName.Namespace.svc.cluster.local访问
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。