Ubuntu 上 Kubernetes 网络策略配置指南
一 前置条件与整体思路
- 网络策略由 Kubernetes 定义并由集群中的 CNI 网络策略控制器 强制执行,与底层操作系统 Ubuntu 无关;因此先确保集群具备策略能力。常见选择:Calico、Cilium。若尚未安装 CNI,可先部署 Calico:
- kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
- kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
- 默认情况下,命名空间内 无策略即允许所有入站与出站流量;启用策略后,规则为白名单模式,仅显式允许的流量可通过。策略通过 标签选择器 选择目标 Pod,并按 Ingress/Egress 定义来源与去向及端口。
二 快速上手示例
- 场景:仅允许同一命名空间中带有 app=myapp 的 Pod 访问目标 Pod 的 TCP 80 端口。
- 给目标 Pod 打标签(示例 Deployment 片段)
- spec.template.metadata.labels: {app: myapp}
- 创建策略文件 network-policy.yaml
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: default
spec:
podSelector:
matchLabels:
app: myapp
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: myapp
ports:
- protocol: TCP
port: 80
- 应用与验证
- kubectl apply -f network-policy.yaml
- kubectl get networkpolicies -n default
- 使用 busybox 等临时 Pod 从同/不同命名空间测试连通性(例如 curl/wget)以验证策略生效。
三 常见策略模板
- 默认拒绝入站(对 default 命名空间所有 Pod)
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {}
policyTypes:
- 仅允许来自指定命名空间的入站(例如仅允许 project=myproject 命名空间访问 TCP 6379)
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-namespace
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: myproject
ports:
- protocol: TCP
port: 6379
- 仅允许访问外部某网段(例如 10.0.0.0/24 的 TCP 5978)
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress-to-cidr
namespace: default
spec:
podSelector:
matchLabels:
app: worker
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
- 跨命名空间按名称选择(利用不可变标签 kubernetes.io/metadata.name)
- to:
- namespaceSelector:
matchExpressions:
- key: kubernetes.io/metadata.name
operator: In
values: [“frontend”, “backend”]
- 组合示例:同时限制入站与出站
- policyTypes:
- ingress: …(来源与端口)
- egress: …(去向与端口)
四 验证与排错
- 观察策略是否生效
- kubectl get networkpolicies -A
- kubectl describe networkpolicy -n
- 连通性测试
- 在目标命名空间启动临时客户端 Pod(如 busybox),对目标 Service/Pod IP:Port 发起访问;从被拒绝的来源应无法连通。
- 常见问题
- 策略未生效:确认 CNI 策略控制器已安装并运行(如 Calico/Cilium)、策略 namespace 与 podSelector 匹配正确、策略类型为 Ingress/Egress 已按需开启。
- 外部访问失败:若需从集群外访问 Service: LoadBalancer/NodePort,确保相应 Ingress/Egress 规则允许,并注意 NetworkPolicy 主要作用于第 4 层(TCP/UDP/SCTP)。
五 最佳实践
- 使用 命名空间 + 标签 进行细粒度划分,策略只作用于需要保护的 Pod 集合。
- 采用 默认拒绝 策略建立“默认安全”基线,再按需放行最小必要流量。
- 对外部依赖使用 ipBlock 精确放行,避免过宽的 CIDR。
- 定期 审计与监控 策略与访问日志,及时回收不再需要的规则。