参考视频: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.三种常用类型

(1)ClusterIP(集群内部使用)

默认方式,分配一个稳定的IP地址,即VIP,只能在集群内部访问

(2)NodePort(对外暴露应用)

在每个节点启用一个端口来暴露服务,可以在集群外部访问,通过NodeIP:NodePort访问

端口范围:30000~32767

(3)LoadBalancer(对外暴露应用,适用于公有云)

与NodePort类似,在每个节点启用一个端口来暴露服务。除此之外,K8s请求底层云平台的负载均衡器,把每个[Node IP]:[NodePort]作为后端添加进去

二、Service代理模式

在这里插入图片描述
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

Iptables灵活,功能强大;规则遍历匹配和更新,呈线性时延

IPVS

  • IPVS工作在内核态,有更好的性能;调度算法丰富:rr,wrr,lc,wlc,ip hash…
  • 支持服务器健康检查和连接重试等功能
  • 专门用于高性能负载均衡,使用更高效的数据结构(Hash表),允许几乎无限的规模扩张。
  • 使用iptables的扩展ipset,ipset引入了带索引的数据结构,当规则很多时,也可以很高效地查找和匹配

三、示例

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访问

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐