0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes Ingress Controller对比解析

马哥Linux运维 来源:马哥Linux运维 2026-04-09 10:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

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 的 kube-controller-manager , kube-scheduler, 以及使用 Operator 的底层实现 controller-rumtime 都支持高可用系统中的 leader
    的头像 发表于 07-21 10:03 2581次阅读

    Kubernetes Ingress 高可靠部署最佳实践

    nginx-ingress-controllernginx-ingress-controller33333node-role.kubernetes.io/ingress=true42s~ kubectl -n kube-system get pod -o wide |
    发表于 04-17 14:35

    Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布

    摘要: 上文介绍了如何使用Ingress实现蓝绿发布。但是对于很多只提供tcp/udp的服务来说,七层的ingress不能很好的实现蓝绿发布的需求。这里我们就来介绍一下如何使用 SLB 来进行四层
    发表于 05-10 16:03

    再次升级!阿里云Kubernetes日志解决方案

    摘要: 今天阿里云Kubernetes日志解决方案再次升级,为您带来以下改进: 1、极致部署体验:只需一条命令一个参数即可完成整个K8S集群的日志解决方案部署。 2、支持更多配置方式:除原生控制台
    发表于 05-28 19:08

    Ingress增强现实游戏简绍

    Ingress是谷歌于2012年11月16日发布的增强现实(Augmented Reality)大型多人在线游戏(MMOG)。
    发表于 08-08 07:16

    阿里云Serverless Kubernetes通过Ingress提供7层服务访问

    摘要: 在阿里云Serverless Kubernetes集群中,我们可以通过LoadBalancer Service对外提供四层服务访问,同样我们也可以通过Ingress来对外提供七层服务访问
    发表于 07-23 14:02 2114次阅读
    阿里云Serverless <b class='flag-5'>Kubernetes</b>通过<b class='flag-5'>Ingress</b>提供7层服务访问

    全球公测,阿里云Serverless Kubernetes 更快、更强、更省心

    Controller即可轻松使用Ingress。3 Service Account在Serverless Kubernetes中,默认开启Service Account功能,这就意味pod默认有权限访问
    发表于 08-17 17:45 665次阅读

    解析Kubernetes监控指标获取方式对比

    对比 node-exporter用于采集服务器层面的运行指标,包括机器的loadavg、filesystem、meminfo等基础监控,类似于传统主机监控维度的zabbix-agent
    的头像 发表于 09-26 10:45 2057次阅读

    BFE Ingress Controller基于BFE实现的Kubernetes Ingress Controller

    ./oschina_soft/ingress-bfe.zip
    发表于 05-16 10:43 2次下载
    BFE <b class='flag-5'>Ingress</b> <b class='flag-5'>Controller</b>基于BFE实现的<b class='flag-5'>Kubernetes</b> <b class='flag-5'>Ingress</b> <b class='flag-5'>Controller</b>

    快速了解kubernetes

    Master 即主节点,负责控制整个 kubernetes 集群。它包括 Api Server、Scheduler、Controller 等组成部分。它们都需要和 Etcd 进行交互以存储数据。
    发表于 08-03 10:38 751次阅读

    APISIX Ingress VS Ingress NGINX详细对比

    下列表格中,对比Ingress NGINX 和 APISIX Ingress 基本功能,包括协议支持、鉴权方式、上游探针/策略、负载均衡策略、Kubenertes 集成等。以下表格数据取自learnk8s.io。
    的头像 发表于 01-11 15:31 1996次阅读

    带你快速了解 kubernetes

    节点,负责控制整个 kubernetes 集群。它包括 Api Server、Scheduler、Controller 等组成部分。它们都需要和 Etcd 进行交互以存储数据。 Api Server:
    的头像 发表于 01-17 10:00 3643次阅读

    k8s生态链包含哪些技术

    去监听 K8s 中的 Ingress 资源,并对这些资源进行相应规则的解析和实际承载流量。在当下趋势中,像 Kubernetes Ingress Nginx 就是使用最广泛的
    的头像 发表于 08-07 10:56 2306次阅读
    k8s生态链包含哪些技术

    腾讯云和华为云的ingress路径匹配规则把我绕晕了

    本文主要调研了Tke的两类ingress,分别是应用型CLB和Nginx ingress Controller,这两类ingress在页面创建时均不支持选择路径匹配规则,而二者关于路径
    的头像 发表于 01-08 15:59 2138次阅读
    腾讯云和华为云的<b class='flag-5'>ingress</b>路径匹配规则把我绕晕了

    Ingress Nginx性能调优配置方案

    Ingress Nginx 是 Kubernetes 集群中最主流的流量入口组件,承担着集群内所有 HTTP/HTTPS 流量的路由和转发。默认配置能应付开发测试环境,但一到生产环境扛高并发,各种
    的头像 发表于 02-24 11:50 273次阅读