文章目录
一 总述
1 service 作用
POD 中运行的容器存在动态、弹性的变化(容器的重启IP地址会变化),因此便产生了service,其资源为此类POD对象提供一个固定、统一的访问接口及负载均衡能力,并借助DNS系统的服务发现功能,解决客户端发现容器难得问题
service 和POD 对象的IP地址在集群内部可达,但集群外部用户无法接入服务,解决的思路有:
1 在POD上做端口暴露(hostPort)
2 在工作节点上公用网络名称空间(hostNetwork)
3 使用service 的NodePort 或 loadbalancer (service 依赖于 DNS资源服务)
4 ingress七层负载均衡和反向代理资源
2 service资源及实现模型
1 service 概述
1 service是微服务的一种实现,事实上其是一种抽象:通过关注定义出多个POD对象组合而成的逻辑集合,以及访问这组POD的策略,service关联POD 需要标签选择器完成,其基于标签选择器将一组POD定义成一个逻辑集合,并通过自己的IP地址和端口调度代理请求至后端POD之上。
2 service 对象的IP地址称为cluster IP,位于K8S集群配置指定的专用IP地址范围内,其是一种虚拟IP地址,其在service对象创建后保持不变,并且能够被同一集群中的POD资源访问,service端口接受客户端的请求并将其转发至后端POD中的相应端口,因此,其又被称为四层代理,因其工作在TCP/IP层。
3 service 资源通过API server 持续监视标签选择器匹配到的后端POD对象,并实时跟踪各对象的变动,service并不直接连接POD对象,而是通过endpoints 资源对象类型处理,其有IP地址和端口组成,默认情况下,当创建service对象时,其关联的endpoints对象也会被自动创建。
2 虚拟IP和服务代理
1 虚拟IP
一个service对象就是工作节点上的一些iptables或ipvs,用于将到达service对象的IP地址的流量转发到相应的endpoint对象指定的IP地址和端口上,kube-proxy组件通过api-server持续监控着各个service及其相关的POD对象,并将其创建或变动实时反映到工作节点的iptable或ipvs上。
ipvs是借助于netfilter实现的网络请求报文调度框架,支持rr、wrr、lc、wlc、sh、sed和nq 等十余种调度算法,用户空间的命令行工具是ipvsadm,用于管理工作于ipvs上的调度规则。
service IP 事实上是用于生成iptables 或 ipvs 规则时使用的ip地址,仅用于实现K8S集群网络的内部通信,并能够通过规则中定义的转发服务请求作为目标地址予以响应,这也是其成为虚拟IP地址的原因。
2 代理模型
1 userspace 代理模型(用户空间模型)
userspace 是Linux操作系统的用户空间,这种模型中,kube-proxy 负责跟踪API server 上的endpoints对象的变动,并根据其进行相关的调整策略。
对于每个service对象,其都会随机打开一个本地端口,任何到达此端口的请求都会被代理到当前service资源的后端各个POD对象上,其默认使用RR调度策略。
其代理的过程是: 请求到达service后,其被转发到内核,经由套接字送往用户空间的kube-proxy,而后经由kube-proxy送回内核空间,并调度至后端POD,其传输方式效率太低。在1.1 版本之前,其是默认的转发策略。
2 iptables代理模型
kube-proxy 负责跟踪API server上 service和 endpoints对象的变动,并据此作出service资源定义的变动,对于每个service,都会创建iptabls规则直接捕获到达clusterIP 和PORT 的流量,并将其重定向到当前的service后端,默认算法是随机调度算法,POD 直接请求service IP 地址通过其直接访问对应的POD服务,在1.2开始成为默认类型,其使用的是iptables的目标地址转换至后端的POD对象,相对而言,其不用在内核和用户空间之间切换,因此更加高效,但其不能再被挑中的POD资源无响应时进行重定向,但用户空间(userspace)模型可以。
3 ipvs模型
此模型跟踪API service上的service和endpoints对象的变动,据此来调用netlink接口创建IPVS规则,并确保API server中的变动保持同步,其流量调度策略在IPVS中实现,其余的在iptables中实现。
ipvs 支持众多调度算法,如rr、lc、dh、sh、sed和nq 等。
二 service 资源基本应用
service 本身不提供服务,其是通过后端POD提供对应的服务,因此,service资源对象通常要和deployment完成应用的创建和对外发布。
1 创建service 资源
1 使用命令行创建service资源
创建POD资源
kubectl run nginx --image=nginx:1.14 --replicas=3
查看deployment资源
其名称为nginx
创建对应的service资源
kubectl expose deployment nginx --name=nginx --port=80 --target-port=80 --protocol=TCP
查看生成的service
查看生成的endpoints对应关系
node节点资源访问
2 使用配置文件创建service
#[root@master1 service]# cat demo.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: service-demo
namespace: default
spec:
selector: #用于匹配后面POD对象
matchLabels:
app: service
template:
metadata:
labels:
app: service
spec:
containers:
- name: service-demo
image: nginx:1.14
ports: # 配置暴露端口
- name: http
containerPort: 80
readinessProbe: #增加就绪性探测,用于探测服务是否正常运行,若未就绪则service不能向该POD上调度流量
httpGet: