Skip to content

简介

Kubernetes Ingress 是一种 API 对象,用于管理对集群内服务的外部访问。它通常用于 HTTP/HTTPS 流量的路由,并提供负载均衡、SSL/TLS 终止和基于名称的虚拟主机等功能。Ingress 本身并不直接处理流量,而是通过 Ingress Controller 来实现这些功能。常见的 Ingress Controller 有 Nginx、Traefik、HAProxy 等。

安装

helm repo add appstore https://charts.grapps.cn
helm repo update appstore
helm install ingress-nginx appstore/ingress-nginx  --version 4.7.1

样例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress # Ingress 资源的名称
  annotations: # 用于配置 Ingress Controller 的特定行为
    nginx.ingress.kubernetes.io/rewrite-target: /  # 重写目标路径
    nginx.ingress.kubernetes.io/ssl-redirect: "true"  # 强制重定向到 HTTPS
spec:
  tls:
    - hosts:
        - example.com  # 域名
      secretName: example-tls  # TLS 证书的 Secret 名称
  rules:
    - host: example.com  # 域名
      http:
        paths:
          - path: /service1  # 请求路径
            pathType: Prefix  # 路径类型(Prefix/Exact/ImplementationSpecific)
            backend:
              service:
                name: service1  # 服务名称(集群内部)
                port:
                  number: 80  # 服务端口(集群内部)
          - path: /service2
            pathType: Prefix
            backend:
              service:
                name: service2
                port:
                  number: 80

对外提供服务使用Ingress和NodePort的区别?

在 Kubernetes 中,Service 的 NodePort 类型确实可以将服务暴露到集群外部,但使用 Ingress 有更多的优势和适用场景

更灵活的路由规则

  • NodePort 的限制:
  • NodePort 只能通过特定的端口暴露服务,无法根据请求的路径或域名进行路由。
  • 如果有多个服务,每个服务都需要占用一个不同的端口,管理起来非常麻烦。
  • Ingress 的优势:
  • Ingress 可以根据请求的路径 (path) 或域名 (host) 将流量路由到不同的服务。
  • 例如:
    • example.com/service1 路由到 service1。
    • example.com/service2 路由到 service2。
  • 这样,多个服务可以共享同一个端口(通常是 80 或 443)。

支持 HTTPS

  • NodePort 的限制:
  • NodePort 本身不支持 HTTPS,如果需要 HTTPS,需要在应用层或外部负载均衡器上配置。
  • Ingress 的优势:
  • Ingress 原生支持 HTTPS,可以通过配置 TLS 证书实现安全的 HTTPS 访问。
  • 大多数 Ingress Controller(如 Nginx、Traefik)都支持自动管理 TLS 证书(例如通过 Let's Encrypt)。

集中管理外部访问

  • NodePort 的限制:
  • 每个 NodePort 服务都需要单独管理,端口冲突和端口范围限制可能导致管理复杂度增加。
  • Ingress 的优势:
  • Ingress 提供了一个统一的入口,集中管理所有外部访问。
  • 通过一个 Ingress 资源可以管理多个服务的路由规则,简化了配置和维护。

负载均衡

  • NodePort 的限制:
  • NodePort 本身不提供高级负载均衡功能,流量会直接转发到某个节点的端口。
  • 如果需要负载均衡,通常需要依赖外部的负载均衡器(如云服务商的 LB)。
  • Ingress 的优势:
  • Ingress Controller(如 Nginx、Traefik)通常内置了负载均衡功能,可以根据权重、会话保持等策略分发流量。
  • 支持更复杂的流量管理,如蓝绿部署、金丝雀发布等。

减少端口暴露

  • NodePort 的限制:
  • NodePort 需要在每个节点上开放一个端口(默认范围是 30000-32767),这会增加安全风险。
  • Ingress 的优势:
  • Ingress 只需要暴露 80(HTTP)和 443(HTTPS)端口,减少了端口暴露的数量,降低了安全风险。

支持高级功能

  • Ingress 的优势:
  • Ingress 支持许多高级功能,例如:
    • URL 重写
    • 流量镜像
    • 请求速率限制
    • 身份验证(如 OAuth、JWT)
    • 自定义错误页面
  • 这些功能在 NodePort 中是无法实现的。

与云服务集成

  • Ingress 的优势:
  • 在云环境中,Ingress 通常与云服务商的负载均衡器(如 AWS ALB、GCP Load Balancer)集成,提供更强大的功能。
  • 例如,AWS ALB Ingress Controller 可以自动创建和管理 AWS 应用负载均衡器。

总结

  • 使用 NodePort 的场景:
  • 适合简单的测试环境或临时暴露服务。
  • 不需要复杂的路由规则或 HTTPS。
  • 使用 Ingress 的场景:
  • 适合生产环境,尤其是需要 HTTPS、复杂路由规则、负载均衡和高级功能的场景。
  • 提供了更强大、更灵活的外部访问管理能力。 因此,在生产环境中,Ingress 通常是更好的选择,而 NodePort 更适合临时或简单的场景。