HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 网络架构师学习手册

    • 网络架构师学习教程
    • 基础篇

      • 第1章 网络模型与数据流转
      • 第2章 以太网与二层通信
      • 第3章 IP路由与三层转发
      • 第4章 TCP与可靠传输
      • 第5章 应用层协议
    • Linux网络栈

      • 第6章 数据包接收路径
      • 第7章 多核网络优化
      • 第8章 Netfilter与防火墙
      • 第9章 流量控制与QoS
    • 虚拟网络

      • 第10章 Network Namespace基础
      • 第11章 Bridge与互联
      • 第12章 VXLAN与Overlay网络
      • 第13章 OVS与SDN
    • Kubernetes网络

      • 第14章 CNI模型与实现
      • 第15章 kube-proxy与Service实现
      • 第16章 CoreDNS与服务发现
      • 第17章 NetworkPolicy与安全隔离
      • 第18章 Calico网络深度解析
      • 第19章 Cilium与eBPF网络
    • 网络架构

      • 第20章 网络设备与拓扑设计
      • 第21章 网络容量规划与计算
      • 第22章 负载均衡架构设计
      • 第23章 高可用网络架构
      • 第24章 网络安全架构
    • 性能调优

      • 第25章 系统级网络调优
      • 第26章 故障排查方法论
      • 第27章 生产环境案例分析
    • 前沿技术

      • 第28章 eBPF深度实践
      • 第29章 ServiceMesh与边车代理
      • 第30章 网络技术趋势与未来展望
    • 附录

      • 附录A:命令速查手册
      • 附录B:排错决策树
      • 附录C:学习资源
      • 附录D:技能图谱

第15章 kube-proxy与Service实现

学习目标

  • 理解kube-proxy的工作原理和实现机制
  • 掌握Service的三种代理模式(userspace、iptables、ipvs)
  • 了解Service发现和负载均衡的实现
  • 能够排查Service相关的网络问题

前置知识

  • 第14章:CNI模型
  • 第8章:Netfilter与防火墙
  • 第4章:TCP与可靠传输

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 工作流程

  1. 监听变化:kube-proxy监听API Server的Service和Endpoint变化
  2. 规则生成:根据Service配置生成相应的网络规则
  3. 规则应用:将规则应用到内核(iptables/ipvs)
  4. 流量转发:根据规则将流量转发到后端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 延伸阅读

  • Kubernetes Service Documentation
  • kube-proxy Source Code
  • IPVS Documentation
  • CoreDNS Documentation

下一章:第16章 CoreDNS

返回目录:README

Prev
第14章 CNI模型与实现
Next
第16章 CoreDNS与服务发现