前言
Kubernetes集群对外提供服务时,Ingress是标准的服务暴露方式。Ingress资源定义了HTTP/HTTPS路由规则,而Ingress Controller则是这些规则的实现者。Ingress Controller负责监控Ingress资源的变化,将路由规则翻译为具体的反向代理配置,并动态更新。
主流的Ingress Controller包括Nginx Ingress Controller、Traefik和Envoy Proxy。它们各有特点和适用场景,选择合适的Ingress Controller对集群的稳定性、性能和可维护性都有重要影响。
本文面向初中级运维工程师,从架构原理、配置方式、功能特性、性能表现、选型建议等维度对这三款Ingress Controller进行深入对比。通过本文,读者能够理解每种Ingress Controller的工作机制,并根据自己的场景做出合理选择。
第一章 Ingress基础概念
1.1 Kubernetes网络模型
Kubernetes采用扁平化的网络模型,每个Pod都有独立的IP地址,Pod之间可以直接通信,不需要NAT。Service是Pod的抽象,通过标签选择器将一组Pod统一暴露,提供负载均衡和发现机制。
ClusterIP是Service的默认类型,仅在集群内部可访问。要从外部访问服务,通常需要以下几种方式:NodePort在每个节点上开放一个端口;LoadBalancer需要云服务商支持,创建外部负载均衡器;Ingress则基于HTTP/HTTPS主机名和路径提供七层路由。
1.2 Ingress资源定义
Ingress是Kubernetes的标准资源,用于配置HTTP/HTTPS外部访问路由。
apiVersion:networking.k8s.io/v1 kind:Ingress metadata: name:demo-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target:/ spec: ingressClassName:nginx rules: -host:demo.example.com http: paths: -path:/api pathType:Prefix backend: service: name:api-service port: number:80 -path:/web pathType:Prefix backend: service: name:web-service port: number:8080 tls: -hosts: -demo.example.com secretName:demo-tls-secret
Ingress的配置通过注解(annotations)扩展,不同的Ingress Controller支持不同的注解。ingressClassName字段指定使用的Ingress Controller类,Kubernetes 1.18起支持此字段。
1.3 Ingress Controller职责
Ingress Controller的核心职责包括:监控Kubernetes API获取Ingress、Service、Endpoints等资源变化;将路由规则翻译为反向代理配置;热更新配置而不丢失请求;提供健康检查和指标暴露;处理TLS终止;实现负载均衡算法。
理解Ingress Controller的实现机制,有助于选择合适的方案和排查问题。每种Ingress Controller本质上都是一个运行在集群中的Deployment,它持续监听Kubernetes API并更新自己的配置。
第二章 Nginx Ingress Controller
2.1 架构与原理
Nginx Ingress Controller基于原生Nginx构建,部署模式分为两种:Deployment模式和DaemonSet模式。Deployment模式适合大规模集群,可以通过HPA实现自动扩缩容;DaemonSet模式在每个节点都运行一个实例,适合低延迟要求的场景。
apiVersion:apps/v1 kind:Deployment metadata: name:nginx-ingress-controller namespace:ingress-nginx spec: replicas:3 selector: matchLabels: app:nginx-ingress template: metadata: labels: app:nginx-ingress spec: containers: -name:controller image:registry.k8s.io/ingress-nginx/controller:v1.9.4 args: -/nginx-ingress-controller ---publish-service=$(POD_NAMESPACE)/ingress-nginx-controller ---election-id=ingress-controller-leader ---controller-class=k8s.io/ingress-nginx ---ingress-class=nginx ---configmap=$(POD_NAMESPACE)/nginx-configuration env: -name:POD_NAME valueFrom: fieldRef: fieldPath:metadata.name -name:POD_NAMESPACE valueFrom: fieldRef: fieldPath:metadata.namespace ports: -name:http containerPort:80 -name:https containerPort:443 livenessProbe: httpGet: path:/healthz port:10254 scheme:HTTP initialDelaySeconds:10 periodSeconds:10 readinessProbe: httpGet: path:/healthz port:10254 scheme:HTTP periodSeconds:5 resources: requests: cpu:100m memory:90Mi limits: cpu:1 memory:1Gi
Nginx Ingress Controller的工作流程:用户创建或更新Ingress资源;Controller监听到变化并生成Nginx配置文件;Nginx reload加载新配置;请求通过Service NodePort或LoadBalancer进入Nginx。
2.2 配置方式
Nginx Ingress Controller支持两种配置方式:通过Ingress注解和通过ConfigMap全局配置。
Ingress注解示例:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:cafe-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect:"true"
nginx.ingress.kubernetes.io/force-ssl-redirect:"true"
nginx.ingress.kubernetes.io/limit-rps:"100"
nginx.ingress.kubernetes.io/limit-connections:"50"
nginx.ingress.kubernetes.io/proxy-body-size:"50m"
nginx.ingress.kubernetes.io/proxy-connect-timeout:"30"
nginx.ingress.kubernetes.io/proxy-read-timeout:"60"
nginx.ingress.kubernetes.io/proxy-send-timeout:"60"
nginx.ingress.kubernetes.io/websocket-services:"ws-service"
nginx.ingress.kubernetes.io/use-regex:"true"
spec:
ingressClassName:nginx
rules:
-host:cafe.example.com
http:
paths:
-path:/tea
pathType:Exact
backend:
service:
name:tea-svc
port:
number:80
-path:/coffee
pathType:Prefix
backend:
service:
name:coffee-svc
port:
number:80
常用注解说明:
| 注解 | 说明 | 示例值 |
|---|---|---|
| nginx.ingress.kubernetes.io/ssl-redirect | 是否强制HTTPS | true/false |
| nginx.ingress.kubernetes.io/limit-rps | 限流每秒请求数 | 100 |
| nginx.ingress.kubernetes.io/limit-connections | 限流并发连接数 | 50 |
| nginx.ingress.kubernetes.io/proxy-body-size | 请求体大小限制 | 50m |
| nginx.ingress.kubernetes.io/proxy-read-timeout | 后端读取超时 | 60 |
| nginx.ingress.kubernetes.io/rewrite-target | URL重写目标 | / |
| nginx.ingress.kubernetes.io/use-regex | 是否使用正则匹配 | true/false |
| nginx.ingress.kubernetes.io/canary | 开启金丝雀发布 | true |
| nginx.ingress.kubernetes.io/canary-weight | 金丝雀权重 | 50 |
2.3 全局配置ConfigMap
通过ConfigMap可以设置Nginx的全局默认配置:
apiVersion:v1 kind:ConfigMap metadata: name:nginx-configuration namespace:ingress-nginx data: proxy-body-size:"50m" proxy-connect-timeout:"30" proxy-read-timeout:"60" proxy-send-timeout:"60" use-forwarded-headers:"true" compute-full-forwarded-for:"true" use-proxy-protocol:"false" enable-underscores-in-headers:"true" large-client-header-buffers:"4 16k" client-header-buffer-size:"4k" keep-alive:"75" keep-alive-requests:"1000" upstream-keepalive-connections:"50" upstream-keepalive-timeout:"60" upstream-keepalive-requests:"10000" enable-brotli:"true" enable-gzip:"true" gzip-level:"6" gzip-types:"application/json application/javascript application/xml text/css text/html text/javascript"
2.4 TLS配置
Nginx Ingress Controller支持多种TLS配置方式。
简单TLS配置:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:tls-ingress
spec:
ingressClassName:nginx
tls:
-hosts:
-example.com
-www.example.com
secretName:example-tls
rules:
-host:example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:frontend
port:
number:80
自签名证书创建:
# 创建私钥 openssl genrsa -out tls.key 2048 # 创建证书 openssl req -new -x509 -key tls.key -out tls.crt -days 365 -subj"/CN=example.com/O=MyOrg" # 创建Secret kubectl create secret tls example-tls --cert=tls.crt --key=tls.key # 或使用kubectl直接创建 kubectl create secret tls example-tls --cert=tls.crt --key=tls.key --dry-run=client -o yaml | kubectl apply -f -
2.5 金丝雀发布
Nginx Ingress Controller支持基于权重和Header的金丝雀发布:
# 主版本Ingress
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:main-ingress
spec:
ingressClassName:nginx
rules:
-host:app.example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:main-service
port:
number:80
---
# 金丝雀Ingress
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:canary-ingress
annotations:
nginx.ingress.kubernetes.io/canary:"true"
nginx.ingress.kubernetes.io/canary-weight:"30"
spec:
ingressClassName:nginx
rules:
-host:app.example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:canary-service
port:
number:80
基于Header的金丝雀:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:header-canary-ingress
annotations:
nginx.ingress.kubernetes.io/canary:"true"
nginx.ingress.kubernetes.io/canary-by-header:"X-Canary"
nginx.ingress.kubernetes.io/canary-by-header-value:"always"
spec:
ingressClassName:nginx
rules:
-host:app.example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:canary-service
port:
number:80
2.6 限流配置
Nginx Ingress Controller提供多维度限流功能:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:rate-limit-ingress
annotations:
nginx.ingress.kubernetes.io/limit-rps:"100"
nginx.ingress.kubernetes.io/limit-rpm:"1000"
nginx.ingress.kubernetes.io/limit-connections:"50"
nginx.ingress.kubernetes.io/limit-burst-multiplier:"5"
spec:
ingressClassName:nginx
rules:
-host:api.example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:api-service
port:
number:80
全局限流通过ConfigMap配置:
apiVersion:v1 kind:ConfigMap metadata: name:nginx-configuration namespace:ingress-nginx data: limit_req_zone:"$binary_remote_addr zone=api:10m rate=10r/s" limit_conn_zone:"$binary_remote_addr zone=addr:10m" proxy-limit-rate:"0"
第三章 Traefik
3.1 架构与原理
Traefik是一个现代云原生的反向代理和负载均衡器,采用动态配置机制。与传统Nginx不同,Traefik的配置变更不需要重载进程,它通过监听Kubernetes API或Consul等配置中心实时更新路由规则。
Traefik的架构由多个组件构成:Provider负责从不同来源获取配置;Router负责将请求匹配到相应的服务;Middleware在请求到达服务前进行修改,如认证、限流、重试等;Service将请求转发到实际的后端。
Traefik Ingress Controller的部署:
apiVersion:apps/v1
kind:Deployment
metadata:
name:traefik
namespace:ingress
spec:
replicas:2
selector:
matchLabels:
app:traefik
template:
metadata:
labels:
app:traefik
spec:
serviceAccountName:traefik-ingress-controller
containers:
-name:traefik
image:traefik:v3.0.4
args:
---api.insecure
---accesslog
---entrypoints.http.address=:80
---entrypoints.https.address=:443
---providers.kubernetesingress
---providers.kubernetescrd
---log.level=INFO
---metrics.prometheus
ports:
-name:http
containerPort:80
-name:https
containerPort:443
-name:admin
containerPort:8080
livenessProbe:
httpGet:
path:/ping
port:8080
initialDelaySeconds:10
periodSeconds:10
readinessProbe:
httpGet:
path:/ping
port:8080
periodSeconds:5
resources:
requests:
cpu:100m
memory:128Mi
limits:
cpu:500m
memory:512Mi
3.2 IngressRoute资源
Traefik提供了自己的CRD——IngressRoute,它比Kubernetes原生Ingress更强大,支持更多配置选项:
apiVersion:traefik.io/v1alpha1
kind:IngressRoute
metadata:
name:demo-ingressroute
namespace:default
spec:
entryPoints:
-web
-websecure
routes:
-match:Host(`demo.example.com`)&&PathPrefix(`/api`)
kind:Rule
services:
-name:api-service
port:80
middlewares:
-name:strip-api-prefix
-name:rate-limit
-match:Host(`demo.example.com`)&&PathPrefix(`/`)
kind:Rule
services:
-name:frontend-service
port:80
tls:
secretName:demo-tls-cert
3.3 Middleware中间件
Traefik的Middleware是强大的请求处理组件,可以在路由层面添加认证、重试、重定向、限流等功能。
基本认证中间件:
apiVersion:traefik.io/v1alpha1 kind:Middleware metadata: name:basic-auth namespace:default spec: basicAuth: secret:basic-auth-secret --- apiVersion:v1 kind:Secret metadata: name:basic-auth-secret namespace:default type:Opaque stringData: users:| admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/
IP白名单中间件:
apiVersion:traefik.io/v1alpha1 kind:Middleware metadata: name:ip-whitelist namespace:default spec: ipWhiteList: sourceRange: -"10.0.0.0/8" -"192.168.1.0/24" ipStrategy: depth:0
限流中间件:
apiVersion:traefik.io/v1alpha1 kind:Middleware metadata: name:rate-limit namespace:default spec: rateLimit: average:100 burst:50 period:1s
重试中间件:
apiVersion:traefik.io/v1alpha1 kind:Middleware metadata: name:retry namespace:default spec: retry: attempts:3 initialInterval:100ms
重定向中间件:
apiVersion:traefik.io/v1alpha1 kind:Middleware metadata: name:https-redirect namespace:default spec: redirectScheme: scheme:https permanent:true
StripPrefix中间件:
apiVersion:traefik.io/v1alpha1 kind:Middleware metadata: name:strip-prefix namespace:default spec: stripPrefix: prefixes: -/api/v1 -/static
3.4 动态服务发现
Traefik支持多种Provider,除了Kubernetes Ingress和CRD外,还支持Consul、Etcd、ZooKeeper等外部配置源。
Consul Provider配置示例:
# 在Consul中注册服务
curl -X PUT http://consul:8500/v1/agent/service/register
-d'{
"ID": "web-1",
"Name": "web",
"Address": "10.0.1.100",
"Port": 8080,
"Check": {
"HTTP": "http://10.0.1.100:8080/health",
"Interval": "10s"
}
}'
Traefik Provider配置:
apiVersion:v1 kind:ConfigMap metadata: name:traefik-config namespace:ingress data: providers-consul-catalog:| address: consul:8500 endpoint: http://consul:8500 prefix: traefik requireConsistent: true refreshInterval: 10s exposedByDefault: false
3.5 TCP服务支持
Traefik不仅支持HTTP/HTTPS,还支持TCP和UDP服务:
apiVersion:traefik.io/v1alpha1
kind:IngressRouteTCP
metadata:
name:mysql-ingressroute
namespace:default
spec:
entryPoints:
-mysql
routes:
-match:HostSNI(`mysql.example.com`)
services:
-name:mysql-service
port:3306
tls:
passthrough:true
---
apiVersion:v1
kind:Service
metadata:
name:mysql-service
namespace:default
spec:
type:ClusterIP
ports:
-name:mysql
port:3306
targetPort:3306
TCP EntryPoint配置:
apiVersion:v1
kind:ConfigMap
metadata:
name:traefik-config
namespace:ingress
data:
servers-transport:|
[serversTransport]
insecureSkipVerify = true
entrypoints:|
[entryPoints]
[entryPoints.mysql]
address = ":3306"
[entryPoints.redis]
address = ":6379"
第四章 Envoy Proxy
4.1 架构与原理
Envoy是Lyft开发的开源边缘和服务代理,专为云原生架构设计。Envoy的架构基于xDS协议,通过监听配置源动态更新路由规则,无需重启进程。
Envoy的核心概念包括:Listener监听入口流量;Route配置路由规则;Cluster定义后端服务;Endpoint是具体的Pod地址;Filter是请求处理链;Health Check用于检测后端服务健康状态。
Envoy在Kubernetes中的部署通常通过Contour或Istio等项目实现。Contour是最常用的Envoy Ingress Controller实现。
4.2 Contour部署
Contour是Envoy的Kubernetes Ingress Controller实现,由Heptio(现VMware)开发。
apiVersion:apps/v1
kind:DaemonSet
metadata:
name:contour
namespace:projectcontour
spec:
replicas:2
selector:
matchLabels:
app:contour
template:
metadata:
labels:
app:contour
spec:
containers:
-name:contour
image:ghcr.io/projectcontour/contour:v1.28.2
command:
-contour
-serve
---xds-address=0.0.0.0
---xds-port=8001
---envoy-http-port=8080
---envoy-https-port=8443
---config-path=/config/contour.yaml
ports:
-name:xds
containerPort:8001
protocol:TCP
-name:http
containerPort:8080
protocol:TCP
-name:https
containerPort:8443
protocol:TCP
livenessProbe:
httpGet:
path:/healthz
port:8001
initialDelaySeconds:5
periodSeconds:10
readinessProbe:
httpGet:
path:/healthz
port:8001
periodSeconds:5
-name:envoy
image:ghcr.io/projectcontour/contour:v1.28.2
command:
-envoy
--c/config/envoy.json
---service-clusterprojectcontour
---service-node$(NODE_NAME)
env:
-name:NODE_NAME
valueFrom:
fieldRef:
fieldPath:spec.nodeName
ports:
-name:http
containerPort:8080
protocol:TCP
-name:https
containerPort:8443
protocol:TCP
Contour也支持Gateway API,这是Kubernetes网络的新标准:
apiVersion:gateway.networking.k8s.io/v1
kind:Gateway
metadata:
name:prod-gateway
namespace:ingress
spec:
gatewayClassName:contour
listeners:
-name:http
port:80
protocol:HTTP
allowedRoutes:
namespaces:
from:Same
-name:https
port:443
protocol:HTTPS
allowedRoutes:
namespaces:
from:Same
tls:
mode:Terminate
certificateRefs:
-name:demo-cert
---
apiVersion:gateway.networking.k8s.io/v1
kind:HTTPRoute
metadata:
name:demo-route
namespace:default
spec:
parentRefs:
-name:prod-gateway
namespace:ingress
hostnames:
-"demo.example.com"
rules:
-backendRefs:
-name:demo-service
port:80
4.3 HTTPProxy资源
Contour扩展了Kubernetes Ingress,提供了更强大的HTTPProxy CRD:
apiVersion:projectcontour.io/v1
kind:HTTPProxy
metadata:
name:demo-proxy
namespace:default
spec:
virtualhost:
fqdn:demo.example.com
cors:
allow-credentials:true
allow-headers:
-X-Custom-Header
allow-methods:
-GET
-POST
-PUT
-DELETE
allow-origin:
-"https://allowed.example.com"
max-age:"86400"
routes:
-conditions:
-prefix:/api
services:
-name:api-service
port:80
healthcheck:
path:/health
interval:10s
timeout:5s
unhealthythreshold:3
healthythreshold:2
loadBalancerPolicy:
strategy:WeightedLeastRequest
retryPolicy:
retryOn:gateway-error,connect-failure,reset
numRetries:3
perTryTimeout:10s
-conditions:
-prefix:/
services:
-name:frontend-service
port:80
rateLimit:
global:
descriptors:
-entries:
-key:remote_addr
rateLimitValue:
requests:100
unit:minute
tcpproxy:
services:
-name:tcp-service
port:9000
weight:1
4.4 限流配置
Envoy支持多种限流策略:全局限流基于令牌桶算法,所有服务共享限流配额;本地限流在每个Envoy实例独立执行;基于请求属性的限流可以组合多个维度。
全局限流示例:
apiVersion:projectcontour.io/v1
kind:TLSPolicy
metadata:
name:ratelimit-policy
namespace:default
spec:
limits:
-units:second
requests:100
condition:
-requestHeader:
headerName:X-Forwarded-For
count:1
本地限流注解:
apiVersion:v1 kind:Service metadata: name:api-service annotations: projectcontour.io/lb-num-retries:"3" projectcontour.io/retry-on:"gateway-error,connect-failure,reset" projectcontour.io/per-try-timeout:"10s" spec: ports: -port:80 targetPort:8080 selector: app:api
4.5 健康检查与负载均衡
Envoy支持主动和被动两种健康检查方式。
主动健康检查配置:
apiVersion:projectcontour.io/v1
kind:HTTPProxy
metadata:
name:healthcheck-proxy
namespace:default
spec:
virtualhost:
fqdn:api.example.com
routes:
-services:
-name:api-service
port:80
healthcheck:
path:/healthz
interval:10s
timeout:5s
expected-status:"200-299"
unhealthythreshold:3
healthythreshold:2
负载均衡策略:
apiVersion:projectcontour.io/v1
kind:HTTPProxy
metadata:
name:lb-proxy
namespace:default
spec:
virtualhost:
fqdn:app.example.com
routes:
-loadBalancerPolicy:
strategy:Random
services:
-name:app-service
port:80
支持的负载均衡策略:
| 策略 | 说明 |
|---|---|
| RoundRobin | 轮询,默认策略 |
| WeightedLeastRequest | 加权最少请求 |
| Random | 随机选择 |
| Cookie | 基于Cookie的会话保持 |
| Header | 基于请求头的会话保持 |
第五章 三者综合对比
5.1 性能对比
性能是Ingress Controller的重要考量因素,以下是基于公开测试数据的对比。
原生Nginx性能最优,它的请求处理延迟最低,吞吐量最高。这得益于Nginx多年的性能优化和事件驱动架构。
Traefik v3相比v2版本性能提升显著,但在高并发场景下仍略逊于Nginx。Traefik的动态配置能力带来了少量性能开销,但对于中低流量应用影响很小。
Envoy采用C++实现,性能表现优秀。Envoy的优势在于其可扩展性,支持在请求处理链中添加多个Filter而不显著影响性能。
实测数据参考(单实例,8核CPU,16GB内存):
| 方案 | QPS | P99延迟 | 内存占用 |
|---|---|---|---|
| Nginx Ingress | 50,000+ | 5ms | 150MB |
| Traefik v3 | 35,000+ | 8ms | 200MB |
| Envoy (Contour) | 40,000+ | 6ms | 300MB |
5.2 功能特性对比
| 功能 | Nginx Ingress | Traefik | Envoy (Contour) |
|---|---|---|---|
| 七层路由 | 支持 | 支持 | 支持 |
| 四层代理 | 支持 | 支持 | 支持 |
| WebSocket | 支持 | 支持 | 支持 |
| gRPC | 支持 | 支持 | 支持 |
| TCP/UDP | 支持 | 支持 | 支持 |
| TLS终止 | 支持 | 支持 | 支持 |
| 自动HTTPS | 支持(Cert-Manager) | 支持(内置) | 支持(Cert-Manager) |
| 限流 | 注解/全局 | Middleware | 全局限流 |
| 认证 | 注解 | Middleware | CRD配置 |
| 重试/超时 | 注解 | Middleware | CRD配置 |
| 金丝雀发布 | 注解 | 无原生支持 | HTTPProxy |
| 熔断 | 无 | 无 | 支持 |
| 动态配置 | reload | 热更新 | 热更新 |
| 指标暴露 | Prometheus | Prometheus/Datadog | Prometheus |
| 追踪 | Zipkin/Jaeger | OpenTelemetry | OpenTelemetry/Zipkin |
5.3 配置复杂度对比
Nginx Ingress的配置相对直观,对于熟悉Nginx的运维工程师来说学习曲线平缓。大量在线资源和企业实践经验使得问题解决相对容易。
Traefik的配置最简洁,声明式的IngressRoute和Middleware设计使得配置易于理解。它的自动服务发现减少了手动配置工作。
Envoy的功能最强大,但配置也最复杂。Contour在一定程度上简化了Envoy的配置,但高级特性仍需要理解Envoy的架构。对于团队技术实力较强、需要细粒度控制的场景,Envoy是理想选择。
5.4 生态与社区对比
Nginx Ingress拥有最成熟的企业生态,大量生产环境案例和完善的文档。Nginx公司提供商业支持Nginx Ingress Controller Plus。
Traefik由Traefik Labs维护,社区活跃,文档质量高。Traefik企业版提供更多企业级特性。
Envoy是Envoyproxy基金会和CNCF项目的重要组成部分,也是Istio服务网格的数据平面。Envoy在服务网格领域占据主导地位,选择Envoy可以获得整个云原生生态系统的好处。
第六章 选型建议与最佳实践
6.1 场景化选型
中小规模集群(Pod数量小于1000)
推荐方案:Nginx Ingress Controller或Traefik
原因:配置简单,文档完善,生态成熟。Nginx的性能足够应对中低流量,业务场景不需要复杂的金丝雀发布和流量管理。
大规模高流量集群
推荐方案:Nginx Ingress Controller或Envoy
原因:需要关注性能和稳定性。Nginx在简单场景下性能最优,Envoy在需要细粒度流量管理时更有优势。
需要精细流量管理的场景
推荐方案:Envoy(Contour)
原因:Envoy的xDS协议和丰富的Filter链支持复杂的流量管理需求,如熔断、重试、限流、故障注入等。
服务网格集成
推荐方案:Envoy
原因:Istio、Linkerd等主流服务网格都使用Envoy作为数据平面。选择Envoy Ingress Controller可以与现有服务网格技术栈保持一致。
6.2 部署架构建议
生产环境建议使用DaemonSet模式部署Ingress Controller,确保每个节点都有入口:
apiVersion:apps/v1 kind:DaemonSet metadata: name:nginx-ingress namespace:ingress-nginx spec: selector: matchLabels: app:nginx-ingress template: metadata: labels: app:nginx-ingress spec: hostNetwork:true dnsPolicy:ClusterFirstWithHostNet containers: -name:controller image:registry.k8s.io/ingress-nginx/controller:v1.9.4 args: -/nginx-ingress-controller ---configmap=$(POD_NAMESPACE)/nginx-configuration ---report-node-internal-ip-address env: -name:POD_NAME valueFrom: fieldRef: fieldPath:metadata.name -name:POD_NAMESPACE valueFrom: fieldRef: fieldPath:metadata.namespace ports: -name:http hostPort:80 containerPort:80 -name:https hostPort:443 containerPort:443
高可用部署建议:
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:nginx-ingress
namespace:ingress-nginx
spec:
scaleTargetRef:
apiVersion:apps/v1
kind:Deployment
name:nginx-ingress-controller
minReplicas:2
maxReplicas:10
metrics:
-type:Resource
resource:
name:cpu
target:
type:Utilization
averageUtilization:70
-type:Resource
resource:
name:memory
target:
type:Utilization
averageUtilization:80
6.3 安全配置
TLS配置最佳实践:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:secure-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect:"true"
nginx.ingress.kubernetes.io/hsts-max-age:"31536000"
nginx.ingress.kubernetes.io/hsts-include-subdomains:"true"
nginx.ingress.kubernetes.io/proxy-buffer-size:"128k"
nginx.ingress.kubernetes.io/server-snippet:|
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
spec:
ingressClassName:nginx
tls:
-hosts:
-example.com
secretName:example-tls
rules:
-host:example.com
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:frontend
port:
number:80
6.4 监控配置
Prometheus指标暴露是生产环境的必备能力:
apiVersion:v1 kind:Service metadata: name:nginx-ingress-controller-metrics namespace:ingress-nginx annotations: prometheus.io/port:"10254" prometheus.io/scrape:"true" spec: ports: -name:metrics port:10254 targetPort:metrics selector: app:nginx-ingress --- apiVersion:monitoring.coreos.com/v1 kind:ServiceMonitor metadata: name:nginx-ingress namespace:monitoring spec: selector: matchLabels: app:nginx-ingress endpoints: -port:metrics interval:15s namespaceSelector: matchNames: -ingress-nginx
Grafana仪表板推荐使用公开社区仪表板:
Nginx Ingress Controller: ID 9614
Traefik: ID 10162
Envoy: ID 13261
第七章 排障指南
7.1 查看Ingress Controller状态
# 查看Controller日志 kubectl logs -n ingress-nginx -l app=nginx-ingress -f # 查看最近事件 kubectl get events -n ingress-nginx --sort-by='.lastTimestamp' # 查看Controller配置 kubectlexec-n ingress-nginx deploy/nginx-ingress-controller -- nginx-ingress-controller --show-config
7.2 常见问题与解决
问题1:Ingress无法访问,返回404
排查步骤:
# 1. 检查Ingress资源是否存在 kubectl get ingress -n default # 2. 检查Ingress地址配置 kubectl describe ingress demo-ingress -n default # 3. 检查Endpoints是否就绪 kubectl get endpoints -n default # 4. 检查Service配置 kubectl get svc -n default # 5. 检查Pod是否运行正常 kubectl get pods -n default -l app=demo # 6. 检查DNS解析 kubectlexec-ittest-pod -- nslookup demo-service
问题2:证书错误或TLS不工作
# 检查Secret是否存在
kubectl get secret demo-tls -n default
# 验证证书内容
kubectl get secret demo-tls -n default -o jsonpath='{.data.tls.crt}'| base64 -d | openssl x509 -text -noout
# 检查证书过期时间
kubectl get secret demo-tls -n default -o jsonpath='{.data.tls.crt}'| base64 -d | openssl x509 -enddate -noout
# 检查Cert-Manager状态(如使用)
kubectl get certificate -n default
kubectl describe certificate demo-cert -n default
问题3:限流未生效
# 检查限流注解是否正确配置 kubectl describe ingress rate-limit-ingress -n default # 查看Controller日志中的限流信息 kubectl logs -n ingress-nginx -l app=nginx-ingress | grep -ilimit # 验证ConfigMap中的限流配置 kubectl get configmap nginx-configuration -n ingress-nginx -o yaml
7.3 性能问题排查
# 查看资源使用情况 kubectl top pods -n ingress-nginx # 检查连接数 kubectlexec-it nginx-ingress-controller-xxx -n ingress-nginx -- wget -qO- http://localhost:10254/status # 查看upstream状态(Nginx Ingress) kubectlexec-it nginx-ingress-controller-xxx -n ingress-nginx -- cat /etc/nginx/nginx.conf | grep -A 50"upstream"
7.4 日志分析
Nginx Ingress访问日志格式配置:
apiVersion:v1 kind:ConfigMap metadata: name:nginx-configuration namespace:ingress-nginx data: log-format-upstream:| '$remote_addr $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_time $upstream_response_time $upstream_connect_time ' 'route=$upstream_route'
分析日志发现慢请求:
# 提取慢请求日志
kubectl logs -n ingress-nginx -l app=nginx-ingress |
awk'{if($NF > 1) print}'| sort -k9 -nr | head -20
结语
Nginx Ingress Controller、Traefik和Envoy是当前最主流的三种Ingress Controller方案。它们各有优势:Nginx性能最优、生态最成熟;Traefik配置最简洁、动态能力最强;Envoy功能最丰富、与服务网格集成最紧密。
选型时应综合考虑团队技术栈、性能需求、功能需求和运维能力。对于大多数场景,Nginx Ingress Controller是稳妥的选择;对于追求配置简洁和动态能力的团队,Traefik值得考虑;对于需要精细流量控制和计划使用服务网格的场景,Envoy是理想选择。
无论选择哪种方案,都应该建立完善的监控告警体系,制定 Ingress Controller的运维流程,并定期进行故障演练,确保在生产环境中能够快速响应和恢复。
参考资料
Kubernetes Ingress官方文档:https://kubernetes.io/docs/concepts/services-networking/ingress/
Nginx Ingress Controller官方文档:https://kubernetes.github.io/ingress-nginx/
Traefik官方文档:https://doc.traefik.io/traefik/
Contour官方文档:https://projectcontour.io/docs/
Envoy官方文档:https://www.envoyproxy.io/docs/envoy/latest/
-
网络
+关注
关注
14文章
8327浏览量
95546 -
模型
+关注
关注
1文章
3810浏览量
52253 -
kubernetes
+关注
关注
0文章
273浏览量
9530
原文标题:Kubernetes Ingress Controller 对比解析:Nginx、Traefik、Envoy 特性与性能
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
leader选举在kubernetes controller中是如何实现的
Kubernetes Ingress 高可靠部署最佳实践
Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布
再次升级!阿里云Kubernetes日志解决方案
阿里云Serverless Kubernetes通过Ingress提供7层服务访问
全球公测,阿里云Serverless Kubernetes 更快、更强、更省心
解析Kubernetes监控指标获取方式对比
BFE Ingress Controller基于BFE实现的Kubernetes Ingress Controller
快速了解kubernetes
APISIX Ingress VS Ingress NGINX详细对比
带你快速了解 kubernetes
k8s生态链包含哪些技术
腾讯云和华为云的ingress路径匹配规则把我绕晕了
Kubernetes Ingress Controller对比解析
评论