什么是 Kubernetes Ingress
Kubernetes Ingress 是一种 API 资源,用于管理集群外部访问集群内部服务的方式。它提供了 HTTP 和 HTTPS 路由功能,使外部流量能够访问集群内部的服务。Ingress 可以配置基于主机名和路径的路由规则,将外部请求定向到集群内部的服务,并支持负载均衡、SSL 终止等功能。
Ingress 示例
下面是一个简单的 Ingress 配置示例,用于将流量路由到不同的服务:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-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
Ingress 在以下情况下尤其有用:
- 多服务管理:当需要管理多个服务时,Ingress 提供了统一的入口控制,通过定义不同的路由规则,将流量分发到多个后端服务。
- 基于域名和路径的路由:Ingress 可以根据域名或路径将请求路由到不同的服务,实现灵活的流量管理。
- SSL 终止:Ingress 支持 SSL/TLS 证书配置,确保数据传输的安全性。
SSL/TLS 终止示例
要配置 SSL/TLS 终止,可以在 Ingress 资源中指定证书:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ssl-ingress
spec:
tls:
- hosts:
- example.com
secretName: example-cert
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
Ingress 解决的问题
Ingress 解决了以下问题:
- 统一入口:Ingress 提供了一个统一的入口点,简化了多服务的访问和管理。
- 七层负载均衡:Ingress 支持七层负载均衡,能够根据 HTTP/HTTPS 协议进行流量分发,这比传统的四层负载均衡更灵活。
- 减少基础设施成本:通过重用单个外部负载均衡器和 IP 地址,Ingress 可以为多个服务提供服务,降低了基础设施成本。
- 灵活的路由配置:Ingress 允许用户自定义路由规则,实现灵活的流量管理。
Ingress 的工作原理
Ingress 的工作原理涉及两个关键组件:
- Ingress 资源:定义了主机名、路径和后端服务之间的映射关系。
- Ingress 控制器:监控 Ingress 资源的变化,并配置代理服务器以实现路由和流量管理。常见的 Ingress 控制器包括 NGINX、Traefik 和 HAProxy 等。
Ingress 控制器安装示例
使用 Helm 安装 NGINX Ingress 控制器:
bash
helm install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
性能监控
Ingress 控制器的性能监控可以通过 Prometheus 和 Grafana 实现。常见的监控指标包括:
- 请求处理时间 (
nginx_ingress_controller_request_duration_seconds
) - 响应大小 (
nginx_ingress_controller_response_size
) - 活动连接数 (
nginx_ingress_controller_nginx_process_connections
)。
示例代码
以下是使用 Python 的 requests
库测试 Ingress 路由的示例:
python
import requests
def test_ingress_routing():
url = "http://example.com/service1"
headers = {"Host": "example.com"}
response = requests.get(url, headers=headers)
print(response.status_code)
test_ingress_routing()