
在 Kubernetes 中,Service 是一种抽象,定义了一组逻辑上的 Pod 以及访问这些 Pod 的策略。Service 使得应用程序组件之间的通信更加稳定和可靠,提供了服务发现和负载均衡的功能。以下是关于 Service 服务发现与负载均衡的详细介绍。
ExternalName:将 Service 映射到 DNS 名称,用于服务的外部发现。
Service 使用标签选择器(Selector)来确定它所代理的 Pod 集合。Selector 匹配指定标签的 Pod,并将流量分发给这些 Pod。
Service 创建的 Endpoint 对象包含了与之匹配的所有 Pod 的 IP 地址和端口信息,用于实际的流量分发。
以下是一个基本的 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
使用 kubectl apply 命令创建 Service:
kubectl apply -f myservice.yaml
查看当前命名空间下的所有 Service:
kubectl get services
删除特定 Service:
kubectl delete service myservice
Kubernetes 在 Pod 启动时,为每个 Service 创建相应的环境变量。对于名为 myservice 的 Service,可能会创建以下环境变量:
MYSERVICE_SERVICE_HOST=<service_ip>
MYSERVICE_SERVICE_PORT=80
Kubernetes 通过集成的 DNS 服务来提供服务发现功能。可以直接使用 Service 名称进行 DNS 查询,从而获取 Service 的 IP 地址:
ping myservice
对于不同命名空间的 Service,可以通过 <service-name>.<namespace>.svc.cluster.local
的格式进行访问:
ping myservice.mynamespace.svc.cluster.local
Kubernetes Service 提供了多种方式实现负载均衡:
默认情况下,ClusterIP 类型的 Service 使用 kube-proxy 实现基于 iptables 或 IPVS 的负载均衡,将流量均匀分发到与之关联的 Pod。
NodePort 类型的 Service 通过每个节点上固定的端口暴露服务,并将进入该端口的流量转发到集群内的 Pod 上。这种类型的 Service 适用于需要外部访问的场景。
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
type: NodePort
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
nodePort: 30007 # 映射到集群中每个节点的固定端口
LoadBalancer 类型的 Service 依赖于云提供商的负载均衡器,将流量分发到集群中的 Pod。这种类型的 Service 适用于需要高可用和外部访问的场景。
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
type: LoadBalancer
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
Kubernetes Service 支持会话亲和性(Session Affinity),即将同一个客户端的流量始终转发到同一个 Pod。可以通过 sessionAffinity 字段配置:
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
sessionAffinity: ClientIP
对于不需要负载均衡的情况,可以创建 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 集群中的服务。