目录
1、Service存在的意义:
service引入主要是解决pod的动态变化,提供统一的访问入口:
1、防止pod失联,准备找到提供同一服务的pod(服务发现)
2、定义一组Pod的访问策略(负载均衡)

即访问流程应该是

在前端访问后端时,如果直接绑定pod的ip,当pod进行更新时,pod的ip也会变化,前端无法动态的感知后端的变化。
同时,还面临多个pod副本如何对外统一访问的问题
这里,就需要用到前面的服务发现与负载均衡的概念,
2、Pod与Service的关系:
1、 Service通过标签关联一组Pod
2、Service为一组Pod提供负载均衡能力

通过
kubectl get ep
可以查看service与他绑定的pod

注意:service与pod绑定是标签绑定,所以标签一定要正确,查看pod标签的命令为
kubectl get pods --show-labels

在service中由selector绑定

一组pod可以定义多组service,deployment也是。他们都是独立的资源,没有依赖性
2.2,service多端口定义:
在实际场景中,可能出现一组pod内运行多容器,里面运行的端口可能是多端口,如图

加入这个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名,否则创建失败
创建成功,有两端口监听

3、Service常用的三种类型
service一共有三种类型,一般用户未配置时service会默认使用clusterIP

3.1 ClusterIP:
默认,分配一个稳定的IP地址,即VIP,只能在集群内部访问。
一般k8s集群中不同项目沟通一般使用clusterip


3.2 NodePort:
在每个节点上启用一个端口来暴露服务,可以在集群 外部访问。也会分配一个稳定内部集群IP地址。
访问地址:<任意NodeIP>: 默认NodePort端口范围:30000-32767
示例模块
spec:type: NodePortports:- port: 80protocol: TCPtargetPort: 80nodePort: 30009selector:app: web

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

访问node的ip加这个生成的端口,访问成功

同时,当用户不指定暴露后的端口,端口会随机生成,如上,但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

查看当前service服务
kubectl get svc

端口已被修改为指定端口

3.2 LoadBalancer:
LoadBalancer:与NodePort类似,在每个节点上启用一个端口来暴 露服务。除此之外,Kubernetes会请求底层云平台(例如阿里云、腾 讯云、AWS等)上的负载均衡器,将每个Node ([NodeIP]:[NodePort])作为后端添加进去。

更多推荐