标签搜索

Kubemetes`Service`

cicaba
2025-06-09 / 0 评论 / 1 阅读 / 正在检测是否收录...

Service 的主要作用:
服务发现 (Service Discovery): Service 提供了一个稳定的名称和 IP 地址,其他 Pod 或外部客户端可以通过这个名称或 IP 地址来发现并访问服务。Kubernetes DNS 会为 Service 创建一个 DNS 记录。
负载均衡 (Load Balancing): Service 将到来的请求分发到其背后的一个或多个健康的 Pod 上。Kubernetes 支持多种负载均衡算法(取决于 kube-proxy 的模式)。
隐藏 Pod 的动态性: Service 将客户端与后端 Pod 解耦,客户端不需要关心后端 Pod 的创建、删除、IP 地址变化等细节。
提供不同的访问方式: Service 提供了多种不同的方式来暴露服务,满足不同的访问需求(集群内部、集群外部)。

这张图片概括了 Kubernetes 中 Service 的核心迭代,特别是 kube-proxy 组件的代理模式演进。图片中的文字内容总结如下:

Service - 核心迭代

  • 在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP (虚拟 IP) 的形式。
  • 在 Kubernetes v1.0 版本,代理完全在 userspace (用户空间)。
  • 在 Kubernetes v1.1 版本,新增了 iptables 代理,但并不是默认的运行模式。
  • 从 Kubernetes v1.2 起,默认就是 iptables 代理。
  • 在 Kubernetes v1.8.0-beta.0 中,添加了 ipvs 代理。
  • Userspace: 最早的实现方式,性能较差。
  • Iptables: 成为主要的代理模式,提高了性能,但存在可伸缩性问题。
  • IPVS: 作为新的高性能代理模式被引入,解决了 iptables 在大规模集群中的性能瓶颈。

Service 的主要类型 (spec.type):

  • ClusterIP (默认类型):
    特点: Service 会被分配一个集群内部的 IP 地址(ClusterIP)。
    访问方式: 只能在集群内部访问 Service,通过 Service 的名称或 ClusterIP。
    用途: 主要用于集群内部的服务间通信。
  • NodePort:
    特点: 在所有节点上打开一个固定的端口(NodePort),并将流量转发到 Service 的 ClusterIP。
    访问方式: 可以通过集群中任何一个节点的 IP 地址加上 NodePort 来访问服务,例如 :
    用途: 方便从集群外部访问服务,常用于开发环境或简单的外部暴露需求。但 NodePort 端口范围有限 (默认为 30000-32767),且需要所有节点都开放该端口,不利于生产环境扩展和管理。
  • LoadBalancer:
    特点: 在云提供商环境中使用时,会自动创建一个外部负载均衡器,并将流量导入到 NodePort Service。
    访问方式: 客户端通过云提供商分配的外部负载均衡器 IP 地址访问服务。
    用途: 在云环境中将服务暴露给外部世界,提供公网访问和高级负载均衡功能。
    注意: 非云环境需要额外的组件来实现 LoadBalancer 功能 (如 MetalLB)。
  • ExternalName:
    特点: 将 Service 映射到外部的 DNS 名称。
    访问方式: 客户端通过 Service 的名称访问,Kubernetes DNS 会将其解析到外部 DNS 名称。不会创建 ClusterIP 或 NodePort。
    用途: 方便地将集群内部的服务调用重定向到外部服务,而无需修改应用程序代码。

会话亲和性
会话亲和性是指将来自同一个客户端的请求始终转发到同一个后端 Pod 的能力。
配置 Service 的会话亲和性:
您可以在 Service 的 .spec 中配置 sessionAffinity 字段来启用会话亲和性。
sessionAffinity (string): 可选字段。指定 Service 的会话亲和性类型。目前支持两种类型:
None (默认值): 不启用会话亲和性,请求会根据 Service 的调度算法(如轮询、最少连接等)在后端 Pod 之间随机或均匀分发。
ClientIP: 基于客户端的 IP 地址实现会话亲和性。来自同一个客户端 IP 地址的所有请求都会被转发到同一个后端 Pod。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - port: 80
      name: http
      targetPort: 80
      nodePort: 30080
    - port: 443
      name: https
      targetPort: 443
      nodePort: 30443
  sessionAffinity: ClientIP #会话亲和性
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600  # 1 小时

Endpoints
Endpoints 是一组实际服务的端点集合。一个 Endpoint 是一个可访问的服务端点,即一个状态为 running 的 pod 的可访问访问端点。一般 Pod 都不是一个独立存在,所以一组 Pod 的端点合在一起称为 EndPoints。只有被 Service Selector 匹配选中并且状态为 Running 的才会被加入到和 Service 同名的 Endpoints 中。

apiVersion: v1
kind: Endpoints
metadata:
  name: nginx-service # 与 Service 同名
  namespace: default # 与 Service 同命名空间
subsets:
- addresses: # 这是 Service Controller 自动填充的 Pod IP 地址列表
  - hostname: nginx-deployment-xxxxxxxxxx-yyyyy # Pod 的主机名 (可选)
    ip: 10.244.0.10 # 第一个 Nginx Pod 的实际 IP 地址
    nodeName: <node-name-1> # Pod 所在的节点 (可选)
  - hostname: nginx-deployment-xxxxxxxxxx-zzzzz # Pod 的主机名 (可选)
    ip: 10.244.0.11 # 第二个 Nginx Pod 的实际 IP 地址
    nodeName: <node-name-2> # Pod 所在的节点 (可选)
  ports: # 这是 Service 的 targetPort
  - port: 80 # 对应 Service 定义的 targetPort: 80
    protocol: TCP

publishNotReadyAddresses
认情况下,Service 的 Endpoints 中只包含那些处于 Ready 状态的 Pod 的地址。Ready 状态通常是由 Pod 的 readiness probe 决定的。这意味着如果一个 Pod 正在启动中、正在执行启动前的初始化任务、或者 readiness probe 失败,它就不会被认为是可用的端点,Service 也不会将流量转发给它。
publishNotReadyAddresses 参数是在 Service 的 .spec 中配置的,与 selector、ports 等字段处于同一级别。

0

评论 (0)

取消