K8S核⼼概念之SVC(易混淆难理解知识点总结)
本⽂将结合实际⼯作当中遇到的⼀些问题和情况来解析SVC的作⽤以及⼀些⽐较易混淆和难理解的概念,⽅便⽇后⼯作⽤到或者遗忘时可以直接在⾃⼰曾经学习总结的博客当中直接查到。
⾸先应该清楚SVC的作⽤是什么,SVC主要有以下两个作⽤:
⼀、服务发现
现在⼯作当中都将微服务项⽬部署到K8S上,因为每个项⽬都是很多个服务的集合,每个服务⼀般⼜都是由很多个pod组成的,那么当请求想要访问这个服务的时候如何将请求能够很好地到这些POD并将请求分发给他们呢?
即使是同⼀组服务他们的pod是在集的不同位置的,Ip也就各不相同,SVC就可以有效地将同⼀组服务绑定在⼀起,也就是提供了⼀个统⼀的服务访问的⼊⼝,⽆论他们分发到哪个节点,也⽆论他们被分发了多少个不同的IP,SVC都可以做到将请求转发到这组服务的其中⼀个POD中进⾏处理,k8s在创建SVC时候,会根据标签选择器selector(Lable selector)来查pod,据此创建与SVC同名的endpoint对象,当pod 地址发⽣变化时,endpoint也会随之发⽣变化,SVC接收到前端client请求的时候,就会通过endpoint,到要转发到哪个Pod进⾏访问⽹站的地址。(⾄于要转发到哪个节点的Pod,由负载均衡kube-proxy起初就决定好了的)
这⾥⾯有⼏个点需要说明⼀下:
2.只有当service配置selector(选择器) ,endpoint controller才会⾃动创建对应的endpoint对象,否则,不会⽣成endpoint对象。
3.例:k8s集中创建⼀个名为hello的service,就会⽣成⼀个同名的endpoint对象,endpoint就是service关联的pod的ip地址和端
⼝。
⼆、负载均衡
因为每个SVC都是通过Label绑定微服务当中其中⼀个服务的⼀组POD,当外部或者集其他服务发来请求时,SVC会通过负载均衡,将请求分发到这⼀组POD当中的其中⼀个nodeselector
注:这⾥⾯要强调⼀下SVC是我们运维⼈员通过yaml⽂件或者是kubectl命令指定规则并创建的,⽽底层真正实现负载均衡和服务发现的是K8S中运⾏在每个NODE节点的kube-proxy组件。
那么SVC是如何通过kube-proxy组件来实现负载均衡和服务发现的呢?
kube-proxy⼯作原理
kube-proxy存在于各个node节点上,主要⽤于Service功能的实现(负载均衡和服务发现),具体来说,就是实现集内的客户端pod访问service,或者是集外的主机通过NodePort等⽅式访问service。在之前版本的k8s中,kube-proxy默认使⽤的是
iptables模式,通过各个node节点上的iptables规则来实现service的负载均衡,但是随着service数量的增⼤,iptables模式由于线性查匹配、全量更新等特点,其性能会显著下降。从k8s的1.8版本开始,kube-proxy引⼊了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是采⽤的hash表,因此当service数量达到⼀定规模时,hash查表的速度优势就会显现出来,从⽽提⾼service 的服务性能。
注:kube-proxy通过watch的⽅式监控着kube-APIServer写⼊etcd中关于Pod的最新状态信息,它⼀旦检查到⼀个Pod资源被删除了或新建,它将⽴即将这些变化,反应再iptables 或 ipvs规则中,以便iptables和ipvs在调度Clinet Pod请求到Server Pod时,不会出现Server Pod不存在的情况,如下图所⽰:
如何创建SVC
对集内部暴露服务的模式--Cluster
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
ports:
- port: 8000 #设定Serivce对集内部暴露的端⼝.
protocol: TCP
targetPort: 80 #设定Pod的端⼝,即Pod⽹络的端⼝。
selector:
app: my-dep
type: ClusterIP
对集外部暴露服务的模式--NodePort
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
ports:
- port: 8000 #设定Serivce对集内部暴露的端⼝.
protocol: TCP
targetPort: 80 #设定Pod的端⼝,即Pod⽹络的端⼝。
selector:
app: my-dep
type: NodePort
注:如果不在yaml⽂件当中指定NodePort端⼝,则NodePort是在Node节点上的30000-32767之间随机暴漏端⼝
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论