Ingress
Ingress可以认为在k8s集群边缘统一打了一个洞,而后用户的请求在进入集群时统一从这个名为Ingress的洞口流入进来。
通过Ingress进入集群的流量如何将其发放到各自不同的后端服务上去?有以下几种方式:
- 基于不同虚拟主机来进行路由,将不同的服务发送到不同的pod上去。
- 基于同一个虚拟主机来路由,将后端的每一个服务映射为一个路径。
Ingress: k8s上的标准资源。
Ingress Controller: Ingress控制器。兼具http/tcp代理服务,如Nginx,HAProxy,Envoy。
Ingress是一个配置文件的片段可以存在多个,Ingress Controlle可以存在多个,但是启用的只有一个。
所以如果有服务需要暴露到集群外部,就需要使用Ingress为其定义一个适用于Ingress Controller
的配置文件,然后让其自动能够注入到Ingress Controller中。
Ingress controller
Ingress控制器是用来让ingress和代理服务进行适配的一个中间组件,这里的代理服务可以是Nginx,HAProxy,Envoy等等。
在k8s中ingress controller可以存在多个,但是在进行代理和调度时,只能启用其中一个,这是受控于ingress资源清单中 metadata.annotations.kubernetes.io/ingress.class 的定义。
Ingress controller工作逻辑
外部流量进入Ingress controller之后,Ingress Controller不会把流量转给Service由Service把流量转给pod,而是直接将流量转给pod。
此处Service只是负责将pod归组,Ingress通过Service去识别这组pod是谁,然后直接由Ingress自己代理给Pod。流量不再经由Service调度而是由Ingress Controller直接调度到后端服务器上去。
Ingress资源规范
Ingress是k8s上的标准资源,但是其从1.5开始引入,一直到1.18一直为beta版本,从1.19开始进入v1版本
v1beta1 Ingress资源规范
1 | apiVersion: extensions/v1beta1 # 资源所属的API群组和版本 |
v1 Ingress资源规范
1 | apiVersion: networking.k8s.io/v1 # 资源所属的API群组和版本 |