在 Kubernetes 集群中,Service 是一种抽象,它定义了一组 Pod 的逻辑集合,并为这些 Pod 提供了一个统一的访问入口点。Service 主要功能包括服务发现、负载均衡和对外部访问的支持。下面是 Kubernetes 中 Service 的实战操作步骤:
创建 Service
1. 部署应用
首先,你需要有一个正在运行的 Deployment 或 StatefulSet,其中包含一组具有相同标签(Label)的 Pod。例如,创建一个运行 Nginx 的 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.10
ports:
- containerPort: 80
2. 创建 Service
接下来,创建一个 Service 来代理和暴露这个 Deployment 的服务:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP # 可以根据需要选择其他类型,如 NodePort、LoadBalancer 或 ExternalName
selector
字段用来关联这个 Service 与那些具有app: nginx
标签的 Pod。ports
字段定义了 Service 提供的端口映射,这里的port
是 Service 的端口,targetPort
是 Pod 上监听的端口。
3. 应用 Service 配置
应用上述 Service 配置到 Kubernetes 集群:
kubectl apply -f service-definition.yaml
不同类型的 Service
- ClusterIP(默认):为 Service 分配一个仅在集群内部可见的虚拟 IP 地址。
- NodePort:在每个节点上开放一个端口,外部可以通过任何节点的 IP 和 NodePort 访问 Service。
- LoadBalancer:在云服务商支持的情况下,创建一个外部负载均衡器,将流量转发到 NodePort。
- ExternalName:返回一个 CNAME 记录,指向一个外部服务的 DNS 名称。
验证 Service
- 查看 Service 是否创建成功以及其详细信息:
kubectl get services
kubectl describe service nginx-service
- 若创建的是 NodePort 或 LoadBalancer 类型的 Service,可以尝试从外部访问服务(如果是 ClusterIP 类型,则只能在集群内部访问)。
使用 Service
集群内部的其他 Pod 可以通过 Service 的名称和端口来访问这些 Pod,Kubernetes 会自动完成负载均衡。
高级功能
- Session Affinity:可以通过设置
sessionAffinity
为ClientIP
来实现会话保持。 - Health Checks:可以通过 readinessProbe 和 livenessProbe 来确保只有健康的 Pod 被包含在 Service 的负载均衡池中。
- Endpoints:Kubernetes 会自动维护一个 Service 对应的所有 Pod IP 的 Endpoint 资源。
通过 Kubernetes Service,可以轻松实现服务发现、负载均衡以及网络流量的管理,这对于大规模分布式应用来说至关重要。