Kubernetes集群的流量管理
Service --东西向流量
- 基于iptables或ipvs实现的四层负载均衡机制
- 不支持基于URL等机制对HTTP/HTTPS协议进行高级路由、超时/重试、基于流量的灰度等高级流量治理机制
- 难以将多个Service流量统一管理
Ingress --南北流量
Ingress API
声明式的API
负责以k8s标准的资源格式定义流量调度、路由等规则
Ingress Controller共同组成
后者负责监视(watch)Ingress并生成自身的配置,并据此完成流量转发
- Ingress Controller非为内置的控制器,需要额外部署
- 通常以Pod形式运行于Kubernetes集群之上
- 一般应该由专用的LB Service负责为其接入集群外部流量
Kubernetes上的标准API资源类型之一
- 仅定义了抽象路由配置信息,只是元数据,需要由相应的控制器动态加载
- 依赖的控制器(七层反代 负载均衡), 没有被controller 内置, 需要自定部署
Ingress Controller --外置安装的控制器
七层负载均衡反代 需要以pod的形式部署运行在k8s集群
- 反向代理服务程序,需要监视API Server上Ingress资源的变动,并将其反映至自身的配置文件中
- Kubernetes的非内置的控制器,需要额外选择部署
- 实现方案有很多,包括Ingress-Nginx、HAProxy、Traefik、Gloo、Contour和Kong等
- Kubernetes支持同时部署二个或以上的数量的Ingress Controller
- Ingress资源配置可通过特定的annotation或spec中嵌套专有的字段指明期望加载该资源的Ingress Controller
- 专用的annotation:kubernetes.io/ingress.class
- v1.18版本起,Ingress资源配置中增添了新字段:ingressClassName,引用的IngressClass是一种特定的资源类型
Ingress Nginx的作用
- 去监听apiserver 创建的ingeress新资源
- 然后将流量转发规则 动态转换为nginx格式的配置
- 然后重新热加载nginx配置文件
Ingress流量转发
Ingress需要借助于Service资源来发现后端端点
注意: Ingress Controller会基于Ingress的定义将流量直接发往其相关Service的后端端点,该转发过程并不会再经由Service进行
client --->Ingress Controller svc --> Ingress Controller pod ---> 直达 pods
pods 依然会创建 service 但是负载均衡功能没了 但是 会用到服务发现功能
部署 Ingress Nginx
以Kubernetes社区维护的Ingress-Nginx为例
- 参考 kubernetes.github.io/ingress-ngi…
- 根据环境选择,例如,对于kubeadm部署的集群,我们可以选择“Bare-metal”
以v1.5.1版为例
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml
controller部署成功
Ingress资源类型一:Simple fanout 简单扇出
在同一个FQDN下通过不同的URI完成不同应用间的流量分发
- 基于单个虚拟主机接收多个应用的流量
- 常用于将流量分发至同一个应用下的多个不同子应用
- 同一个应用内的流量由调度算法分发至该应用的各后端端点
- 不需要为每个应用配置专用的域名
Ingress资源类型二: Name based virtual hosting --基于虚拟主机
为每个应用使用一个专有的主机名,并基于这些名称完成不同应用间的流量转发
- 每个FQDN对应于Ingress Controller上的一个虚拟主机的定义
- 同一组内的应用的流量,由Ingress Controller根据调度算法完成请求调度
Ingress资源类型三: TLS
Ingress也可以提供TLS支持,但仅限于443/TCP端口
- 若TLS配置部分指定了不同的主机,则它们会根据通过SNI TLS扩展指定的主机名
- 前提:Ingress控制器支持SNI在同一端口上复用
- TLS Secret必须包含名为tls.crt和 的密钥tls.key,它们分别含有TLS的证书和私钥
Ingress 配置示例
命令式命令
创建Ingress的命令:
kubectl create ingress NAME --rule=host/path=service:port[,tls[=secret]]
常用选项
--annotation=[]:提供注解,格式为“annotation=value”
--rule=[]:代理规则,格式为“host/path=service:port[,tls=secretname]”
--class=‘’:该Ingress适配的Ingress Class
准备环境:两个Service(demoapp10和demoapp11)
部署demoapp v1.0
kubectl create deployment demoapp10 --image=ikubernetes/demoapp:v1.0 --replicas=3
kubectl create service clusterip demoapp10 --tcp=80:80
部署demoapp v1.1
kubectl create deployment demoapp11 --image=ikubernetes/demoapp:v1.1 --replicas=2
kubectl create service clusterip demoapp11 --tcp=80:80