什么是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对象的例子:
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:
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对象:
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对象,而不需要重启应用或重新创建服务。
让我们通过一个动态更新的例子来演示:
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的请求能够到达前端服务。
Ingress作为连接集群内服务和外部请求的桥梁,提供了灵活的路由和负载均衡功能。了解Ingress的基本结构、使用示例以及动态更新的能力,有助于开发者更好地利用K8s进行应用程序的外部暴露和访问控制。