第15章 kube-proxy与Service实现
学习目标
- 理解kube-proxy的工作原理和实现机制
- 掌握Service的三种代理模式(userspace、iptables、ipvs)
- 了解Service发现和负载均衡的实现
- 能够排查Service相关的网络问题
前置知识
15.1 Service概述
15.1.1 什么是Service
Service是Kubernetes中用于暴露Pod服务的抽象,提供稳定的网络访问入口和负载均衡功能。
核心功能:
- 服务发现:通过DNS名称访问服务
- 负载均衡:在多个Pod之间分发流量
- 服务抽象:隐藏Pod的IP变化
- 健康检查:自动剔除不健康的Pod
15.1.2 Service类型
1. ClusterIP(默认)
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
2. NodePort
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
nodePort: 30080
3. LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
4. ExternalName
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: external.example.com
15.2 kube-proxy工作原理
15.2.1 kube-proxy架构
┌─────────────────────────────────────────────────────────────┐
│ kube-proxy Architecture │
├─────────────────────────────────────────────────────────────┤
│ API Server Watcher │
├─────────────────────────────────────────────────────────────┤
│ Service & Endpoint Controller │
├─────────────────────────────────────────────────────────────┤
│ Proxy Mode (iptables/ipvs/userspace) │
├─────────────────────────────────────────────────────────────┤
│ Network Rules (iptables rules / ipvs rules) │
└─────────────────────────────────────────────────────────────┘
15.2.2 工作流程
- 监听变化:kube-proxy监听API Server的Service和Endpoint变化
- 规则生成:根据Service配置生成相应的网络规则
- 规则应用:将规则应用到内核(iptables/ipvs)
- 流量转发:根据规则将流量转发到后端Pod
15.2.3 代理模式对比
| 模式 | 性能 | 功能 | 复杂度 | 推荐场景 |
|---|---|---|---|---|
| userspace | 低 | 完整 | 低 | 测试环境 |
| iptables | 高 | 基础 | 中 | 生产环境 |
| ipvs | 最高 | 丰富 | 高 | 高负载环境 |
15.3 iptables模式详解
15.3.1 iptables规则结构
Service规则链:
KUBE-SERVICES -> KUBE-SVC-<hash> -> KUBE-SEP-<hash>
规则示例:
# Service规则
-A KUBE-SERVICES -d 10.96.0.1/32 -p tcp --dport 443 -j KUBE-SVC-NPX46M4PTMTKRN6Y
# 负载均衡规则
-A KUBE-SVC-NPX46M4PTMTKRN6Y -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-ABC123
-A KUBE-SVC-NPX46M4PTMTKRN6Y -j KUBE-SEP-DEF456
# 目标Pod规则
-A KUBE-SEP-ABC123 -s 10.244.1.2/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-ABC123 -p tcp -j DNAT --to-destination 10.244.1.2:8080
15.3.2 查看iptables规则
# 查看所有Kubernetes相关规则
sudo iptables -t nat -L KUBE-SERVICES -n
# 查看特定Service规则
sudo iptables -t nat -L KUBE-SVC-NPX46M4PTMTKRN6Y -n
# 查看Endpoint规则
sudo iptables -t nat -L KUBE-SEP-ABC123 -n
# 查看规则统计
sudo iptables -t nat -L KUBE-SERVICES -n -v
15.3.3 iptables模式配置
kube-proxy配置:
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: iptables
iptables:
masqueradeAll: true
masqueradeBit: 14
minSyncPeriod: 0s
syncPeriod: 30s
15.4 IPVS模式详解
15.4.1 IPVS优势
- 性能更高:基于内核哈希表,性能优于iptables
- 负载均衡算法丰富:支持轮询、最少连接、源哈希等
- 连接保持:支持会话保持功能
- 统计信息:提供详细的连接统计
15.4.2 IPVS配置
启用IPVS模式:
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
ipvs:
scheduler: "rr" # 轮询算法
minSyncPeriod: 0s
syncPeriod: 30s
查看IPVS规则:
# 查看虚拟服务
sudo ipvsadm -ln
# 查看真实服务器
sudo ipvsadm -ln -t 10.96.0.1:443
# 查看统计信息
sudo ipvsadm -ln --stats
# 查看连接信息
sudo ipvsadm -ln --rate
15.4.3 IPVS负载均衡算法
1. 轮询(rr)
# 配置轮询算法
kubectl patch configmap kube-proxy -n kube-system --patch '{
"data": {
"config.conf": "mode: ipvs\nipvs:\n scheduler: \"rr\"\n"
}
}'
2. 最少连接(lc)
# 配置最少连接算法
kubectl patch configmap kube-proxy -n kube-system --patch '{
"data": {
"config.conf": "mode: ipvs\nipvs:\n scheduler: \"lc\"\n"
}
}'
3. 源哈希(sh)
# 配置源哈希算法
kubectl patch configmap kube-proxy -n kube-system --patch '{
"data": {
"config.conf": "mode: ipvs\nipvs:\n scheduler: \"sh\"\n"
}
}'
15.5 实验:Service实现分析
15.5.1 实验环境准备
创建测试应用:
# deployment.yaml
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.20
ports:
- containerPort: 80
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP
部署应用:
# 创建Deployment和Service
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# 查看Pod和Service
kubectl get pods -o wide
kubectl get svc
15.5.2 实验1:iptables模式分析
步骤1:查看Service信息
# 获取Service详细信息
kubectl get svc nginx-service -o yaml
# 查看Endpoint
kubectl get endpoints nginx-service
# 查看Service的ClusterIP
kubectl get svc nginx-service -o jsonpath='{.spec.clusterIP}'
步骤2:分析iptables规则
# 查看KUBE-SERVICES链
sudo iptables -t nat -L KUBE-SERVICES -n --line-numbers
# 查找Service规则
sudo iptables -t nat -L KUBE-SERVICES -n | grep nginx-service
# 查看负载均衡规则
sudo iptables -t nat -L KUBE-SVC-<hash> -n -v
步骤3:测试负载均衡
# 在Pod中测试
kubectl run test-pod --image=busybox -it --rm -- sh
# 在Pod内测试Service
wget -qO- http://nginx-service
wget -qO- http://nginx-service
wget -qO- http://nginx-service
# 查看iptables统计
sudo iptables -t nat -L KUBE-SVC-<hash> -n -v
15.5.3 实验2:IPVS模式分析
步骤1:切换到IPVS模式
# 编辑kube-proxy配置
kubectl edit configmap kube-proxy -n kube-system
# 修改mode为ipvs
# mode: ipvs
# ipvs:
# scheduler: "rr"
# 重启kube-proxy
kubectl rollout restart daemonset/kube-proxy -n kube-system
步骤2:查看IPVS规则
# 等待kube-proxy重启
kubectl rollout status daemonset/kube-proxy -n kube-system
# 查看IPVS虚拟服务
sudo ipvsadm -ln
# 查看特定Service的规则
sudo ipvsadm -ln -t <cluster-ip>:80
步骤3:测试IPVS负载均衡
# 测试负载均衡
for i in {1..10}; do
kubectl run test-pod-$i --image=busybox --rm -it --restart=Never -- wget -qO- http://nginx-service
done
# 查看IPVS统计
sudo ipvsadm -ln --stats
15.6 Service发现机制
15.6.1 DNS服务发现
CoreDNS配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
DNS查询示例:
# 在Pod中查询Service DNS
nslookup nginx-service.default.svc.cluster.local
# 查询简化名称
nslookup nginx-service
# 查看DNS记录
dig nginx-service.default.svc.cluster.local
15.6.2 环境变量服务发现
Pod环境变量:
# 查看Pod环境变量
kubectl exec <pod-name> -- env | grep SERVICE
# 输出示例
NGINX_SERVICE_SERVICE_HOST=10.96.0.1
NGINX_SERVICE_SERVICE_PORT=80
NGINX_SERVICE_SERVICE_PORT_80_TCP=tcp://10.96.0.1:80
NGINX_SERVICE_SERVICE_PORT_80_TCP_PROTO=tcp
NGINX_SERVICE_SERVICE_PORT_80_TCP_PORT=80
15.7 高级Service功能
15.7.1 Session Affinity
配置会话保持:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 3600
15.7.2 External Traffic Policy
Local模式:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
externalTrafficPolicy: Local
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
15.7.3 Service Topology
配置拓扑感知:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
topologyKeys:
- "kubernetes.io/hostname"
- "kubernetes.io/zone"
15.8 故障排查
15.8.1 常见问题诊断
问题1:Service无法访问
# 检查Service状态
kubectl get svc nginx-service
# 检查Endpoint
kubectl get endpoints nginx-service
# 检查Pod状态
kubectl get pods -l app=nginx
# 检查网络连通性
kubectl run test-pod --image=busybox -it --rm -- wget -qO- http://nginx-service
问题2:负载均衡不工作
# 检查iptables规则
sudo iptables -t nat -L KUBE-SVC-<hash> -n -v
# 检查IPVS规则
sudo ipvsadm -ln -t <cluster-ip>:80
# 检查kube-proxy日志
kubectl logs -n kube-system -l k8s-app=kube-proxy
问题3:DNS解析失败
# 检查CoreDNS状态
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 检查DNS配置
kubectl get configmap coredns -n kube-system -o yaml
# 测试DNS解析
kubectl run test-pod --image=busybox -it --rm -- nslookup nginx-service
15.8.2 调试工具
# 使用kubectl debug
kubectl debug <pod-name> -it --image=busybox
# 使用netshoot调试网络
kubectl run netshoot --image=nicolaka/netshoot -it --rm
# 查看kube-proxy配置
kubectl get configmap kube-proxy -n kube-system -o yaml
15.9 排错清单
15.9.1 Service配置检查
- [ ] Service的selector是否正确
- [ ] Pod的label是否匹配selector
- [ ] Service的port配置是否正确
- [ ] Endpoint是否正常创建
- [ ] kube-proxy是否正常运行
15.9.2 网络连通性检查
- [ ] Pod之间是否可以直接通信
- [ ] Service的ClusterIP是否可达
- [ ] DNS解析是否正常
- [ ] 防火墙规则是否正确
- [ ] 网络策略是否阻止流量
15.9.3 负载均衡检查
- [ ] 后端Pod是否健康
- [ ] 负载均衡规则是否正确
- [ ] 统计信息是否正常
- [ ] 会话保持是否生效
- [ ] 性能是否满足要求
15.10 延伸阅读
下一章:第16章 CoreDNS
返回目录:README