1. K8S网络基础架构解析
Kubernetes(简称K8S)作为容器编排的事实标准,其网络模型与传统虚拟化环境有本质区别。我刚接触K8S时,最困惑的就是为什么Pod之间可以直接通信而无需NAT。这要从K8S网络设计的基本原则说起:
扁平化网络空间是K8S网络的核心特征。每个Pod都拥有独立的IP地址(称为Pod IP),这些IP在整个集群内直接可达,就像所有Pod都在同一个二层网络中。这种设计带来两个关键优势:
- 消除了端口映射的复杂性(对比Docker的端口发布机制)
- 使得应用可以保持与物理机部署时相同的网络行为模式
实现这一模型需要CNI(Container Network Interface)插件的支持。常见的CNI插件包括:
- Calico:基于BGP协议实现路由分发,适合对网络性能要求高的场景
- Flannel:使用VXLAN封装,配置简单但性能略有损耗
- Cilium:基于eBPF技术,提供高级网络策略和可观测性
生产环境选择建议:中小规模集群可用Flannel快速搭建,超过50个节点建议使用Calico,需要细粒度安全策略时考虑Cilium。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心网络组件工作原理
2.1 Service网络实现机制
Service是K8S抽象出的服务访问层,其核心是通过kube-proxy实现流量转发。目前主要有三种实现模式:
| 模式 | 原理 | 性能损耗 | 支持网络策略 |
|---|---|---|---|
| userspace | 通过iptables规则跳转到用户空间代理 | 高 | 否 |
| iptables | 完全通过iptables规则实现DNAT | 中 | 部分 |
| ipvs | 使用内核级IPVS负载均衡 | 低 | 是 |
配置示例(查看当前模式):
bash复制kubectl get configmap -n kube-system kube-proxy -o yaml | grep mode
2.2 DNS服务发现详解
CoreDNS作为集群DNS服务器,默认会为每个Service创建DNS记录,格式为:
code复制<service-name>.<namespace>.svc.cluster.local
调试DNS问题的实用命令:
bash复制# 进入临时busybox容器测试DNS
kubectl run -it --rm --image=busybox dns-test --restart=Never -- nslookup kubernetes.default
# 查看CoreDNS日志
kubectl logs -n kube-system -l k8s-app=kube-dns
3. 必备网络诊断命令手册
3.1 基础网络连通性测试
bash复制# 查看Pod IP分配情况
kubectl get pods -o wide --all-namespaces
# 跨节点网络测试(需提前部署测试工具)
kubectl run net-test --image=nicolaka/netshoot -it --rm --restart=Never -- ping <target-pod-ip>
# 检查Service端点健康状态
kubectl get endpoints <service-name>
3.2 高级网络故障排查
当遇到网络问题时,可按以下步骤排查:
- 验证基础连通性:
bash复制kubectl exec <pod-name> -- ping <target-ip>
- 检查网络策略:
bash复制kubectl get networkpolicy --all-namespaces
- 分析iptables规则(适用于iptables模式):
bash复制iptables-save | grep <service-ip>
- 抓包分析:
bash复制kubectl exec <pod-name> -- tcpdump -i eth0 -w /tmp/dump.pcap
kubectl cp <pod-name>:/tmp/dump.pcap ./dump.pcap
4. 生产环境网络优化实践
4.1 网络性能调优参数
在/etc/sysctl.conf中添加以下配置可显著提升网络性能:
conf复制net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
应用配置:
bash复制sysctl -p
4.2 多网络平面实现
对于需要隔离控制流量和数据流量的场景,可通过Multus CNI实现多网卡方案:
- 安装Multus插件:
bash复制kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml
- 创建NetworkAttachmentDefinition:
yaml复制apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: secondary-network
spec:
config: '{
"cniVersion": "0.3.1",
"type": "macvlan",
"master": "eth0",
"mode": "bridge",
"ipam": {
"type": "host-local",
"subnet": "192.168.100.0/24",
"rangeStart": "192.168.100.100",
"rangeEnd": "192.168.100.200"
}
}'
- Pod注解使用多网络:
yaml复制metadata:
annotations:
k8s.v1.cni.cncf.io/networks: secondary-network
5. 安全防护与网络策略
5.1 NetworkPolicy实战配置
以下是一个典型的三层微服务隔离策略:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-allow-frontend
spec:
podSelector:
matchLabels:
app: api-server
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
5.2 网络策略调试技巧
- 使用临时放行策略进行测试:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: temp-allow-all
spec:
podSelector: {}
ingress:
- {}
egress:
- {}
- 可视化策略检查工具:
bash复制# 安装network-policy-viewer
kubectl krew install np-viewer
# 生成策略关系图
kubectl np-viewer -n <namespace> > policy.html
6. 常见网络问题解决方案
6.1 DNS解析失败处理
典型症状:
- Pod内无法解析Service名称
- 外部域名解析超时
排查步骤:
- 检查CoreDNS Pod状态:
bash复制kubectl get pods -n kube-system -l k8s-app=kube-dns
- 验证DNS配置:
bash复制kubectl exec -it <pod-name> -- cat /etc/resolv.conf
- 测试上游DNS可达性:
bash复制kubectl exec -it <pod-name> -- nslookup google.com
6.2 节点间网络不通
解决方法:
- 检查CNI插件日志:
bash复制journalctl -u kubelet -f | grep cni
- 验证节点路由表:
bash复制ip route show
- 测试底层网络:
bash复制# 在节点上直接ping其他节点IP
ping <node-ip>
7. 网络监控与观测
7.1 关键监控指标
使用以下PromQL查询监控网络健康状态:
promql复制# 网络错误包率
sum(rate(container_network_receive_errors_total[1m])) by (pod) / sum(rate(container_network_receive_packets_total[1m])) by (pod) > 0.01
# 带宽使用情况
sum(rate(container_network_receive_bytes_total[1m])) by (pod) > 1000000
7.2 流量可视化方案
安装k8s-net-vis工具:
bash复制kubectl apply -f https://raw.githubusercontent.com/astefanutti/kubebox/master/kubernetes/k8s-net-vis.yaml
访问方式:
bash复制kubectl port-forward svc/k8s-net-vis 8080:80 -n kube-system
8. 版本升级网络注意事项
升级K8S版本时需特别注意:
- CNI插件兼容性:
- Calico需要与K8S版本匹配(参考官方兼容矩阵)
- Flannel在v1.16+需要更新到v0.11.0+
- kube-proxy模式变化:
- 1.18+版本默认推荐ipvs模式
- 切换模式需要清理旧iptables规则
- 核心DNS变更:
- 1.21+版本CoreDNS配置格式有变化
- 需要检查kube-dns ConfigMap迁移
升级检查清单:
bash复制# 检查当前网络组件版本
kubectl get daemonset -n kube-system kube-proxy -o yaml | grep image
kubectl get deployment -n kube-system calico-kube-controllers -o yaml | grep image
