Ingress 是 Kubernetes 中的网络资源,用于管理外部 HTTP/HTTPS 流量进入集群的路由规则。它不像 Service 暴露端口,而是基于域名和路径智能路由流量到后端 Pod/Service,常用于微服务架构的 API 网关。

这个文件名为 mes-ingress,针对一个 MES(Manufacturing Execution System,制造执行系统)应用,定义了基于主机名 mes.local 的路由规则。将流量根据路径(如 /api/device)转发到不同的后端服务(如 device-service)。它假设您有 Ingress Controller(如 Nginx Ingress)已安装。

文件结构逐行解释

YAML 文件是分层的,以下是关键部分:

  1. apiVersion 和 kind(资源版本和类型):

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    
    • apiVersion: networking.k8s.io/v1 – 指定 Kubernetes API 组和版本(v1 是 Ingress 的稳定版本,支持 Kubernetes 1.19+)。
    • kind: Ingress – 声明这是一个 Ingress 资源,用于流量路由。
  2. metadata(元数据):

    metadata:
      name: mes-ingress
    
    • name: mes-ingress – Ingress 的唯一名称,在命名空间中标识这个资源。应用时用 kubectl apply -f mes-ingress.yaml 创建。
  3. spec(规范,核心配置):

    spec:
      rules:
      - host: mes.local
        http:
          paths:
          - path: /api/device
            pathType: Prefix
            backend:
              service:
                name: device-service
                port:
                  number: 8081
    
    • rules: 路由规则列表。这里只有一个规则,基于主机名(host)匹配。
      • host: mes.local – 匹配的域名。外部请求到 http://mes.local 时生效(需在 hosts 文件或 DNS 配置 mes.local 指向 Ingress IP)。
      • http: HTTP 流量规则(不支持 HTTPS,除非添加 TLS 部分)。
      • paths: 路径列表,按顺序匹配(前缀匹配)。
        • path: /api/device – 路径前缀。如果请求 URL 以 /api/device 开头(如 /api/device/info),路由到后端。
        • pathType: Prefix – 匹配类型(前缀匹配;其他选项如 Exact 精确匹配)。
        • backend.service: 后端目标。
          • name: device-service – Kubernetes Service 名(假设已存在,指向 device-service Pod)。
          • port.number: 8081 – Service 的目标端口(从之前 Docker Compose 上下文匹配)。

    类似地,其他路径路由:

    • /api/productionproduction-service:8082(生产服务)。
    • /api/tracetrace-service:8083(跟踪服务)。
    • /api/predictpredict-service:8084(预测服务)。
    • /mes-frontend:80(根路径到前端,默认捕获所有未匹配流量)。
整体作用和使用
  • 作用:在 Kubernetes 集群中,实现基于域名的路径路由。例如:

    • 请求 http://mes.local/api/device/status → 转发到 device-service 的 8081 端口。
    • 请求 http://mes.local/ → 转发到 mes-frontend 的 80 端口(Web UI)。
      这简化了微服务暴露,避免每个服务单独暴露端口,提高安全性和可管理性。
  • 部署步骤

    1. 前提:集群有 Ingress Controller(如 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml)。
    2. 应用配置
      kubectl apply -f mes-ingress.yaml
      
    3. 验证
      kubectl get ingress mes-ingress  # 查看状态
      kubectl describe ingress mes-ingress  # 详细描述
      
    4. 访问:编辑本地 /etc/hosts 添加 127.0.0.1 mes.local,浏览器访问 http://mes.local 测试。
    5. 删除kubectl delete ingress mes-ingress
  • 扩展建议

    • HTTPS:添加 tls 部分和 Secret(证书)。
    • 负载均衡:默认 Ingress 支持多后端 Pod 均衡。
    • MES 上下文:结合之前Docker compose,这是从 Compose 迁移到 K8s 的 Ingress 配置,用于生产环境。

更多推荐