在 Kubernetes 集群中,Pod、Service 仅能实现集群内部服务通信,若需要对外暴露业务服务、实现域名访问、负载均衡、HTTPS 加密等能力,就必须依赖 Ingress Controller。本文将详解各类 Ingress 控制器特性,并聚焦最常用的 Nginx Ingress Controller,从零完成部署、HTTP/URI/HTTPS 实战案例,覆盖企业常用服务暴露方案。
一、Ingress 控制器核心概述
1.1 Ingress 控制器作用
Ingress Controller 是 Kubernetes 集群的全局反向代理与负载均衡入口,核心作用是为集群外用户提供访问集群内部 Pod 的统一代理服务,替代传统 NodePort、LoadBalancer 的访问局限,支持域名路由、路径路由、SSL 加密等高级能力。
核心访问流程
外网用户 → Ingress Controller → Service → 后端业务 Pod
简单来说,Ingress 是规则配置资源,Ingress Controller 是真正执行代理、路由的服务组件。
1.2 主流 Ingress 控制器种类及对比
Kubernetes 生态拥有多款成熟的 Ingress 控制器,适配不同业务场景,以下是主流方案详细特性对比:
1.2.1 Kubernetes Ingress Controller(社区版 Nginx)
- 项目地址:http://github.com/nginxinc/kubernetes-ingress
- 实现语言:Go + Lua(Nginx 内核基于 C)
- 开源协议:Apache 2.0
- 核心特点:K8s 社区官方维护版本,基于原生 Nginx 扩展 Lua 插件实现额外功能;部署简单、上手门槛低,是普通运维/开发工程师的首选方案。
1.2.2 NGINX Ingress Controller(Nginx 官方版)
- 项目地址:http://github.com/kubernetes/ingress-nginx
- 实现语言:Go
- 开源协议:Apache 2.0
- 核心特点:Nginx 官方商业团队开发,无第三方 Lua 模块,稳定性、兼容性极强,性能优于社区版;全面支持 TCP/UDP 四层流量转发;缺点是开源版功能有限,流量拆分、高级路由能力缺失,商业版 Nginx Plus 可补齐能力。
- 重要提示:该项目已于 2026 年 3 月停止迭代维护,仅保留存量资源可用,新项目建议适配 Gateway API 或其他活跃方案。
1.2.3 Kong Ingress
- 项目地址:http://github.com/Kong/kubernetes-ingress-controller
- 实现语言:Go
- 开源协议:Apache 2.0
- 核心特点:基于 Nginx 构建,自带丰富的官方/第三方插件(限流、鉴权、请求转换等),原生适配 API 网关场景;通过 CRD 声明式配置;仅支持单命名空间部署,隔离性强但多环境部署成本更高。
1.2.4 Traefik
- 项目地址:http://github.com/containous/traefik
- 实现语言:Go
- 开源协议:MIT
- 核心特点:云原生专属反向代理,支持动态配置热更新(无需重启)、多负载均衡算法、内置 Web UI、自动 HTTPS 证书(Let’s Encrypt)、金丝雀发布、gRPC/WebSocket 适配;缺点是高可用部署依赖 KV 存储,部分高级功能仍在迭代。
1.2.5 HAProxy Ingress
- 项目地址:http://github.com/jcmoraisjr/haproxy-ingress
- 实现语言:Go(HAProxy 内核基于 C)
- 开源协议:Apache 2.0
- 核心特点:高性能四层/七层负载均衡,支持无损耗热配置更新、DNS 服务发现、自定义配置模板,负载均衡算法丰富,资源占用低、性能优异,适合高并发业务场景。
1.2.6 Voyager
- 项目地址:http://github.com/appscode/voyager
- 实现语言:Go
- 开源协议:Apache 2.0
- 核心特点:基于 HAProxy 封装,主打 L4 层 TCP 流量负载均衡,全面支持 HTTP/2、gRPC 协议,内置成熟的 Let’s Encrypt 证书自动化管理能力。
1.2.7 Contour
- 项目地址:http://github.com/heptio/contour
- 实现语言:Go
- 开源协议:Apache 2.0
- 核心特点:基于 Envoy 开发,通过 IngressRoute CRD 管理路由,多团队集群隔离性好,支持流量镜像、限流、精细流量监控;短板是不支持会话保持。
1.2.8 Istio Ingress
- 项目地址:http://istio.io/docs/tasks/traffic-management/ingress
- 实现语言:Go
- 开源协议:Apache 2.0
- 核心特点:全能服务网格方案,不止是 Ingress 入口,可管控集群所有内外流量,支持流量路由、权限管控、灰度发布、链路监控,适合微服务精细化治理场景。
1.2.9 Ambassador
- 实现语言:Python
- 开源协议:Apache 2.0
- 核心特点:基于 Envoy 的云原生 API 网关,深度适配 K8s 原生资源,可无缝对接 Istio、Linkerd 等服务网格,主打轻量化 API 治理。
1.2.10 Gloo
- 实现语言:Go
- 开源协议:Apache 2.0
- 核心特点:基于 Envoy 的「功能网关」,支持微服务、Serverless、遗留应用混合场景路由,插件化架构,核心功能开源、高级企业功能付费。
1.2.11 Skipper
- 实现语言:Go
- 开源协议:Apache 2.0
- 核心特点:轻量化 HTTP 反向代理,基于 Endpoints 直接路由 Pod,支持丰富的 HTTP 过滤器、动态路由热更新,适配简单 HTTP 业务场景。
二、Nginx Ingress Controller 实战部署
本文采用 Nginx 官方 Ingress Controller 进行实操,适配 K8s 标准集群,通过原生 YAML 方式部署,修改服务类型为 LoadBalancer 便于外网访问。
2.1 部署前置准备
- 正常运行的 Kubernetes 集群
- 节点可联网拉取镜像(镜像较大可提前离线下载)
- 集群支持 LoadBalancer 类型服务(物理集群可搭配 metallb)
2.2 下载并修改部署配置文件
2.2.1 下载官方部署 YAML
curl -k https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml -o deploy.yaml2.2.2 修改服务类型(核心配置)
默认服务类型为 NodePort,修改为 LoadBalancer,固定外网访问入口:
修改 YAML 中 Service 资源的
spec.type 字段:# 原配置
type: NodePort
# 修改后配置
type: LoadBalancer2.3 应用部署资源清单
kubectl apply -f deploy.yaml执行后会自动创建
ingress-nginx命名空间、服务账号、RBAC 权限、配置文件、控制器 Pod、准入控制器等全套资源。2.4 验证部署结果
2.4.1 查看 Pod 运行状态
kubectl get pods -n ingress-nginx正常结果:控制器 Pod 状态为 Running,两个准入任务 Pod 为 Completed。
2.4.2 查看全套资源
kubectl get all -n ingress-nginx确认
ingress-nginx-controller 服务拥有 EXTERNAL-IP,即为外网访问入口 IP。三、Ingress 核心实战案例
3.1 案例一:基于域名的 HTTP 负载均衡
实现:通过自定义域名
www.kubemsb.com 访问后端 Nginx 服务,Ingress 自动实现多 Pod 负载分发。3.1.1 部署后端 Nginx 应用
编写 deployment 配置
nginx.yml:apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: c1
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent应用配置:
kubectl apply -f nginx.yml3.1.2 创建 ClusterIP 服务
编写
nginx-service.yml:apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: ingress-nginx
labels:
app: nginx
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx应用并验证服务:
kubectl apply -f nginx-service.yml
kubectl get svc -n ingress-nginx3.1.3 创建 Ingress 路由规则
编写
ingress-nginx.yaml,绑定域名与后端服务:apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
namespace: ingress-nginx
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.kubemsb.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nginx-service
port:
number: 80应用并验证 Ingress:
kubectl apply -f ingress-nginx.yaml
kubectl get ingress -n ingress-nginx
kubectl describe ingress ingress-nginx -n ingress-nginx3.1.4 客户端模拟访问测试
- 获取 Ingress 外网 IP:
kubectl get svc -n ingress-nginx |grep ingress - 外网机器配置 hosts 解析(模拟 DNS):
vim /etc/hosts
192.168.10.91 www.kubemsb.com- 修改两个 Nginx Pod 首页内容,验证负载均衡:
# 修改第一个 Pod 页面
kubectl exec -it nginx-xxx -n ingress-nginx -- /bin/sh
echo "ingress web1" > /usr/share/nginx/html/index.html
exit
# 修改第二个 Pod 页面
kubectl exec -it nginx-xxx -n ingress-nginx -- /bin/sh
echo "ingress web2" > /usr/share/nginx/html/index.html
exit- 访问测试,轮询返回不同页面,验证负载均衡生效:
curl www.kubemsb.com3.2 案例二:基于 URI 路径的负载均衡
实现:同一域名下,不同 URL 路径转发至不同后端服务,
/svc1 访问服务1,/svc2 访问服务2。3.2.1 部署两套独立业务应用
分别创建
nginx-uri-1.yml、nginx-uri-2.yml 两套 Deployment,再对应创建两个 Service 资源,步骤同上。3.2.2 创建路径路由 Ingress 规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-uri
namespace: ingress-nginx
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.kubemsburi.com
http:
paths:
- path: /svc1
pathType: Prefix
backend:
service:
name: nginx-service-uri-1
port:
number: 80
- path: /svc2
pathType: Prefix
backend:
service:
name: nginx-service-uri-2
port:
number: 803.2.3 访问测试
- 外网机器配置 hosts:
192.168.10.91 www.kubemsburi.com - 分别修改两套服务的页面内容
- 路径访问验证:
curl www.kubemsburi.com/svc1/index.html
curl www.kubemsburi.com/svc2/index.html3.3 案例三:Ingress HTTPS 加密访问
实现:通过自签证书配置 HTTPS 加密访问,实现 HTTP 升级 HTTPS,保障传输安全。
3.3.1 生成自签 SSL 证书
mkdir ingress-https && cd ingress-https
# 生成私钥
openssl genrsa -out nginx.key 2048
# 生成自签证书
openssl req -new -x509 -key nginx.key -out nginx.pem -days 365填写证书信息(可自定义):国家 CN、省份 GD、城市 SZ、组织 IT、域名 kubemsbhost、邮箱 admin@kubemsbhost.com
3.3.2 创建 TLS 证书 Secret
kubectl create secret tls nginx-tls-secret --cert=nginx.pem --key=nginx.key -n ingress-nginx
kubectl get secrets -n ingress-nginx3.3.3 部署应用并配置 HTTPS Ingress
编写完整 YAML(Deployment+Service+Ingress):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx2
namespace: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx2
template:
metadata:
labels:
app: nginx2
spec:
containers:
- name: c1
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service2
namespace: ingress-nginx
labels:
app: nginx2
spec:
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
selector:
app: nginx2
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx2
namespace: ingress-nginx
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- www.kubemsbhost.com
secretName: nginx-tls-secret
rules:
- host: www.kubemsbhost.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nginx-service2
port:
number: 803.3.4 HTTPS 访问验证
- 配置 hosts 解析:
192.168.10.91 www.kubemsbhost.com - 浏览器访问
https://www.kubemsbhost.com
💡 说明:自签证书会提示不安全,生产环境请使用正规 CA 机构颁发的可信 SSL 证书。
3.4 案例四:Ingress + NodePort 混合访问
实现:后端服务为 NodePort 类型,Ingress 统一代理域名访问,兼顾内部端口访问和外网域名访问。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx3
namespace: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx3
template:
metadata:
labels:
app: nginx3
spec:
containers:
- name: c1
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service3
namespace: ingress-nginx
labels:
app: nginx3
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx3
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx3
namespace: ingress-nginx
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.kubemsb3.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nginx-service3
port:
number: 80配置 hosts 后,通过域名即可正常访问,同时保留 NodePort 节点端口访问能力。
四、总结
- 选型建议:新手入门、常规 Web 业务首选 Nginx Ingress;API 网关场景选 Kong;微服务精细化治理选 Istio;轻量化动态路由选 Traefik。
- 核心优势:Ingress 统一集群入口,替代多 NodePort 端口暴露,支持域名、路径、HTTPS 等高级路由,大幅简化服务暴露架构。
- 生产建议:官方 ingress-nginx 已停止迭代,新项目可逐步迁移至 Gateway API 生态;生产环境务必使用可信 SSL 证书、配置 Ingress 高可用、开启限流和健康检查。
