前言

Kubernetes(K8s)是一个强大的容器编排平台,为容器化应用提供了丰富的功能和资源管理。在K8s中,Ingress是一个重要的核心对象,它允许我们定义对集群内服务的外部访问规则。本文将深入研究K8s中Ingress的概念、作用以及使用方法,并通过详细的示例来帮助读者更好地理解。

什么是Kubernetes Ingress?

Ingress是K8s中的一个API对象,用于管理和配置外部对集群内服务的访问。它允许我们定义HTTP和HTTPS路由规则,将请求从集群外部的负载均衡器引导到相应的服务。Ingress的灵活性使得我们能够实现高级的应用程序路由、SSL终端和负载均衡等功能。

通过Ingress,我们可以将集群内的多个服务暴露到外部,并根据需要进行定制化的路由设置。这为应用的扩展和灵活部署提供了便利。

Ingress的基本结构

Ingress由以下几个主要组件构成:

  • 规则(Rules): 每个Ingress对象可以包含多个规则,每个规则定义了一组路径匹配规则和与之关联的后端服务。
  • 后端服务(Backend Services): 规则中指定的后端服务是Ingress路由请求到达时的目标服务。这可以是集群中的Service、Pod或外部服务。
  • 路径(Paths): 路径定义了应该如何将请求路由到后端服务。可以使用通配符和正则表达式进行路径匹配。
  • TLS(Transport Layer Security): Ingress还支持TLS,用于启用HTTPS。TLS配置包括证书和密钥,确保数据在传输过程中的安全性。

下面是一个简单的Ingress对象的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /app
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
tls:
- hosts:
- mydomain.com
secretName: my-tls-secret

在这个例子中,我们定义了一个Ingress对象,它将mydomain.com/app的请求路由到名为my-app-service的Service,并启用了HTTPS。

Ingress的使用示例

为了更好地理解Ingress的使用,让我们通过一个具体的示例来演示。

假设我们有一个Web应用,包括前端(frontend)和后端(backend)服务。现在,我们希望通过Ingress将这两个服务暴露到外部,并在路径上进行定制化的路由。

首先,我们创建前端和后端的Deployment和Service:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: web-server
image: my-frontend-image:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 80
yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 3
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: api-server
image: my-backend-image:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 8080
targetPort: 8080

接下来,我们定义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
27
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /frontend
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /backend
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 8080
tls:
- hosts:
- mydomain.com
secretName: my-tls-secret

在这个示例中,我们定义了一个Ingress对象,它将mydomain.com/frontend的请求路由到前端服务,将mydomain.com/backend的请求路由到后端服务。此外,我们还启用了HTTPS,并指定了TLS证书的Secret。

动态更新Ingress规则

Ingress的一个强大之处在于它支持动态更新。当我们需要调整路由规则时,可以直接修改Ingress对象,而不需要重启应用或重新创建服务。

让我们通过一个动态更新的例子来演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /frontend
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
tls:
- hosts:
- mydomain.com
secretName: my-tls-secret

在这个例子中,我们仅保留了前端服务的路由规则。然后,通过应用这个更新后的Ingress对象,K8s将自动更新负载均衡器的配置,使得只有mydomain.com/frontend的请求能够到达前端服务。

总结

通过本文的介绍,我们对K8s中的Ingress有了深入的了解。Ingress作为连接集群内服务和外部请求的桥梁,提供了灵活的路由和负载均衡功能。了解Ingress的基本结构、使用示例以及动态更新的能力,有助于开发者更好地利用K8s进行应用程序的外部暴露和访问控制。