Kubernetes网络全解析:Pod通信与服务治理指南
Kubernetes网络深度解析:从Pod通信到服务治理
一、Kubernetes网络模型设计哲学
Kubernetes网络模型遵循三个基本原则:
- IP-per-Pod原则:每个Pod拥有独立IP地址,且所有Pod可以直接通信
- 无NAT原则:Pod间通信不经过地址转换
- 显式暴露原则:服务对外暴露需要明确声明
二、CNI插件选型与实践
主流CNI插件对比
插件 | 网络模式 | 特点 | 适用场景 |
---|---|---|---|
Flannel | Overlay | 简单易用,性能中等 | 中小规模集群 |
Calico | BGP/IPIP | 高性能,支持网络策略 | 生产环境,需要安全隔离 |
Cilium | eBPF | 深度可观测性,服务网格集成 | 云原生微服务架构 |
Calico部署示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: calico-node
spec:
template:
spec:
containers:
- name: calico-node
image: calico/node:v3.20.0
env:
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
实践建议:
- 测试环境可先用Flannel快速搭建
- 生产环境推荐Calico或Cilium
- 跨云场景优先考虑支持BGP的解决方案
三、服务发现与负载均衡
Service类型详解
典型Service定义:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: ClusterIP
Ingress高级配置示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: demo.example.com
http:
paths:
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
实践建议:
- 内部服务使用ClusterIP
- 需要外部访问时配合Ingress使用
- 生产环境Ingress Controller至少部署2个副本
四、网络策略实战
网络策略示例:限制前端只能访问后端
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-policy
spec:
podSelector:
matchLabels:
role: frontend
ingress:
- from:
- podSelector:
matchLabels:
role: backend
ports:
- protocol: TCP
port: 6379
策略生效验证命令:
kubectl describe networkpolicy frontend-policy
kubectl run -it --rm testpod --image=alpine -- sh
ping <backend-pod-ip>
五、DNS服务解析机制
CoreDNS默认配置示例:
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
域名解析规则:
- Service解析:
<service>.<ns>.svc.cluster.local
- Pod解析:
<pod-ip>.<ns>.pod.cluster.local
六、网络性能优化技巧
大流量服务优化:
apiVersion: v1 kind: Service metadata: name: high-traffic annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" spec: externalTrafficPolicy: Local
CNI调优参数:
# Calico启用IPIP calicoctl patch ipPool default -p '{"spec":{"ipipMode": "Always"}}' # Flannel调整MTU kubectl patch ds kube-flannel-ds -n kube-system --type json -p '[{"op":"add","path":"/spec/template/spec/containers/0/env/-","value":{"name":"IFACE_MTU","value":"1440"}}]'
七、常见问题排查指南
网络连通性检查清单:
# 检查Pod网络 kubectl exec -it <pod> -- ping <target-ip> # 检查Service端点 kubectl get endpoints <service-name> # 检查DNS解析 kubectl run -it --rm dns-test --image=busybox:1.28 -- nslookup <service>
网络插件日志查看:
kubectl logs -n kube-system <cni-pod-name> journalctl -u kubelet -f | grep network
总结:Kubernetes网络体系需要根据业务场景选择合适的组件组合,建议从简单配置开始,逐步引入网络策略和服务治理能力。对于关键业务系统,务必进行网络性能基准测试和故障演练。