Kubernetes(k8s)中的 Service 是一种抽象,它定义了一组 Pod 的逻辑集合和一个访问它们的策略。Service 的主要目的是为一组 Pod 提供一个稳定的网络端点,即使 Pod 的 IP 地址发生变化(例如,由于 Pod 的重启或扩展)。以下是 Service 的工作原理和一些关键概念:
1. Service 的类型
Kubernetes 支持多种类型的 Service:
-
ClusterIP:默认类型,为 Service 分配一个集群内部的 IP 地址,只能在集群内部访问。
-
NodePort:在每个节点的 IP 上暴露一个端口,使得外部流量可以通过节点的 IP 和端口访问 Service。
-
LoadBalancer:在云平台上创建一个外部负载均衡器,并将流量转发到 Service。
-
ExternalName:将 Service 映射到一个 DNS 名称,而不是一个 IP 地址。
2. Service 的创建
你可以通过 YAML 文件定义一个 Service:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
在这个例子中,selector
指定了哪些 Pod 属于这个 Service。ports
定义了 Service 的端口和目标 Pod 的端口。type
指定了 Service 的类型。
3. Service 的工作原理
3.1 ClusterIP
-
ClusterIP 类型的 Service 为 Service 分配一个集群内部的 IP 地址。
-
这个 IP 地址只能在集群内部访问。
-
Service 通过
kube-proxy
组件将流量转发到后端的 Pod。
3.2 NodePort
-
NodePort 类型的 Service 在每个节点的 IP 上暴露一个端口。
-
外部流量可以通过节点的 IP 和端口访问 Service。
-
例如,如果 NodePort 是 30001,那么你可以通过
http://<NodeIP>:30001
访问 Service。
3.3 LoadBalancer
-
LoadBalancer 类型的 Service 在云平台上创建一个外部负载均衡器。
-
负载均衡器将流量转发到 Service,Service 再将流量转发到后端的 Pod。
-
例如,在 AWS 上,Kubernetes 会创建一个 ELB(Elastic Load Balancer)。
3.4 ExternalName
-
ExternalName 类型的 Service 将 Service 映射到一个 DNS 名称。
-
例如,你可以将 Service 映射到
my.database.example.com
。
4. Service 的负载均衡
Service 通过 kube-proxy
组件实现负载均衡。kube-proxy
运行在每个节点上,负责将流量转发到后端的 Pod。kube-proxy
支持多种模式:
-
Userspace 模式:在用户空间中进行流量转发。
-
iptables 模式:使用 iptables 规则进行流量转发。
-
IPVS 模式:使用 IPVS(IP Virtual Server)进行流量转发,提供更高的性能和可扩展性。
5. Service 与 Endpoints
Service 通过 Endpoints
对象与后端的 Pod 关联。Endpoints
对象包含了属于 Service 的所有 Pod 的 IP 地址和端口。当 Pod 的 IP 地址发生变化时,Endpoints
对象会自动更新。
6. Service 的 DNS
Kubernetes 集群中的 DNS 服务会为每个 Service 创建一个 DNS 记录。例如,名为 my-service
的 Service 会有一个 DNS 记录 my-service.default.svc.cluster.local
。集群中的 Pod 可以通过这个 DNS 名称访问 Service。
7. Service 的会话保持
默认情况下,Service 使用轮询(Round Robin)策略进行负载均衡。如果你需要会话保持(Session Affinity),可以在 Service 的定义中设置 sessionAffinity
字段为 ClientIP
。
总结
Service 是 Kubernetes 中用于管理网络访问的重要抽象。它为一组 Pod 提供了一个稳定的网络端点,并支持多种类型的访问方式(如 ClusterIP、NodePort、LoadBalancer 和 ExternalName)。通过 kube-proxy
组件,Service 实现了负载均衡,并将流量转发到后端的 Pod。Service 与 Endpoints
对象和 DNS 服务紧密结合,提供了强大的网络管理功能。