Ingress 和 Service 的异同点


在 Kubernetes 中,Ingress 和 Service 都是用于管理和暴露应用流量的重要组件。下面从多个维度详细分析它们的异同点、特性、使用场景和配置方法。

1. 概念与作用

1.1 Ingress

Ingress 是什么?

Ingress主要负责七层负载,将外部 HTTP/HTTPS 请求路由到集群内部的服务。它可以基于域名和路径定义规则,从而将外部请求分配到不同的服务。

图片

ingress作用

  • 提供 基于 HTTP/HTTPS 的路由。
  • 支持 TLS 终止(HTTPS)。
  • 为集群内部多个服务提供一个 统一的访问入口。
  • 提供高级功能,如 路径重写、反向代理、负载均衡。

1.2 Service

Service 是什么?

Service主要是面向四层负载,基于TCP传输,用于将流量分发到一组 Pod。Service 抽象出 Pod 的网络访问,提供稳定的网络接口,即使 Pod 动态变化,其访问方式仍保持不变。

图片

Service作用:

  • 提供 Pod 的 服务发现 和 负载均衡。
  • 允许集群内外部流量访问特- 定的 Pod。
  • 支持多种访问类型,包括 ClusterIP、NodePort、LoadBalancer 和 ExternalName。

2. 使用场景

使用场景 Ingress Service
多个 HTTP/HTTPS 服务的统一入口 Ingress 可配置域名和路径规则,为多个服务提供统一入口。 Service 无法管理多个服务,只能处理一个服务的流量。
内部服务通信 不适合用于集群内部通信。 使用 ClusterIP 类型的 Service 实现 Pod 之间通信。
外部流量接入 通过 Ingress 控制器暴露服务,适用于 HTTP/HTTPS 流量。 通过 NodePort 或 LoadBalancer 类型暴露服务。
TCP/UDP 流量 不支持,仅处理 HTTP/HTTPS。 支持 TCP、UDP 流量,通过 Service 直接转发。
域名路由 支持基于域名的路由规则。 不支持域名路由。
复杂流量管理(SSL、重定向等) 支持多种高级功能,如 TLS、路径重写等。 只提供基础的流量转发功能。

3. 关键特性对比

3.1 Ingress 特性

协议支持

仅支持 HTTP 和 HTTPS。

路由规则

基于 域名 和 路径 进行路由。

例如,根据路径 /app1 路由到 Service A,路径 /app2 路由到 Service B。

TLS 支持

支持 HTTPS,TLS 终止直接在 Ingress 层进行。配置 TLS 后,用户访问时自动升级为 HTTPS。

负载均衡

在 Ingress 层负载均衡到不同的 Service。每个 Service 内部 Pod 之间的负载均衡由 Service 实现。

3.2 Service 特性

协议支持:

支持 HTTP、HTTPS、TCP、UDP 等多种协议。

Service类型

  • ClusterIP(默认):仅在集群内部可访问。
  • NodePort:通过每个节点上的特定端口暴露服务。
  • LoadBalancer:通过云提供商的负载均衡器暴露服务。
  • ExternalName:将请求重定向到外部 DNS 名称。

负载均衡

Service 将流量分发到其关联的多个 Pod,实现 Pod 级别的负载均衡。

服务发现

Kubernetes 自动为每个 Service 创建一个 DNS 入口,集群内其他服务可以通过 服务名 访问。

4.两者的关系

4.1 Ingress 依赖于 Service

Ingress 本身并不直接与 Pod 通信,它将请求转发到 Service,而 Service 再将流量分发到具体的 Pod。

4.2 典型的流量路径:

  • 用户请求 通过域名或 IP 访问 Ingress。

  • Ingress 根据配置规则,将流量转发到对应的 Service。

  • Service 负责将流量分配到 Pod。

图片

4.3 Service 可以独立于 Ingress

Service 可以单独使用,而不需要依赖 Ingress。

例如,NodePort 和 LoadBalancer 类型的 Service 可以直接暴露服务给外部。

5. 配置示例

5.1 Service 示例

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80           # Service 暴露的端口
      targetPort: 8080   # Pod 的应用监听端口
  type: LoadBalancer     # 暴露为外部负载均衡

类型:LoadBalancer,会向外部分配一个云提供商的负载均衡 IP。

流量转发:将端口 80 的请求转发到目标 Pod 的 8080 端口。

5.2 Ingress 示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com                # 域名
    http:
      paths:
      - path: /app1                 # 路径匹配
        pathType: Prefix            # 路径前缀匹配
        backend:
          service:
            name: service-app1       # 目标 Service
            port:
              number: 80
      - path: /app2
        pathType: Prefix             # 路径前缀匹配
        backend:
          service:
            name: service-app2       # 另一个 Service
            port:
              number: 80

路由规则:

  • 访问 example.com/app1 时流量会路由到 service-app1。
  • 访问 example.com/app2 时流量会路由到 service-app2。
  • 高级功能:通过 Annotations 配置路径重写。

6 主要区别总结

对比点 Ingress Service
作用范围 管理外部 HTTP/HTTPS 流量,路由到内部的多个服务。 提供对单个服务(多个 Pod)的访问方式。
协议支持 仅支持 HTTP/HTTPS 支持多种协议(TCP/UDP/HTTP/HTTPS 等)
负载均衡对象 在多个服务之间负载均衡。 在同一服务的多个 Pod 之间负载均衡。
是否必须依赖 必须依赖 Ingress Controller 才能生效。 独立运行,不依赖额外组件。
高级功能 支持域名、路径路由、TLS 终止等 不支持高级路由,提供基础的流量分发和负载均衡

7 使用场景

使用 Ingress 的场景:

  • 当需要路由 HTTP/HTTPS 流量到多个服务时。
  • 需要域名管理、路径重写、TLS 等高级功能。
  • 希望通过一个入口点管理多个 HTTP 应用的外部访问。

使用 Service 的场景:

  • 当只需暴露一个服务时,可以直接使用 NodePort 或 LoadBalancer。
  • 在集群内服务之间通信时,使用 ClusterIP。
  • 需要暴露非 HTTP/HTTPS 服务(如数据库、消息队列)时。