Kubernetes中基于CIDR实现Calico网络策略管控Pod流量的问题咨询
前置依赖插件
- 运行状态正常的Kubernetes集群,版本与你选择的Calico版本兼容
- Calico CNI 插件(本身已内置网络策略支持,无需额外安装网络策略相关第三方插件)
- 可选:
calicoctl命令行工具,方便后续调试、管理Calico资源
Calico 安装清单修改要点
默认Calico安装清单大部分场景无需大幅调整,仅特殊场景需要修改对应配置:
- 若使用原生YAML安装Calico,找到
calico-nodeDaemonSet的env配置段:- 确认
CALICO_NETWORKING_BACKEND参数值与你的网络模式匹配(bird对应BGP模式,vxlan对应VXLAN模式),保证跨节点Pod网络连通 - 若需要管控Pod到宿主机的流量,可将
FELIX_DEFAULTENDPOINTTOHOSTACTION默认值ACCEPT改为DROP,后续可通过网络策略单独放通需要的流量
- 确认
- 若使用Calico Operator安装,只需确认
Installation自定义资源中spec.calicoNetwork.policy字段未设置为Disabled即可,默认状态下网络策略功能已开启
具体实现步骤
步骤1:确认Calico运行状态
执行kubectl get pods -n calico-system,确认所有Calico相关Pod均处于Running状态,无异常重启。
步骤2:编写基于CIDR的Calico网络策略
Calico支持两种策略资源:K8s原生NetworkPolicy(单命名空间生效)、Calico自定义GlobalNetworkPolicy(集群全局生效),网络策略默认为白名单机制,匹配到放行规则的流量允许通过,未匹配流量默认丢弃。
以下为两个常用场景示例:
场景1:指定命名空间下的业务Pod仅允许10.0.0.0/8网段访问80端口,且Pod仅能访问192.168.1.0/24网段
创建cidr-policy.yaml文件,内容如下:
apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: cidr-traffic-control namespace: your-app-namespace # 替换为业务应用所在命名空间 spec: selector: app=your-business # 替换为你的业务Pod标签,写all()则匹配该命名空间下所有Pod types: - Ingress - Egress # 入站规则 ingress: - action: Allow source: cidr: 10.0.0.0/8 destination: ports: - 80 # 出站规则 egress: - action: Allow destination: cidr: 192.168.1.0/24 # 可选配置:放通DNS解析流量,避免Pod无法解析域名 - action: Allow destination: cidr: 10.96.0.0/12 # 替换为你的集群Service CIDR ports: - 53 protocol: UDP
场景2:集群全局所有Pod禁止访问172.16.0.0/12网段
使用全局网络策略配置:
apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: deny-private-segment spec: selector: all() types: - Egress egress: - action: Deny destination: cidr: 172.16.0.0/12
步骤3:生效网络策略
执行命令kubectl apply -f cidr-policy.yaml即可完成策略下发。
步骤4:验证规则有效性
可在业务Pod中通过ping、curl等工具访问允许/禁止的CIDR地址,确认流量管控符合预期;也可通过calicoctl查看规则匹配计数:calicoctl get networkpolicy cidr-traffic-control -n your-app-namespace -o wide
内容的提问来源于stack exchange,提问作者solveit
相关产品推荐
相关产品推荐

