2. Kubernetes 网络基础回顾:Pod网络模型、Service与Ingress、网络策略(NetworkPolicy)基础
2.1 Pod 网络模型:IP-per-Pod 与扁平网络
Kubernetes 网络模型的核心原则是 “每个 Pod 拥有一个独立的集群内 IP 地址”,且所有 Pod 之间无需 NAT 即可直接通信。这种设计被称为 IP-per-Pod 模型,它极大地简化了应用从虚拟机/物理机向容器迁移时的网络拓扑。
- 所有 Pod 可以不通过 NAT 与所有其他 Pod 通信。
- 所有节点可以不通过 NAT 与所有 Pod 通信。
- Pod 看到的自身 IP 与其他人看到的 Pod IP 相同。
下图展示了 Kubernetes 扁平网络模型的核心拓扑:Pod 通过 veth 对连接到节点上的网桥(如 cbr0),CNI 插件负责将 Pod IP 路由到正确的节点,从而实现跨节点通信。
2.2 Service:稳定的网络抽象层
Pod 是临时性的,其 IP 地址会随重建而改变。Service 提供了一种 稳定的虚拟 IP(ClusterIP) 和 DNS 名称,将一组 Pod 暴露为单一网络端点。Service 通过标签选择器(Selector)动态关联 Pod,并利用 kube-proxy 实现流量转发。
| Service 类型 | 访问范围 | 典型用途 | 实现机制 |
|---|---|---|---|
| ClusterIP | 集群内部 | 内部微服务间调用 | kube-proxy (iptables/IPVS) |
| NodePort | 集群外部(节点端口) | 开发调试、简单外部访问 | NodePort → ClusterIP → Pod |
| LoadBalancer | 集群外部(云负载均衡器) | 生产环境对外暴露服务 | 云厂商 LB → NodePort → ClusterIP → Pod |
| ExternalName | 集群外部(DNS CNAME) | 将外部服务映射为集群内 DNS | CoreDNS 返回 CNAME 记录 |
客户端 → ClusterIP → 节点 iptables 规则 → 后端 Pod。
2.3 Ingress:七层流量入口与路由
Ingress 是 Kubernetes 的 七层(HTTP/HTTPS)流量入口,它位于集群边缘,负责将外部请求根据域名、路径等规则路由到集群内部的 Service。与 Service 的四层转发不同,Ingress 能够识别 HTTP 头部、实现 SSL 终止、基于路径的流量切分等高级功能。
一个典型的 Ingress 资源定义如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: myapp.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Ingress 控制器(如 NGINX Ingress Controller、Traefik、HAProxy)是实际运行在集群中的 Pod,它读取 Ingress 资源并动态配置反向代理规则。
2.4 网络策略(NetworkPolicy):Pod 级防火墙
默认情况下,Kubernetes 集群中的网络是“全通”的——任何 Pod 都可以与任何其他 Pod 通信。NetworkPolicy 是一种 以 Pod 为中心的防火墙规则,它通过标签选择器定义哪些 Pod 可以访问目标 Pod,以及目标 Pod 可以访问哪些外部端点。
2.4.1 NetworkPolicy 核心结构
一个 NetworkPolicy 资源包含以下关键字段:
| 字段 | 作用 | 示例值 |
|---|---|---|
podSelector |
选择策略作用的 Pod(目标 Pod) | matchLabels: { app: web } |
policyTypes |
指定策略类型:Ingress(入站)、Egress(出站) | ["Ingress", "Egress"] |
ingress[].from |
允许哪些来源访问目标 Pod | ipBlock、namespaceSelector、podSelector |
egress[].to |
允许目标 Pod 访问哪些目的地 | ipBlock、namespaceSelector、podSelector |
ports |
限制允许的端口和协议 | protocol: TCP, port: 80 |
2.4.2 典型策略示例:隔离前端与后端
以下策略实现:只允许带有 app: frontend 标签的 Pod 访问带有 app: backend 标签的 Pod 的 8080 端口:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-allow-frontend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
2.4.3 网络策略的拓扑影响
在 Helm 网络拓扑资源配额配置中,NetworkPolicy 是 资源配额之外的安全控制层。资源配额(ResourceQuota)限制 Pod 的 CPU/内存,而 NetworkPolicy 限制 Pod 的网络可达性。两者结合可以实现“资源隔离 + 网络隔离”的双重保障。
networkPolicy.enabled 开关,并通过模板动态生成 NetworkPolicy 资源。例如:
{{- if .Values.networkPolicy.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: {{ include "myapp.fullname" . }}
spec:
podSelector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
{{- toYaml .Values.networkPolicy.allowedLabels | nindent 10 }}
{{- end }}
2.5 网络基础与 Helm 配额策略的关联
理解上述网络基础对于实现 Helm 网络拓扑资源配额配置至关重要:
- Pod 网络模型决定了每个 Pod 拥有独立 IP,资源配额(如
pods、count/pods)直接影响集群 IP 地址的消耗密度。 - Service 与 Ingress 是流量入口,配额策略需要确保每个命名空间下的 Service 数量、Ingress 数量不超过集群负载能力,避免控制平面过载。
- NetworkPolicy 是网络隔离的基石,在 Helm Chart 中通过模板化生成策略,可以实现“按租户/环境”的精细化网络访问控制,与资源配额形成互补。