1.8 Kube Proxy

1.8 Kube Proxy 详解:Kubernetes 网络核心组件

一、Kube Proxy 核心理念

Kube Proxy 是 Kubernetes 集群中实现服务抽象的关键组件,负责维护节点上的网络规则,实现以下核心功能:

  1. 服务抽象:将 Service 的虚拟 IP (VIP) 映射到后端 Pod
  2. 负载均衡:在多个 Pod 副本间分配流量
  3. 网络代理:处理集群内外的网络通信
  4. 端点维护:跟踪 Pod 状态并更新转发规则

二、工作模式详解

Kube Proxy 支持三种工作模式,通过 --proxy-mode 参数指定:

1. Userspace 模式(已弃用)

  • 工作原理:在用户空间监听端口并转发流量
  • 性能特点:上下文切换开销大,性能最低

2. Iptables 模式(默认)

1
2
# 查看iptables规则
sudo iptables-save | grep KUBE-SVC-
  • 优势
    • 完全在内核空间处理
    • 无额外进程开销
  • 局限
    • 规则线性查找,性能随服务数量下降
    • 不支持高级负载均衡策略

3. IPVS 模式(推荐生产使用)

1
2
# 检查IPVS规则
sudo ipvsadm -Ln
  • 优势
    • 基于哈希表,性能最优
    • 支持多种负载均衡算法(rr, wrr, lc, wlc 等)
    • 更好的可扩展性
  • 配置方法
    1
    2
    3
    # 启动参数
    --proxy-mode=ipvs
    --ipvs-scheduler=rr # 轮询算法

三、Pod 网络模型

1. 跨节点虚拟网络

Pod network: 横跨集群中所有节点的内部虚拟网络

1
2
# 查看集群网络插件
kubectl get pods -n kube-system | grep -E 'flannel|calico|cilium'
  • 核心特性
    • 每个 Pod 获得唯一 IP(IP-per-Pod)
    • Pod 间直接通信,无需 NAT
    • 跨节点通信透明化

2. 服务发现机制

1
2
# 查看集群DNS服务
kubectl get svc -n kube-system kube-dns
  • DNS 解析<service-name>.<namespace>.svc.cluster.local
  • 环境变量注入:所有服务信息会注入到 Pod 环境变量中

四、常用命令与操作

1. 查看 Kube Proxy 组件

1
2
3
4
5
# 查看Proxy Pod(DaemonSet部署)
kubectl get pods -n kube-system -l k8s-app=kube-proxy

# 查看DaemonSet配置
kubectl get daemonset -n kube-system kube-proxy -o yaml

2. 检查代理配置

1
2
3
4
5
# 查看当前代理模式
kubectl describe configmap -n kube-system kube-proxy | grep "mode:"

# 查看Proxy日志
kubectl logs -n kube-system <kube-proxy-pod-name>

3. 网络诊断命令

1
2
3
4
5
6
7
8
# 检查Service的Endpoint
kubectl get endpoints <service-name>

# 检查网络连通性
kubectl exec <pod-name> -- curl -I <service-ip>:<port>

# 查看节点网络信息
kubectl describe node <node-name> | grep -A 10 "Addresses"

五、核心功能实现机制

1. Service 类型处理

Service 类型 实现方式 典型命令
ClusterIP iptables/IPVS规则 kubectl expose deployment...
NodePort 节点端口映射 --type=NodePort
LoadBalancer 云提供商集成 --type=LoadBalancer
ExternalName DNS CNAME记录 --external-name=example.com

2. 会话保持实现

1
2
# 查看会话保持配置
kubectl describe svc <service-name> | grep -i "session affinity"
  • 实现方式
    • 基于客户端 IP(ClientIP)
    • 超时时间可配置(默认3小时)

六、高级配置与调优

1. 性能调优参数

1
2
# 查看当前Proxy配置
kubectl describe cm -n kube-system kube-proxy | grep -A 10 "config.conf"

关键参数:

  • conntrack 相关参数(连接跟踪)
  • iptables 同步周期
  • ipvs 调度算法

2. 自定义配置文件

kube-proxy-config.yaml 示例:

1
2
3
4
5
6
7
8
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
scheduler: "wrr"
minSyncPeriod: "5s"
iptables:
masqueradeAll: true

七、常见问题排查

1. 服务不可访问

1
2
3
4
5
6
7
8
# 检查Service配置
kubectl describe svc <service-name>

# 检查Endpoint状态
kubectl get ep <service-name>

# 检查网络策略
kubectl get networkpolicy -A

2. 网络性能问题

1
2
3
4
5
# 查看连接跟踪表
sudo conntrack -L

# 检查IPVS统计
sudo ipvsadm -ln --stats

3. 规则不同步

1
2
# 强制Proxy重新加载配置
kubectl delete pod -n kube-system -l k8s-app=kube-proxy

八、与云平台集成

1. 负载均衡器管理

1
2
# 查看云负载均衡器
kubectl describe svc <loadbalancer-service> | grep -A 10 "LoadBalancer Ingress"

2. 外部流量策略

1
2
# 配置外部流量保留客户端IP
kubectl patch svc <service-name> -p '{"spec":{"externalTrafficPolicy":"Local"}}'

Kube Proxy 作为 Kubernetes 网络核心,其配置和调优对集群网络性能有重大影响。理解其工作原理并掌握这些命令,可以有效管理和诊断集群网络问题。

1.9 Kube Pods

1.9 Kubernetes Pods

一、Pod 基础概念

1. Pod 的本质

  • 最小部署单元:Kubernetes 中最小的可调度和管理单元
  • 逻辑主机:表示集群中的一个”逻辑虚拟机”
  • 共享环境:一个 Pod 中的容器共享:
    • 网络命名空间(同一 IP 和端口空间)
    • 存储卷(Volumes)
    • 内核命名空间(如 IPC)

2. Pod 生命周期

1
2
# 查看 Pod 生命周期事件
kubectl describe pod <pod-name> | grep -A 10 "Events:"

典型阶段:

  1. Pending:调度阶段
  2. Running:至少一个容器运行中
  3. Succeeded:所有容器成功终止
  4. Failed:至少一个容器异常终止
  5. Unknown:状态无法获取

二、Pod 核心配置

1. 基本 YAML 结构

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: main-container
image: nginx:1.19
ports:
- containerPort: 80

2. 多容器 Pod 示例

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: web-server
image: nginx
- name: log-agent
image: fluentd
- name: metrics-collector
image: prom/statsd-exporter

三、Pod 网络详解

1. 网络模型特性

1
2
# 查看 Pod IP 信息
kubectl get pod <pod-name> -o wide
  • IP-per-Pod:每个 Pod 获得唯一集群IP
  • 跨节点通信:无需 NAT 直接互通
  • 端口管理:容器端口通过 containerPort 暴露

2. 网络诊断命令

1
2
3
4
5
# 测试 Pod 间网络连通性
kubectl exec <pod-name> -- curl -I <target-pod-ip>

# 检查 DNS 解析
kubectl exec <pod-name> -- nslookup kubernetes.default

四、Pod 存储管理

1. Volume 类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spec:
volumes:
- name: data-volume
emptyDir: {}
- name: config-volume
configMap:
name: app-config
containers:
- name: app
volumeMounts:
- mountPath: /data
name: data-volume
- mountPath: /etc/config
name: config-volume

2. 常用 Volume 类型对比

类型 用途 生命周期
emptyDir 临时存储 随 Pod 删除
hostPath 访问节点文件系统 持久
configMap 注入配置数据 可热更新
secret 注入敏感数据 加密存储
persistentVolume 持久化存储 独立于 Pod 生命周期

五、Pod 健康管理

1. 探针配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
containers:
- name: web
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10

2. 探针类型对比

类型 用途 失败后果
livenessProbe 检测容器是否存活 重启容器
readinessProbe 检测容器是否就绪 从服务端点移除
startupProbe 保护慢启动容器 在成功前阻止其他探针

六、Pod 调度控制

1. 资源限制配置

1
2
3
4
5
6
7
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"

2. 高级调度策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu-type
operator: In
values: ["nvidia"]
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: database
topologyKey: kubernetes.io/hostname

七、Pod 运维命令

1. 基础操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建 Pod
kubectl apply -f pod.yaml

# 查看 Pod 详情
kubectl describe pod <pod-name>

# 查看 Pod 日志
kubectl logs <pod-name> [-c <container-name>]

# 进入 Pod 容器
kubectl exec -it <pod-name> -- /bin/bash

# 删除 Pod
kubectl delete pod <pod-name>

2. 高级诊断

1
2
3
4
5
6
7
8
# 查看 Pod 事件(按时间排序)
kubectl get events --sort-by=.metadata.creationTimestamp --field-selector involvedObject.name=<pod-name>

# 检查资源使用情况
kubectl top pod <pod-name>

# 临时拷贝文件
kubectl cp <pod-name>:/path/to/file ./local-file

八、特殊 Pod 类型

1. Static Pod(静态 Pod)

1
2
# 查看 kubelet 静态 Pod 目录配置
ps aux | grep kubelet | grep pod-manifest-path
  • 特性:由 kubelet 直接管理,不经过 API Server
  • 用途:用于运行集群核心组件(如 etcd、kube-apiserver)

2. Ephemeral Pod(临时 Pod)

1
2
# 创建临时调试 Pod
kubectl debug -it <target-pod> --image=busybox --target=<container-name>
  • 特性:临时性,适合故障诊断
  • 生命周期:随调试会话结束而终止

九、Pod 安全上下文

1. 安全配置示例

1
2
3
4
5
6
7
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
capabilities:
add: ["NET_ADMIN"]
readOnlyRootFilesystem: true

2. 安全策略类型

配置项 作用 安全影响
runAsNonRoot 禁止 root 运行 减少权限提升风险
readOnlyRootFilesystem 根文件系统只读 防止文件系统篡改
allowPrivilegeEscalation 禁止特权提升 限制容器权限
seccompProfile 系统调用过滤 减少攻击面

十、Pod 设计模式

1. Sidecar 模式

  • 特点:辅助容器增强主容器功能
  • 用例:日志收集、监控代理、服务网格

2. Adapter 模式

  • 特点:标准化容器输出
  • 用例:指标格式转换、日志格式化

3. Ambassador 模式

  • 特点:代理外部服务访问
  • 用例:数据库连接代理、API 网关

Pod 作为 Kubernetes 的核心抽象,理解其设计理念和操作细节是掌握 Kubernetes 的关键。这些命令和配置示例覆盖了 Pod 管理的各个方面,可作为日常工作的实用参考。