跳至正文

TECHNICAL KNOWLEDGE / 技术栈

从架构思路,到实现细节。

技术选型、工程实践与部署记录,逐步展开来看。

沟通你的技术问题 ↗

在 Kubernetes 中,Service 是一种抽象,定义了一组逻辑上的 Pod 以及访问这些 Pod 的策略。Service 使得应用程序组件之间的通信更加稳定和可靠,提供了服务发现和负载均衡的功能。以下是关于 Service 服务发现与负载均衡的详细介绍。

 

Service 基本概念

1. Service 类型

  • ClusterIP(默认):在集群内部创建一个虚拟 IP,供集群内部的 Pod 访问。
  • NodePort:在每个节点上开放一个相同的端口,通过这个端口可以从外部访问 Service。
  • LoadBalancer:使用云提供商的负载均衡器,将外部流量分发到 Service(需要云环境支持)。
  • ExternalName:将 Service 映射到 DNS 名称,用于服务的外部发现。

     

2. 服务选择器(Selector)

Service 使用标签选择器(Selector)来确定它所代理的 Pod 集合。Selector 匹配指定标签的 Pod,并将流量分发给这些 Pod。

 

3. Endpoint

Service 创建的 Endpoint 对象包含了与之匹配的所有 Pod 的 IP 地址和端口信息,用于实际的流量分发。

 

Service 配置示例

以下是一个基本的 ClusterIP 类型 Service 配置示例:

apiVersion: v1
kind: Service
metadata:
  name: myservice
  labels:
    app: myapp
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      # Service 暴露的端口
      port: 80       
      # Pod 中的目标端口
      targetPort: 8080 

 

创建和管理 Service

创建 Service

使用 kubectl apply 命令创建 Service:

kubectl apply -f myservice.yaml

 

查看 Service

查看当前命名空间下的所有 Service:

kubectl get services

 

删除 Service

删除特定 Service:

kubectl delete service myservice

 

服务发现

1. 环境变量方式

Kubernetes 在 Pod 启动时,为每个 Service 创建相应的环境变量。对于名为 myservice 的 Service,可能会创建以下环境变量:

MYSERVICE_SERVICE_HOST=<service_ip>
MYSERVICE_SERVICE_PORT=80

 

2. DNS 方式

Kubernetes 通过集成的 DNS 服务来提供服务发现功能。可以直接使用 Service 名称进行 DNS 查询,从而获取 Service 的 IP 地址:

ping myservice

 

对于不同命名空间的 Service,可以通过 <service-name>.<namespace>.svc.cluster.local 的格式进行访问:

ping myservice.mynamespace.svc.cluster.local

 

负载均衡

Kubernetes Service 提供了多种方式实现负载均衡:

1. ClusterIP 负载均衡

默认情况下,ClusterIP 类型的 Service 使用 kube-proxy 实现基于 iptables 或 IPVS 的负载均衡,将流量均匀分发到与之关联的 Pod。

 

2. NodePort 负载均衡

NodePort 类型的 Service 通过每个节点上固定的端口暴露服务,并将进入该端口的流量转发到集群内的 Pod 上。这种类型的 Service 适用于需要外部访问的场景。

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30007  # 映射到集群中每个节点的固定端口

 

3. LoadBalancer 负载均衡

LoadBalancer 类型的 Service 依赖于云提供商的负载均衡器,将流量分发到集群中的 Pod。这种类型的 Service 适用于需要高可用和外部访问的场景。

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080

 

高级功能

1. Session Affinity

Kubernetes Service 支持会话亲和性(Session Affinity),即将同一个客户端的流量始终转发到同一个 Pod。可以通过 sessionAffinity 字段配置:

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
  sessionAffinity: ClientIP

 

2. Headless Service

对于不需要负载均衡的情况,可以创建 Headless Service。Headless Service 不会分配 ClusterIP,而是直接将 DNS 请求解析到后端 Pod 的 IP 地址上。

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  clusterIP: None
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080

 

总结

Service 是 Kubernetes 中实现服务发现和负载均衡的关键组件。通过使用不同类型的 Service(如 ClusterIP、NodePort、LoadBalancer 和 ExternalName),可以满足应用程序内部通信、外部访问和高可用的需求。结合 DNS 服务发现、会话亲和性和 Headless Service 等高级功能,可以灵活、高效地管理 Kubernetes 集群中的服务。