【十期/七章/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)
image.png

NodePort

(对外暴露应用)
在每个节点上启用一个端口(这个端口以30000起)来暴露服务,可以在集群外部访问。也会分配一个稳定内部集群IP地址。端口范围是 30000-32767
访问地址::
image.png

举例:

  1. # 创建一个yaml
  2. vim nodeport.yaml
  3. # 如下是yaml配置
  4. apiVersion: v1
  5. kind: Service
  6. metadata:
  7. labels:
  8. app: web
  9. name: web-2
  10. spec:
  11. ports:
  12. - port: 80
  13. protocol: TCP
  14. targetPort: 80
  15. selector:
  16. app: web
  17. type: NodePort
  18. # 创建该yaml
  19. kubectl apply -f nodeport.yaml
  20. # 查看service
  21. kubectl get svc

11.jpg
80:service内部通过clusterIP访问的端口
31170:Service集群外部访问的端口

更改NodePort端口

在yaml配置中添加nodePort:xxxxx参数,并kubectl apply -f xxx.yaml重新应用
{3B8677B5-DFE2-4339-A7BB-E01A0CA5D0AE}_20200522111237.jpg

LoadBalancer

与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。
所有通往指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。这个方式的最大缺点是每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费。

LoadBalancer访问流程:

user -> 域名(公网IP) -> 公有云上的负载均衡器(自动配置,控制器去完成) -> NodeIP:Port

Service代理模式

2213.jpg

                             ![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 记录格式:..svc.cluster.local
示例:my-svc.my-namespace.svc.cluster.local
666.jpg