16.4.1 Service资源与服务发现机制
Service资源与服务发现机制#
本节围绕Kubernetes中Service资源的作用、类型选择、流量转发路径与服务发现流程展开,通过示例、命令与排错步骤,掌握稳定服务入口的设计与验证。
Service原理与流量路径(原理草图)#
Service的作用与核心概念#
- 稳定访问入口:为一组Pod提供固定虚拟IP(ClusterIP)与统一端口。
- 负载均衡:将请求分发到后端Pod,实现水平扩展与高可用。
- 服务发现:通过DNS或环境变量让应用感知服务地址。
- 标签选择器:基于Label Selector动态绑定后端Pod集合。
- Ready门控:NotReady的Pod不会进入Endpoint,保障稳定性。
Service类型与适用场景#
- ClusterIP:集群内访问,微服务互调。
- NodePort:节点端口对外访问,测试与低并发场景。
- LoadBalancer:云负载均衡对外暴露,生产外网入口。
- ExternalName:CNAME映射外部域名。
- Headless Service:无ClusterIP,返回Pod列表,适合StatefulSet。
关键概念:Endpoint 与 EndpointSlice#
- Endpoint:Service选择器匹配到的Pod IP与端口集合。
- EndpointSlice:大规模集群分片管理,提升性能。
- 无选择器Service:可手动创建Endpoint,指向外部服务。
实战示例:创建Service并验证服务发现#
1)准备Namespace与应用#
kubectl create ns demo
cat > /tmp/web-deploy.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: demo
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
EOF
kubectl apply -f /tmp/web-deploy.yaml
kubectl -n demo get pods -o wide
2)创建ClusterIP Service#
cat > /tmp/web-svc.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: web-svc
namespace: demo
spec:
type: ClusterIP
selector:
app: web
ports:
- name: http
port: 80 # Service端口
targetPort: 80 # Pod端口
EOF
kubectl apply -f /tmp/web-svc.yaml
kubectl -n demo get svc web-svc
kubectl -n demo get endpoints web-svc
3)DNS解析与访问验证(临时Pod)#
kubectl -n demo run curl --image=curlimages/curl:8.5.0 -it --rm --restart=Never -- \
sh -c "nslookup web-svc.demo.svc.cluster.local && curl -s web-svc.demo.svc.cluster.local"
# 预期:nslookup返回ClusterIP;curl返回nginx默认页HTML
kube-proxy转发模式与命令验证#
- iptables模式:规则多但稳定。
- ipvs模式:内核级负载均衡,性能更优。
检查kube-proxy模式(以kubeadm集群为例):
kubectl -n kube-system get configmap kube-proxy -o yaml | grep -i mode -n
# 预期:mode: "iptables" 或 "ipvs"
会话保持示例#
cat > /tmp/web-svc-affinity.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: web-svc-affinity
namespace: demo
spec:
selector:
app: web
sessionAffinity: ClientIP
ports:
- port: 80
targetPort: 80
EOF
kubectl apply -f /tmp/web-svc-affinity.yaml
ExternalName与无选择器Service示例#
ExternalName#
cat > /tmp/extname.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: ext-google
namespace: demo
spec:
type: ExternalName
externalName: www.google.com
EOF
kubectl apply -f /tmp/extname.yaml
kubectl -n demo get svc ext-google
无选择器Service(手动Endpoint指向外部IP)#
cat > /tmp/ext-svc.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: ext-svc
namespace: demo
spec:
ports:
- port: 80
targetPort: 80
EOF
cat > /tmp/ext-ep.yaml <<'EOF'
apiVersion: v1
kind: Endpoints
metadata:
name: ext-svc
namespace: demo
subsets:
- addresses:
- ip: 1.1.1.1
ports:
- port: 80
EOF
kubectl apply -f /tmp/ext-svc.yaml
kubectl apply -f /tmp/ext-ep.yaml
kubectl -n demo get endpoints ext-svc
排错与验证清单(含命令解释)#
- Service是否存在
kubectl -n demo get svc web-svc
# 查看Service类型、ClusterIP、端口信息
- Endpoint是否生成
kubectl -n demo get endpoints web-svc -o yaml
# 若为空,检查Pod标签、就绪状态
- Pod是否Ready
kubectl -n demo get pods -l app=web -o wide
kubectl -n demo describe pod <pod-name> | grep -i ready -n
- DNS解析失败排查
kubectl -n kube-system get pods -l k8s-app=kube-dns
kubectl -n demo run dnsutils --image=registry.k8s.io/e2e-test-images/jessie-dnsutils:1.3 \
-it --rm --restart=Never -- nslookup web-svc.demo.svc.cluster.local
- 访问失败排查
kubectl -n demo run curl --image=curlimages/curl:8.5.0 -it --rm --restart=Never -- \
curl -v http://web-svc.demo.svc.cluster.local
# 观察HTTP返回码与连接耗时
练习题(可操作)#
- 将
web-svc修改为NodePort,并从集群外通过<NodeIP>:NodePort访问。 - 为
web-svc设置ExternalTrafficPolicy: Local,比较访问日志中的源IP是否变化。 - 创建Headless Service并验证DNS返回Pod列表(
dig A/ SRV记录)。 - 故意移除Pod标签,观察Endpoint变化并恢复。
小结#
通过Service类型选择、DNS发现与kube-proxy转发路径的验证,能够在集群中实现可靠的服务入口与访问解耦,并具备基本的排错与验证能力。