k8s Ingress 七层负载
Kubernetes 的 Ingress 用于七层(L7)负载均衡,它在应用层(主要是 HTTP/HTTPS 协议)上为集群中的服务提供外部访问,并允许基于请求的内容(如路径、域名)将流量转发到不同的服务。这在实现复杂的路由规则时非常有用,比如根据 URL 路径或主机名将流量导向不同的后端服务。
Ingress 的基本概念
- Ingress Controller:这是 Ingress 资源的实际实现者。它监听和管理集群中的 Ingress 资源,并根据配置创建负载均衡器或代理来处理流量。常见的 Ingress 控制器包括 NGINX Ingress Controller、Traefik、HAProxy 等。
- Ingress Resource:是 Kubernetes 中定义的资源对象,描述了流量如何被转发。你可以配置规则,根据域名或 URL 路径将流量导向不同的服务。
基本的 Ingress 配置示例
假设我们有两个服务 service-a
和 service-b
,希望根据路径进行流量分发:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /service-a
pathType: Prefix
backend:
service:
name: service-a
port:
number: 80
- path: /service-b
pathType: Prefix
backend:
service:
name: service-b
port:
number: 80
配置解释
- metadata.annotations:这里使用了
nginx.ingress.kubernetes.io/rewrite-target
注解,表示 NGINX Ingress 控制器会将所有请求路径重写为/
(可以根据需要调整)。 - spec.rules:定义了域名
example.com
的规则。- host:请求的域名。当请求的 Host 字段为
example.com
时,这些规则生效。 - http.paths:根据请求路径将流量路由到不同的服务。
- path:定义路由路径(例如
/service-a
或/service-b
)。 - pathType:定义路径的匹配方式,
Prefix
表示路径前缀匹配。 - backend.service.name:指定后端服务的名称。
- backend.service.port.number:指定后端服务的端口。
- path:定义路由路径(例如
- host:请求的域名。当请求的 Host 字段为
使用 Ingress 的步骤
-
部署 Ingress Controller:在集群中安装一个 Ingress 控制器。大部分云平台(如 GKE、EKS)都支持安装 Ingress 控制器,也可以使用 Helm 在本地集群中安装。
-
创建 Ingress Resource:使用
kubectl apply -f <ingress-config.yaml>
创建 Ingress 配置,将流量按需求分配到不同的服务。 -
验证 Ingress:
kubectl get ingress example-ingress
常见注解(Annotations)
nginx.ingress.kubernetes.io/ssl-redirect
:控制是否将 HTTP 流量重定向到 HTTPS。nginx.ingress.kubernetes.io/rewrite-target
:用于路径重写,将路径修改为指定的目标路径。nginx.ingress.kubernetes.io/secure-backends
:设置是否仅通过 HTTPS 连接到后端服务。
小结
Kubernetes Ingress 是一个有效的七层负载均衡解决方案,尤其适合基于 HTTP/HTTPS 的复杂路由需求。它通过域名和路径规则使多个服务可以共享同一个外部 IP。