K8s-服务发布进阶
目录
Ingress组成
Ingress Controller 选型对比
Ingress Controller
核心定义
工作原理
动态监听与配置
流量转发流程
常见 Ingress Controller 实现
(1) Nginx Ingress Controller
Traefi
Istio Ingress Gateway
云厂商专用 Controller
核心功能对比
lngress工作原理
核心组件与角色
完整工作流程
用户创建 Ingress 资源
Ingress Controller 监听并处理变化
负载均衡器热重载配置
外部流量转发
关键细节解析
(1) 路径匹配策略
(2) TLS 终止
(3) 注解(Annotations)扩展功能
(4) 多域名与多路径
不同 Ingress Controller 的差异
Ingress组成
在 Kubernetes 中,Ingress 是服务发布进阶的核心组件,它通过统一的入口管理外部流量到集群内部服务的路由,支持基于域名、路径的精细化控制,并提供负载均衡、SSL 终止、流量重定向等高级功能。
- 统一流量入口
- 通过单个 IP 或域名暴露多个服务,避免为每个服务单独配置
LoadBalancer
或NodePort
,简化集群外部访问管理。 - 示例:一个域名下通过路径
/api
和/web
分别路由到不同后端服务。
- 通过单个 IP 或域名暴露多个服务,避免为每个服务单独配置
- 基于域名和路径的路由
- 支持精确匹配(
Exact
)或前缀匹配(Prefix
),实现微服务架构下的流量拆分。 - 示例配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: "api.example.com" http: paths: - path: /v1 pathType: Prefix backend: service: name: v1-service port: number: 80 - host: "web.example.com" http: paths: - path: / pathType: Prefix backend: service: name: web-service port: number: 80
- 支持精确匹配(
- 负载均衡与高可用
- Ingress Controller(如 Nginx、Traefik)内置负载均衡算法(轮询、加权轮询等),自动分发流量到后端 Pod,提升服务可用性。
- SSL/TLS 终止
- 集中管理 HTTPS 证书,解密请求后转发明文流量到后端服务,减轻后端负担。
- 示例:通过
Secret
引用证书:spec:
tls:
- hosts:
- example.com
secretName: example-tls-secret
- 流量重定向与重写
- 支持 HTTP 到 HTTPS 的强制跳转(
ssl-redirect
)、路径重写(rewrite-target
)等,满足复杂业务需求。 - 示例:将
/old-path
重写为/new-path
:metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /new-path
- 支持 HTTP 到 HTTPS 的强制跳转(
Ingress Controller 选型对比
Controller | 优势 | 适用场景 |
---|---|---|
Nginx Ingress | 官方维护,社区活跃,功能稳定;支持丰富的注解(如重写、限流、CORS)。 | 传统 Web 服务、微服务架构。 |
Traefik | 动态配置自动发现,支持 Docker/K8s 原生集成;内置 Dashboard 监控。 | 云原生环境、需要快速迭代的场景。 |
Istio Ingress | 与 Service Mesh 深度集成,支持流量镜像、熔断、灰度发布等高级流量管理。 | 复杂微服务治理、需要观测性的场景。 |
ALB Ingress (AWS) | 云原生负载均衡器,支持 WebSocket、HTTP/2;按请求量计费,成本优化。 | AWS 云环境,大规模流量场景。 |
推荐选择:
- 通用场景:Nginx Ingress(功能全面,生态成熟)。
- 云原生环境:Traefik(轻量级,动态配置)。
- 复杂流量治理:Istio Ingress(结合 Service Mesh)。
Ingress Controller
Ingress Controller 是 Kubernetes 中实际执行 Ingress
资源规则的核心组件,它负责监听集群内 Ingress
对象的变化,并根据定义的路由规则(如域名、路径、TLS 终止等)动态配置底层负载均衡器(如 Nginx、Envoy 等),将外部流量转发到集群内部的服务。
核心定义
- 角色:Ingress Controller 是 Kubernetes 的“流量网关”,充当集群外部流量与内部服务之间的桥梁。
- 与 Ingress 的关系:
- Ingress 资源:定义流量路由规则(如“将
app.example.com/api
转发到api-service
”)。 - Ingress Controller:解析这些规则并实际转发流量(如配置 Nginx 的
server
和location
块)。
- Ingress 资源:定义流量路由规则(如“将
类比:
Ingress
像“交通规则手册”,定义了车辆(流量)如何行驶。Ingress Controller
像“交通警察”,根据规则指挥车辆(转发请求)。
工作原理
动态监听与配置
- 监听 Ingress 变化:
Ingress Controller 通过 Kubernetes API 监听Ingress
、Service
、Endpoint
等资源的变化(如新增、删除、更新)。 - 生成配置文件:
根据Ingress
规则动态生成负载均衡器的配置文件(如 Nginx 的nginx.conf
、Traefik 的静态配置)。 - 热重载配置:
无需重启,直接加载新配置(如 Nginx 通过nginx -s reload
)。
流量转发流程
- 外部请求到达:
用户访问https://app.example.com/api
,DNS 解析到 Ingress Controller 的外部 IP(如 LoadBalancer 或 NodePort)。 - 匹配 Ingress 规则:
Ingress Controller 根据域名(app.example.com
)和路径(/api
)找到对应的Ingress
资源。 - 选择后端服务:
通过Ingress
中定义的backend
(如api-service:80
)找到目标 Service。 - 负载均衡转发:
根据负载均衡算法(如轮询、IP 哈希)将请求转发到 Service 对应的 Pod。
常见 Ingress Controller 实现
(1) Nginx Ingress Controller
- 特点:
- 官方维护,社区活跃,功能全面。
- 支持丰富的注解(如重写路径、限流、CORS、WebSocket)。
- 适合传统 Web 服务和微服务架构。
- 部署方式:
- 通过
DaemonSet
(每个节点部署一个 Pod)或Deployment
(可伸缩)。 - 示例命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
- 通过
Traefi
- 特点:
- 轻量级,动态配置自动发现(无需手动重启)。
- 内置 Dashboard 监控,支持 Docker/K8s 原生集成。
- 适合云原生环境和快速迭代的场景。
- 部署方式:
- 通过 Helm Chart 安装:
helm repo add traefik https://traefik.github.io/charts helm install traefik traefik/traefik
- 通过 Helm Chart 安装:
Istio Ingress Gateway
- 特点:
- 与 Istio Service Mesh 深度集成,支持高级流量治理(如熔断、灰度发布、流量镜像)。
- 基于 Envoy 代理,提供强大的可观测性(Metrics、Tracing、Logging)。
- 适合复杂微服务架构和需要精细化流量控制的场景。
- 部署方式:
- 作为 Istio 的一部分安装:
istioctl install --set profile=demo -y kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.19/samples/addons/prometheus.yaml
- 作为 Istio 的一部分安装:
云厂商专用 Controller
- AWS ALB Ingress Controller:
- 直接管理 AWS Application Load Balancer (ALB),支持 WebSocket、HTTP/2。
- 按请求量计费,适合大规模流量场景。
- GCP GCE Ingress Controller:
- 集成 Google Cloud Load Balancer,支持全局负载均衡。
核心功能对比
功能 | Nginx Ingress | Traefik | Istio Ingress |
---|---|---|---|
负载均衡算法 | 轮询、IP 哈希等 | 轮询、加权轮询 | 轮询、随机、最少连接 |
TLS 终止 | 支持 | 支持 | 支持 |
路径重写 | 支持(注解) | 支持 | 支持(VirtualService) |
流量镜像 | 不支持 | 不支持 | 支持 |
熔断限流 | 通过注解(有限支持) | 通过 Middleware | 支持(DestinationRule) |
可观测性 | 基础 Metrics | 内置 Dashboard | 集成 Prometheus/Grafana |
部署复杂度 | 中等 | 低 | 高(需配合 Istio) |
lngress工作原理
Ingress 是 Kubernetes 中管理外部流量进入集群的核心机制,其工作原理涉及多个组件的协同,包括 Ingress 资源、Ingress Controller、底层负载均衡器(如 Nginx、Envoy)以及 Kubernetes 的 Service/Endpoint 机制
核心组件与角色
组件 | 角色 |
---|---|
Ingress 资源 | 定义流量路由规则(如域名、路径、TLS 终止、后端服务等)。 |
Ingress Controller | 监听 Ingress 变化,动态生成负载均衡器配置(如 Nginx 的 nginx.conf )。 |
负载均衡器 | 实际转发流量的代理(如 Nginx、Envoy、Traefik)。 |
Service/Endpoint | 提供后端服务的集群内访问地址(ClusterIP + Pod IP 列表)。 |
完整工作流程
用户创建 Ingress 资源
-
定义路由规则:
用户通过 YAML 文件创建Ingress
资源,指定域名、路径和后端服务。
示例:apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: example-ingress spec:rules:- host: "app.example.com"http:paths:- path: /apipathType: Prefixbackend:service:name: api-serviceport:number: 80
-
Ingress 存入 etcd:
Kubernetes API Server 将Ingress
资源持久化到 etcd 数据库。
Ingress Controller 监听并处理变化
-
监听 Ingress 事件:
Ingress Controller(如 Nginx Ingress)通过 Informer 机制 监听 Kubernetes API,捕获Ingress
、Service
、Endpoint
等资源的创建/更新/删除事件。 -
生成配置模板:
Controller 根据Ingress
规则生成负载均衡器的配置模板。例如:- Nginx:生成
server
和location
块,匹配域名和路径。 - Traefik:动态创建 Router 和 Service 配置。
- Istio:生成
VirtualService
和Gateway
资源。
- Nginx:生成
-
填充后端信息:
Controller 查询Service
对应的Endpoint
(即健康 Pod 的 IP 和端口),将动态后端信息填入配置。
示例:# Nginx 生成的配置片段 server {listen 80;server_name app.example.com;location /api {proxy_pass http://10.244.1.5:8080; # Pod IP:Portproxy_pass http://10.244.2.3:8080; # 多副本 Pod} }
负载均衡器热重载配置
-
无中断更新:
Controller 通过信号或 API 触发负载均衡器重新加载配置(如 Nginx 的nginx -s reload
),无需重启进程。 -
健康检查:
负载均衡器定期检查后端 Pod 的健康状态(通过readinessProbe
),自动剔除不健康的 Pod。
外部流量转发
-
用户请求到达:
用户访问http://app.example.com/api
,DNS 解析到 Ingress Controller 的外部 IP(如 LoadBalancer 或 NodePort)。 -
匹配 Ingress 规则:
Ingress Controller 根据域名和路径找到对应的Ingress
资源,确定目标 Service。 -
负载均衡转发:
根据配置的算法(如轮询、IP 哈希)将请求转发到 Service 对应的健康 Pod。
关键细节解析
(1) 路径匹配策略
Prefix
:路径前缀匹配(如/api
匹配/api/v1
)。Exact
:精确路径匹配(如/api
仅匹配/api
)。ImplementationSpecific
:由具体 Controller 实现(如 Nginx 默认使用前缀匹配)。
(2) TLS 终止
-
用户创建 TLS Secret:
apiVersion: v1 kind: Secret metadata:name: example-tls-secret type: kubernetes.io/tls data:tls.crt: <base64-encoded-cert>tls.key: <base64-encoded-key>
-
Ingress 引用 Secret:
spec:tls:- hosts:- app.example.comsecretName: example-tls-secret
-
Controller 配置 HTTPS:
Nginx Controller 会生成包含 SSL 证书的server
块,终止 HTTPS 并转发 HTTP 到后端。
(3) 注解(Annotations)扩展功能
- Nginx 注解示例:
metadata:annotations:nginx.ingress.kubernetes.io/rewrite-target: "/new-path" # 路径重写nginx.ingress.kubernetes.io/ssl-redirect: "true" # 强制 HTTPSnginx.ingress.kubernetes.io/limit-rps: "10" # 限流
(4) 多域名与多路径
- 单个 Ingress 支持多规则:
spec:rules:- host: "app1.example.com"http:paths:- path: /backend: { service: app1-service, port: 80 }- host: "app2.example.com"http:paths:- path: /backend: { service: app2-service, port: 80 }
不同 Ingress Controller 的差异
特性 | Nginx Ingress | Traefik | Istio Ingress |
---|---|---|---|
配置更新方式 | 热重载 nginx.conf | 动态 Router 发现 | 通过 VirtualService 更新 |
流量治理 | 基础负载均衡 | 支持 Middleware(限流、重试) | 熔断、灰度发布、流量镜像 |
可观测性 | 基础 Metrics | 内置 Dashboard | 集成 Prometheus/Grafana |
适用场景 | 传统 Web 服务 | 云原生、快速迭代 | 复杂微服务架构 |