个人随笔
目录
Kubernetes 集群服务暴露详解:Nginx Ingress Controller 实操全笔记
2026-06-28 16:54:24
在 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.yaml

2.2.2 修改服务类型(核心配置)

默认服务类型为 NodePort,修改为 LoadBalancer,固定外网访问入口:
修改 YAML 中 Service 资源的spec.type 字段:
# 原配置
type: NodePort

# 修改后配置
type: LoadBalancer

2.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.yml

3.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-nginx

3.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-nginx

3.1.4 客户端模拟访问测试

  1. 获取 Ingress 外网 IP:kubectl get svc -n ingress-nginx |grep ingress
  2. 外网机器配置 hosts 解析(模拟 DNS):
vim /etc/hosts
192.168.10.91 www.kubemsb.com
  1. 修改两个 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
  1. 访问测试,轮询返回不同页面,验证负载均衡生效:
curl www.kubemsb.com

3.2 案例二:基于 URI 路径的负载均衡

实现:同一域名下,不同 URL 路径转发至不同后端服务,/svc1 访问服务1,/svc2 访问服务2。

3.2.1 部署两套独立业务应用

分别创建 nginx-uri-1.ymlnginx-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: 80

3.2.3 访问测试

  1. 外网机器配置 hosts:192.168.10.91 www.kubemsburi.com
  2. 分别修改两套服务的页面内容
  3. 路径访问验证:
curl www.kubemsburi.com/svc1/index.html
curl www.kubemsburi.com/svc2/index.html

3.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-nginx

3.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: 80

3.3.4 HTTPS 访问验证

  1. 配置 hosts 解析:192.168.10.91 www.kubemsbhost.com
  2. 浏览器访问 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 节点端口访问能力。

四、总结

  1. 选型建议:新手入门、常规 Web 业务首选 Nginx Ingress;API 网关场景选 Kong;微服务精细化治理选 Istio;轻量化动态路由选 Traefik。
  2. 核心优势:Ingress 统一集群入口,替代多 NodePort 端口暴露,支持域名、路径、HTTPS 等高级路由,大幅简化服务暴露架构。
  3. 生产建议:官方 ingress-nginx 已停止迭代,新项目可逐步迁移至 Gateway API 生态;生产环境务必使用可信 SSL 证书、配置 Ingress 高可用、开启限流和健康检查。
 6

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2