目录
1、Service存在的意义:
service引入主要是解决pod的动态变化,提供统一的访问入口:
1、防止pod失联,准备找到提供同一服务的pod(服务发现)
2、定义一组Pod的访问策略(负载均衡)
![](https://img-blog.csdnimg.cn/b2bb8796704249fd8505860ba2dbe88f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_14,color_FFFFFF,t_70,g_se,x_16)
即访问流程应该是
![](https://img-blog.csdnimg.cn/6aa59a94d25e4dc1a46e40078fb30c52.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
在前端访问后端时,如果直接绑定pod的ip,当pod进行更新时,pod的ip也会变化,前端无法动态的感知后端的变化。
同时,还面临多个pod副本如何对外统一访问的问题
这里,就需要用到前面的服务发现与负载均衡的概念,
2、Pod与Service的关系:
1、 Service通过标签关联一组Pod
2、Service为一组Pod提供负载均衡能力
![](https://img-blog.csdnimg.cn/51fd2cd6225e40f38742ccec8be4e583.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_18,color_FFFFFF,t_70,g_se,x_16)
通过
kubectl get ep
可以查看service与他绑定的pod
![](https://img-blog.csdnimg.cn/669ec62e081f4f4fa3313fb31c4e8205.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_11,color_FFFFFF,t_70,g_se,x_16)
注意:service与pod绑定是标签绑定,所以标签一定要正确,查看pod标签的命令为
kubectl get pods --show-labels
![](https://img-blog.csdnimg.cn/e9434ad8804f4b728fb99d33447192a4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
在service中由selector绑定
![](https://img-blog.csdnimg.cn/a3181344a5174cddbde51a9f8cd65eaf.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
一组pod可以定义多组service,deployment也是。他们都是独立的资源,没有依赖性
2.2,service多端口定义:
在实际场景中,可能出现一组pod内运行多容器,里面运行的端口可能是多端口,如图
![](https://img-blog.csdnimg.cn/3a6c087a255b4580bf7ef32fea6ba629.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_16,color_FFFFFF,t_70,g_se,x_16)
加入这个pod中有两个端口需要访问,一个80一个12345.这时候就需要使用到service的多端口功能
示例yaml
apiVersion: v1kind: Servicemetadata:creationTimestamp: nulllabels:app: nginxname: web2spec:ports:- port: 80name: httpprotocol: TCPtargetPort: 80- port: 12345name: metricsprotocol: TCPtargetPort: 12345selector:app: nginx
与单端口service 不同,多端口的service每个端口要有name名,否则创建失败
创建成功,有两端口监听
![](https://img-blog.csdnimg.cn/7b8ab30add63462292d5359679ff4e7f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
3、Service常用的三种类型
service一共有三种类型,一般用户未配置时service会默认使用clusterIP
![](https://img-blog.csdnimg.cn/ceffc8e540b949308259c7921b0e9fba.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_17,color_FFFFFF,t_70,g_se,x_16)
3.1 ClusterIP:
默认,分配一个稳定的IP地址,即VIP,只能在集群内部访问。
一般k8s集群中不同项目沟通一般使用clusterip
![](https://img-blog.csdnimg.cn/2d3eb6b73f7a46a185805d495894ce9e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_14,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/6c65f7323c7f43c3985f05c0a17ffe38.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_18,color_FFFFFF,t_70,g_se,x_16)
3.2 NodePort:
在每个节点上启用一个端口来暴露服务,可以在集群 外部访问。也会分配一个稳定内部集群IP地址。
访问地址:<任意NodeIP>: 默认NodePort端口范围:30000-32767
示例模块
spec:type: NodePortports:- port: 80protocol: TCPtargetPort: 80nodePort: 30009selector:app: web
![](https://img-blog.csdnimg.cn/f34fe069e1024db08553308005f26a82.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_17,color_FFFFFF,t_70,g_se,x_16)
nodeport演示
创建service的yaml,绑定已经运行的pod
vi service-nodeportapiVersion: v1kind: Servicemetadata:labels:app: nginxname: web3spec:type: NodePortports:- port: 80protocol: TCPtargetPort: 80selector:app: nginx
执行yaml
kubectl apply -f service-nodeport
查看k8s的svc,可以看见端口已经暴露
kubectl get svc
![](https://img-blog.csdnimg.cn/80a31a00a8984c95a7017639d2ecea2c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
访问node的ip加这个生成的端口,访问成功
![](https://img-blog.csdnimg.cn/6546d0f4a82f4efeb11ecf67a25b8a6e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
同时,当用户不指定暴露后的端口,端口会随机生成,如上,但nodeport支持用户指定生成的端口
修改yaml
vi service-nodeportyaml
加入指定端口(
注意,填写端口范围为30000-32767)
apiVersion: v1kind: Servicemetadata:labels:app: nginxname: web3spec:type: NodePortports:- port: 80protocol: TCPtargetPort: 80nodePort: 30002selector:app: nginx
更新yaml
kubectl apply -f service-nodeport.yaml
![](https://img-blog.csdnimg.cn/0e4346fb90724fa89966a2c134736f74.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_18,color_FFFFFF,t_70,g_se,x_16)
查看当前service服务
kubectl get svc
![](https://img-blog.csdnimg.cn/b0fc7cf4dd6f4effaefe9d428bd5515c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
端口已被修改为指定端口
![](https://img-blog.csdnimg.cn/e7ca080f81364e37b8f7c1efeaf37128.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
3.2 LoadBalancer:
LoadBalancer:与NodePort类似,在每个节点上启用一个端口来暴 露服务。除此之外,Kubernetes会请求底层云平台(例如阿里云、腾 讯云、AWS等)上的负载均衡器,将每个Node ([NodeIP]:[NodePort])作为后端添加进去。
![](https://img-blog.csdnimg.cn/228badf2802c4ea5b7e13e2974698eca.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_16,color_FFFFFF,t_70,g_se,x_16)