K8S重要概念区分:Ingress 和 Service 的异同点

科技   2024-11-20 07:30   广东  


 在 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. 使用场景

使用场景IngressService
多个 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 主要区别总结

对比点IngressService
作用范围管理外部 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 服务(如数据库、消息队列)时。


END


往期推荐


1

万字长文:K8S命令详解汇总【自用珍藏版】

2

Linux的150个常用命令汇总,运维大神不一定全部掌握!

3

局域网内构建统一可访问的YUM源(基础运维必备技能)

4

安装部署K8S集群环境(实测有效版本)

5

Dockerfile详解:构建简单高效的容器镜像

6

Nginx配置文件详解及常用功能配置(实用率90%)

运维李哥不背锅
专注于各种运维技术、,分享Linux基础知识,服务器,数据库,云原生和网络安全等相关技术,各种进阶知识等着你,助你成为技术达人!
 最新文章