Ingress可以认为在k8s集群边缘统一打了一个洞,而后用户的请求在进入集群时统一从这个名为Ingress的洞口流入进来。

通过Ingress进入集群的流量如何将其发放到各自不同的后端服务上去?有以下几种方式:

  1. 基于不同虚拟主机来进行路由,将不同的服务发送到不同的pod上去。
  2. 基于同一个虚拟主机来路由,将后端的每一个服务映射为一个路径。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: extensions/v1beta1   # 资源所属的API群组和版本
kind: Ingress # 资源类型标识符
metadata: # 元数据
name <string> # 资源名称
annotations: # 资源注解,v1beta1使用下面的注解来指定要解析该资源的控制器类型
kubernetes.io/ingress.class: <string> # 适配的Ingress控制器类别
namespace <string> # 名称空间
spec:
rules <[]Object> # Ingress规则列表;
- host <string> # 虚拟主机的FQDN,支持“*”前缀通配,不支持IP,不支持指定端口
http <Object>
paths <[]Object> # 虚拟主机PATH定义的列表,由path和backend组成
- path <string> # 流量匹配的HTTP PATH,必须以/开头
pathType <string> # 匹配机制,支持Exact、Prefix和ImplementationSpecific
backend <Object> # 匹配到的流量转发到的目标后端
resource <Object> # 引用的同一名称空间下的资源,与下面两个字段互斥
serviceName <string> # 引用的Service资源的名称
servicePort <string> # Service用于提供服务的端口
tls <[]Object> # TLS配置,用于指定上rules中定义的哪些host需要工作HTTPS模式
- hosts <[]string> # 使用同一组证书的主机名称列表
secretName <string> # 保存于数字证书和私钥信息的secret资源名称
backend <Object> # 默认backend的定义,可嵌套字段及使用格式跟rules字段中的相同
ingressClassName <string> # ingress类名称,用于指定适配的控制器

v1 Ingress资源规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: networking.k8s.io/v1   # 资源所属的API群组和版本
kind: Ingress # 资源类型标识符
metadata: # 元数据
name <string> # 资源名称
annotations: # 资源注解,v1beta1使用下面的注解来指定要解析该资源的控制器类型
kubernetes.io/ingress.class: <string> # 适配的Ingress控制器类别
namespace <string> # 名称空间
spec:
rules <[]Object> # Ingress规则列表
- host <string> # 虚拟主机的FQDN,支持“*”前缀通配,不支持IP,不支持指定端口
http <Object>
paths <[]Object> # 虚拟主机PATH定义的列表,由path和backend组成
- path <string> # 流量匹配的HTTP PATH,必须以/开头
pathType <string> # 支持Exact、Prefix和ImplementationSpecific,必选
backend <Object> # 匹配到的流量转发到的目标后端
resource <Object> # 引用的同一名称空间下的资源,与下面两个字段互斥
service <object> # 关联的后端Service对象
name <string> # 后端Service的名称
port <object> # 后端Service上的端口对象
name <string> # 端口名称
number <integer> # 端口号
tls <[]Object> # TLS配置,用于指定上rules中定义的哪些host需要工作HTTPS模式
- hosts <[]string> # 使用同一组证书的主机名称列表
secretName <string> # 保存于数字证书和私钥信息的secret资源名称
backend <Object> # 默认backend的定义,可嵌套字段及使用格式跟rules字段中的相同
ingressClassName <string> # ingress类名称,用于指定适配的控制器