Kubernetes Ingress

本文将介绍 Kubernetes 中的 Ingress,即入口。

一、什么是 Ingress?

Service 虽然可以实现负载均衡,但是它有以下缺点:

  • 建立在运输层之上,只能读取到 IP、端口信息,对于更高层的 HTTP/HTTPS 中的主机名、URI、请求头、证书等信息均无法访问,因此负载均衡能力无法有限
  • 只适合在集群内部进行负载均衡,不能很好地支持将服务暴露到外部

因此,Kubernetes 设计了 Ingress,即入口,它具有以下特点:

  • 建立在应用层之上
  • 作为流量的总入口,统管集群中的进出口数据

二、Ingress、IngressController 和 IngressClass

1. Ingress

在 Kubernetes 的设计中,Ingress 只是一些路由规则的集合,相当于是一份静态的描述文件。

2. IngressController

IngressController 是规则的具体执行者。需要注意的是,它并不内置在 Kubernetes 中,而是交由社区根据规范实现。因此,IngressController 有着大量的实现,这其中,Nginx Ingress Controller 是应用最广泛的。

3. IngressClass

随着 Ingress 在现实中的应用,许多问题开始暴露:

  • 出于某些原因,希望在项目中引入不同的 IngressController
  • Ingress 规则过多,单一 IngressController 处理不过来
  • 多个 Ingress 对象没有很好的逻辑分组方式,管理和维护成本高
  • 集群中存在不同组户,它们对 Ingress 的需求差异很大

因此,Kubernetes 增加了 IngressClass 这一概念,它穿插在 Ingress 和 IngressController 中,作为流量规则和控制器的协调人,避免了二者的强绑定关系。

三、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
# Kubernetes的KPI版本号
apiVersion: networking.k8s.io/v1
# 资源对象的类型 【Pod、Node、Job、Service等】
kind: Ingress
# 元信息,用于标记资源对象
metadata:
# 名称
name: ngx-ingress
# 说明,描述资源对象的目标状态
spec:
# IngressClass名称
ingressClassName: ngx-ink
# 规则
rules:
- host:ngx.test
http:
paths:
- path: /
pathType: Exact
backend:
service:
name: ngx-svc
port:
number: 80

四、IngressController 的部署

略。

参考

  • Kubernetes
  • Kubernetes 入门实战课
  • 深入剖析 Kubernetes