一、kubernetes暴露服务模式介绍。
Kubernetes暴露服务的方式有3种,分别为
- LoadBlancer Service
LoadBlancer Service 是 kubernetes 深度结合云平台,使用 LoadBlancer Service 暴露服务时,实际上是通过向底层云平台申请创建一个负载均衡器来向外暴露服务。支持的云平台还是很广泛的,例如GCE、DigitalOcean,AWS,阿里云,OpenStack等。 - NodePort Service
实质上就是通过在集群的每个 node 上暴露一个端口(默认范围:30000-32767,可以在apiserver启动命令中修改)。由于安全性弱以及管理不方便,实际使用较少。在小规模集群中使用还是挺方便的。 - Ingress
通过 Ingress,用户可以实现使用 开源的反向代理负载均衡器(例如nginx)实现对外暴露服务。分为3个组件:反向代理负载均衡器,Ingress Controller和ingress。- 反向代理负载均衡器 nginx, traefik,haproxy等,可以额外部署,例如使用deployment,daemonset等
- Ingress Controller 通过不断地访问 kubernetes API ,实时的感知后端 service、pod 等变化,比如新增和减少 pod,service 增加与减少等;当得到变化信息后,再结合 Ingress 生成配置,更新反向代理负载均衡器刷新其配置,达到服务发现的作用
- Ingress 规则定义,用于转发请求进行服务发现和负载均衡,相当于请求路由。
二、Traefik介绍以及在Kubernetes集群中的使用场景
2.1 Traefik简介
Traefik 是一个为了让部署微服务更加便捷而诞生的现代HTTP(s)反向代理、负载均衡工具(边缘路由器)。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。在kubernetes集群中Traefik 2.x开始使用CRD来提供服务,功能更加强大,接下来的kubernetes的配置会采用traefik2.x作为基准配置。
更多介绍,参考官方网站: https://docs.traefik.io
- 概要图
- 核心概念
Entrypoint
这是流量的入口,它们定义了接收请求的端口(HTTP或者TCP或者UDP)。
Providers
用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、File
Routers
分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。
Services
将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服务。
Middlewares
中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, ...),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法
2.2 Traefik在Kubernetes集群中的使用场景
在单一Kubernetes集群内部可以部署多组traefik,既可以是daemonset方式或者deployment方式或者同时存在。
kubernetes里面有namespace的概念,在实际的业务中可能逻辑对应环境,部门或者项目等。很多时候不同环境、部门、项目因为管理或者其他要求,不使用同一组traefik反向代理,需要各自的traefik组件,这种情况下是需要在一个集群内部部署多组traefik组件的。
-
DaemonSet部署方式
这种部署模式可以直接使用宿主机节点IP地址和宿主机端口对外提供服务(例如直接使用80,443端口,这样前端可以不使用代理或者端口映射满足http,https默认端口访问的能力),但是DaemonSet模式同一组traefik组件每个宿主机上只能部署一个Pod,而且直接占用宿主机的指定端口(例如80,443每个服务器只有一个<假设只有一个IP>),不够灵活。
备注:也有他的使用环境,例如一个集群中可以有一个全局默认的traefik,其他项目可以使用这组默认的,或者使用各自部署在自己namespace下的traefik(deployment模式)
-
Deployment部署方式
这种部署模式比较灵活,每个项目/部门/环境可以根据需要部署多组,对外的端口是NodePort模式(默认30000+端口),然后集群外防止一组或者多组TCP/UDP代理(Haproxy/FS/LVS等等)提供访问VIP和默认端口(80/443,通过映射或者代理的的方式对应到响应的NodePort) -
混合多组
根据实际业务或者管理需求部署多组traefik,可以混合使用DaemonSet和Deployment模式。