Service 基础
约 613 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › K8s › 网络与服务(在新窗口打开) › Service 基础
为什么需要 Service
Pod 有生命周期——可能因扩缩容、更新、节点故障而重建。每次重建 IP 会变化。Service 提供稳定的 IP 和 DNS 名称,并将请求负载均衡到一组 Pod。
Service 类型
ClusterIP(默认)
仅在集群内部可访问:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80 # Service 端口
targetPort: 3000 # Pod 容器端口# 查看 Service
kubectl get svc
# NAME TYPE CLUSTER-IP PORT(S)
# myapp-service ClusterIP 10.96.0.1 80/TCP
# 集群内通过 CLUSTER-IP 或服务名访问
kubectl run test --image=busybox --rm -it --restart=Never -- wget -qO- http://myapp-serviceNodePort
在每个节点上开放一个端口(30000-32767)→ Service → Pod:
spec:
type: NodePort
ports:
- port: 80
targetPort: 3000
nodePort: 30080 # 不指定则随机分配# 通过任意节点 IP + NodePort 访问
curl http://192.168.1.10:30080LoadBalancer
云服务商自动创建外部负载均衡器:
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 3000# 获取外部 IP
kubectl get svc
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
# myapp-service LoadBalancer 10.96.0.1 xx.xx.xx.xx 80:30080/TCP端口命名规范
spec:
ports:
- name: http
port: 80
targetPort: 8080
- name: metrics
port: 9090
targetPort: 9090最佳实践:始终为端口命名,便于后续 Ingress 和 NetworkPolicy 引用。
多端口 Service
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 8080
- name: admin
port: 8080
targetPort: 9090Headless Service
ClusterIP: None 表示不分配 ClusterIP,直接返回后端 Pod IP 列表:
apiVersion: v1
kind: Service
metadata:
name: statefulset-svc
spec:
clusterIP: None # Headless
selector:
app: stateful-app
ports:
- port: 80主要用于 StatefulSet 的稳定 DNS 解析,以及客户端需要直连所有 Pod 的场景。
Endpoint 与标签选择器
# 查看 Service 背后的 Endpoint
kubectl get endpoints myapp-service
# NAME ENDPOINTS AGE
# myapp-service 10.1.0.5:3000,10.1.0.6:3000 5m
# 手动创建 Service(不指定 selector)
# 然后手动维护 Endpoint
apiVersion: v1
kind: Endpoints
metadata:
name: external-db
subsets:
- addresses:
- ip: 192.168.1.100
ports:
- port: 3306小结
- Service 提供稳定的网络入口,三种类型:ClusterIP(集群内)、NodePort(节点端口)、LoadBalancer(外部负载均衡)。
selector决定哪些 Pod 接收流量,port是 Service 端口,targetPort是 Pod 端口。- Headless Service(
ClusterIP: None)用于 StatefulSet 的稳定 DNS 和客户端直连。 kubectl get endpoints查看 Service 实际关联的 Pod IP。- 多端口 Service 需为每个端口命名。
上一节:DaemonSet 与 Job/CronJob 下一节:Ingress 与 DNS
