Ingress 是 Kubernetes 中的一种 API 对象,用于管理和配置集群中的 HTTP 和 HTTPS 服务路由。
Ingress 可以在 Kubernetes 集群外公开服务,并提供负载均衡、SSL 终止和基于主机名或 URL 路径的路由等功能。
简单来说,Ingress 允许你将多个服务(Service)暴露给集群外部,通过不同的路径或主机名将请求路由到不同的服务上。这样可以避免在集群外部使用 NodePort 或 LoadBalancer 服务类型来访问应用程序,从而更加灵活和可控地管理应用程序的网络流量。
在 Kubernetes 中,Ingress 对象用 YAML 文件进行定义,并使用 Ingress Controller 进行处理和实现。Ingress Controller 是一个独立的组件,它会监视 Ingress 对象的变化,并根据定义的规则动态地更新反向代理服务器的配置,从而实现流量转发和负载均衡。
常见的 Ingress Controller 包括 Nginx Ingress Controller、Traefik、HAProxy 等。你可以根据自己的需求选择适合自己的 Ingress Controller,并将其部署到 Kubernetes 集群中。
注:要使用Ingress ,必须先将Ingress Controller部署到Kubernetes 并可用
Ingress策略可以按多种方式进行配置,下面对几种常见的Ingress转发策略进行说明。
下面Ingress 的配置写法是在 Kubernetes 1.19 版本开始引入,如果你的Kubernetes 版本比较低的话,那么使用的是以下写法
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /path1
backend:
serviceName: service1
servicePort: 80
- path: /path2
backend:
serviceName: service2
servicePort: 80
最主要区别是serviceName和servicePort、path
基于这种设置,客户端到Ingress Controller的访问请求都将被转发到后端的唯一Service上,在这种情况下Ingress无须定义任何rule。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
defaultBackend:
service:
name: test
port:
number: 80
使用 kubectl apply -f 创建此 Ingress,使用以下命令就可以查看Ingress 的状态:
kubectl get ingress test-ingress
输出如下
NAME CLASS HOSTS ADDRESS PORTS AGE
test-ingress external-lb * 203.0.113.123 80 59s
其中 203.0.113.123 是由 Ingress 控制器分配以满足该 Ingress 的 IP。
要将不同的 URL 路径转发到不同的服务上,你可以在 Ingress 配置文件中定义多个路径映射规则。每个路径映射规则都指定了一个特定的路径和对应的后端服务。以下是一个示例的 Ingress 配置文件,将不同的 URL 路径转发到不同的服务上:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
在这个示例中,Ingress 对象将主机名为 example.com 的请求路径为 /service1 的请求转发到名为 service1 的后端服务上,而请求路径为 /service2 的请求则转发到名为 service2 的后端服务上。
你可以根据需要在 paths 部分添加更多的路径映射规则,以将请求转发到不同的服务上。只需定义相应的路径和后端服务即可。
想要将不同的域名转发到不同的服务上,我们只需要配置多个对应的host规则即可
示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: service1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- host: service2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
在这个示例中,Ingress 对象将主机名为 service1.example.com 的所有请求转发到名为 service1 的后端服务上,而主机名为 service2.example.com 的所有请求则转发到名为 service2 的后端服务上。
需要注意的是,在实际使用时,你还需要将 DNS 记录配置为将不同的主机名指向你的 Kubernetes 集群中运行的 Ingress Controller。只有这样,请求才能正确地路由到对应的 Ingress 对象上。
我们还可以配置一个默认的路由,所有其他流量都会被路由到 一个service上,如下所示
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress-no-third-host
spec:
rules:
- host: first.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: second.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
- http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service3
port:
number: 80
Ingress 会将 first.bar.com 的请求路由到 service1,将 second.bar.com 的请求路由到 service2,而所有其他请求都会被路由到 service3。
如果你不想使用域名的转发规则,而是希望根据路径来进行转发,可以将 Ingress 配置中的 host 字段移除,这样 Ingress 将会对所有的主机名生效,并且根据路径来进行转发。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
在这个示例中,我们去掉了 host 字段,这意味着这个 Ingress 对象将对所有主机名生效。然后,根据不同的路径将请求转发到不同的后端服务上。通过这样的配置,不同的 URL 路径将被转发到不同的服务上,而不考虑请求的主机名是什么。