前言
Kubernetes内部流量经常跨Pod、跨节点、跨网络。没有清晰的服务发现机制和网络策略,流量容易乱跑、调试困难或被恶意访问。创建健壮的Service层与网络策略体系,是保障集群安全与稳定的基础。
本文从Service类型、负载分发、网络策略与跨网络联通能力出发,结合实战命令,帮助你建立可控的Kubernetes网络环境。
一、Service类型与服务发现
1.1 ClusterIP与Endpoint对象
apiVersion:v1kind:Servicemetadata:name:backendspec:type:ClusterIPselector:app:backendports:-port:8080ClusterIP生成虚拟IP,Pod内通过该IP访问无需DNS。Endpoints自动维护Pod列表,可用kubectl get endpoints backend -o yaml查看实时Endpoint。
1.2 Headless Service与直接访问Pod
Headless Service(clusterIP: None)不会分配虚拟IP,适用于StatefulSet或自定义客户端负载均衡,需要应用自己选择Pod。
1.3 ExternalName与跨集群
ExternalName服务将访问重定向到外部DNS,适合访问跨集群API网关。搭配服务发现插件(如Consul、CoreDNS)可以实现跨集群服务名解析。
二、负载均衡与Service Mesh
2.1 ClusterIP/NodePort/LoadBalancer对比
| 类型 | 描述 | 适用场景 |
|---|---|---|
| ClusterIP | 内部负载均衡 | 集群内服务调用 |
| NodePort | 每个节点开放端口 | 简单公网访问 |
| LoadBalancer | 结合云商LB | 公网高可用 |
2.2 Ingress与路径路由
apiVersion:networking.k8s.io/v1kind:Ingressspec:rules:-host:api.example.comhttp:paths:-path:/backendpathType:Prefixbackend:service:name:backendport:number:80Ingress Controller(如NGINX/Contour/HAProxy)处理TLS与路由,后端仍通过Service接收请求。
2.3 加入Service Mesh
Service Mesh(Istio/Linkerd)在数据面插入Sidecar,提供可观察性与流量控制。启用后可以实现:
- 自动mTLS
- 分流、AB测试
- 请求跟踪与断路器
三、网络策略精细化控制
3.1 Calico示例策略
apiVersion:projectcalico.org/v3kind:NetworkPolicymetadata:name:allow-from-frontendspec:selector:app == 'backend'ingress:-action:Allowsource:selector:app == 'frontend'Calico的策略使用标签匹配,支持全局默认拒绝,逐步放行。
3.2 eBPF + Cilium策略
Cilium用eBPF实现高性能策略,可深度识别HTTP、Kafka等协议。示例命令:
cilium policy trace --src-labelapp=frontend --dst-labelapp=backend3.3 多租户与隔离
- 使用Namespace+网络策略划分边界。
- 每个命名空间内部默认允许,跨 Namespace 通过Policy允许。
- 结合
kubectl auth can-i验证服务账户权限。
四、故障排查命令
| 场景 | 排查命令 |
|---|---|
| 服务无法解析 | kubectl get svc backend -o yaml+dig backend.default.svc.cluster.local |
| 连接拒绝 | kubectl exec -it pod -- curl backend:8080 |
| 网络策略拦截 | kubectl describe networkpolicy+calicoctl get policy |
| 节点网络 | ss,ip route,iptables -L |
4.1 使用kubectl port-forward
kubectl port-forward svc/backend8080:8080curlhttp://localhost:8080/health4.2kubectl exec中的tcpdump
kubectlexec-it backend-pod -- tcpdump -i eth0 port80804.3 Service Mesh故障
- 查看
istioctl proxy-status - 查看
linkerd stat指标
五、跨网络联通与组网手段
5.1 多集群互通挑战
当集群分布在不同数据中心或云上,私有网络互通成为重难点:DNS解析、服务发现、Metrics采集都需要跨网络通道。
5.2 常见解决方式
- VPN/专线:稳定但部署周期长
- Service Mesh Federation:管理复杂
- 组网工具:WireGuard、ZeroTier、星空组网
使用组网工具可在几分钟内将多网络节点编入同一个虚拟网段,从而统一使用ClusterIP或虚拟IP访问对端Service。同时也方便了统一的Prometheus抓取与跨集群调试。
5.3 异构网络调试
通过组网工具配合kubectl --context切换上下文后,可以:
- 在运营商网络上访问另一集群的
ClusterIP - 将调试工具部署在统一网络的跳板机
- 为跨网络灰度提供流量镜像路径
六、总结表
| 优化维度 | 主要手段 | 预期效果 | 风险提醒 |
|---|---|---|---|
| 服务发现 | ClusterIP + Headless | 灵活调度、高可用 | Headless需要客户端负载均衡 |
| 负载均衡 | Ingress+Mesh TrafficSplit | 路径级控制、灰度 | Mesh复杂度高、故障范围变大 |
| 网络策略 | Calico/Cilium Policy | 减少攻击面 | 策略过严可能阻断合法流量 |
| 故障排查 | kubectl/tcpdump/istioctl | 快速定位网络问题 | 需要运维权限 |
| 跨网络 | 组网工具(星空组网等) | 跨机房统一访问 | 需安全审计、访问控制 |
公众号:北平的秋葵