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 服务(如数据库、消息队列)时。