【十期/七章/1:55】
1、Service存在的意义
2、Pod与Service的关系
3、Service三种类型
4、Service代理模式
5、Service DNS名称
**
Service存在的意义
- 服务发现(防止Pod失联)
- 负载均衡(定义一组Pod的访问策略)
- 因为 K8S 里面 Pod是可以被调度,并且重建的,所以没有固定 IP
- POD 的数量不止一个,当有多个 Pod实例时有负载均衡的需求
Pod与Service的关系
- 通过label-selector相关联
- 通过Service实现Pod的负载均衡(TCP/UDP 4层)
- Service只支持四层负载均衡
四层:OSI的传输层,只负责IP数据包转发,使用IP+Port接受请求,再转发到相应的机器。对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
七层:OSI的应用层,根据虚拟的url或IP,主机名接收请求,再转发到相应的处理服务器。比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
Service三种类型
- ClusterIP:集群内部使用(若不指定类型,默认为ClusterIP)
- NodePort:对外暴露应用
- LoadBalancer:对外暴露应用,适用公有云
NodePort与LoadBalancer的区别
ClusterIP
(集群内部使用)
默认分配一个稳定的IP地址,即VIP,只能再集群内部直接访问(同Namespace内的pod)
NodePort
(对外暴露应用)
在每个节点上启用一个端口(这个端口以30000起)来暴露服务,可以在集群外部访问。也会分配一个稳定内部集群IP地址。端口范围是 30000-32767
访问地址:
举例:
# 创建一个yaml
vim nodeport.yaml
# 如下是yaml配置
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web-2
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort
# 创建该yaml
kubectl apply -f nodeport.yaml
# 查看service
kubectl get svc
80:service内部通过clusterIP访问的端口
31170:Service集群外部访问的端口
更改NodePort端口
在yaml配置中添加nodePort:xxxxx参数,并kubectl apply -f xxx.yaml重新应用
LoadBalancer
与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。
所有通往指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。这个方式的最大缺点是每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费。
LoadBalancer访问流程:
user -> 域名(公网IP) -> 公有云上的负载均衡器(自动配置,控制器去完成) -> NodeIP:Port
Service代理模式
![56.jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/1189031/1590040972640-5944d64f-dc1e-473e-8123-d7e7c369db3d.jpeg#align=left&display=inline&height=309&margin=%5Bobject%20Object%5D&name=56.jpg&originHeight=617&originWidth=844&size=53397&status=done&style=shadow&width=422)
Service DNS名称
DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。
在Kubernetes集群推荐使用Service Name作为服务的访问地址,因此需要一个Kubernetes集群范围的DNS服务发现,从Service Name到Cluster IP的解析,这就是Kubernetes基于DNS的服务发现功能。
Coredns:k8s内部提供DNS解析服务。CoreDNS在Kubernetes1.11版本已经做为GA功能释放,成为Kubernetes默认的DNS服务替代了Kube-dns。
ClusterIP 记录格式:
示例:my-svc.my-namespace.svc.cluster.local