背景信息
Kubernetes网络策略(NetworkPolicy)是一种用于控制容器网络访问的资源对象。它基于标签(Label)选择器定义允许的网络流量白名单,控制Pod 之间的通信、Pod与外部服务的连接行为。通过网络策略可以实现细粒度的网络隔离,提升集群的安全性。Cubecni容器网络插件的策略路由模式和IPVLAN模式支持网络策略,独占ENI模式不支持网络策略。
开启网络策略
Cubecni网络插件,若开启网络策略,会额外消耗一部分系统资源,默认不开启网络策略。可在订购集群时开启网络策略,或集群创建后再开启网络策略。
订购集群
订购集群,若使用Cubecni插件,可选择开启网络策略。
已有集群
Cubecni若不低于v1.1.1版本,可参考如下操作步骤开启网络策略:
a. 登录云容器引擎控制台,左侧导航栏选择集群;
b. 在集群列表页面,单击目标集群名称,进入集群管理页面;
c. 左侧导航栏,选择工作负载 -> 守护进程;
d. 命名空间选择kube-system,找到cubecni服务,点击右侧的更多->查看YAML;
e. 点击编辑,将环境变量CHAINING_RUN_MODE的值改为on,点击保存;
f. 等待Cubecni服务重启,待运行/期望Pod数量相等,说明重启完成。
备注:如下所示,cubecni-daemon镜像版本不低于v1.1.1,则支持手动开启网络策略。
使用限制
Cubecni IPVLAN模式下,基于eBPF实现NetworkPolicy,有如下限制:
1. IP Blocks即使包含Pod地址,这些Pod地址也不会加入白名单,需通过PodSelector或NamespeceSelector选择Pod;
2. IP Blocks的except支持不佳,不建议使用except关键字;
3. 若配置egress规则,会限制Pod访问所在节点以及其上HostNetwork类型Pod,即使白名单配置了所在Host地址也无效。
使用示例
网络策略详细使用方式可参考Kubernetes社区文档,下文以Nginx应用为例,介绍使用方式。
准备示例应用
使用YAMl方式创建示例应用,YAML定义如下:
a. 登录云容器引擎控制台,左侧导航栏选择集群;
b. 在集群列表页面,单击目标集群名称,进入集群管理页面;
c. 左侧导航栏,选择工作负载 -> 无状态;
d. 选择default命名空间,点击新增YAML,默认为一Nginx示例,将image字段替换为{镜像拉取地址}/open-source/nginx:1.26-alpine-slim,点击保存;
e. 等待服务启动完成。
示例一:限制服务只能被带有特定标签的应用访问
通过控制台操作如下:
1. 登录云容器引擎控制台,左侧导航栏选择集群;
2. 在集群列表页面,单击目标集群名称,进入集群管理页面;
3. 左侧导航栏,选择网络 -> 网络策略,选择default命名空间,点击创建网络策略;
创建面板配置说明如下:
配置名 | 说明 | 示例 |
---|---|---|
名称 | 网络策略的名称。 | example-1 |
Pod选择器 | 单击+ 选择工作负载添加标签,设置使用网络策略的Pod。 若不配置Pod选择器,则对命名空间下所有Pod生效。 | 示例设置如下: - 设置工作类型为:Deployment - 设置工作负载为:nginx-deployment - 设置标签为:app=nginx |
来源 | 配置入站规则(igress)列表,用于声明谁可以访问目标Pod。每个列表项包含规则和端口。 每个规则表示一组允许的来源,若配置多个规则,则满足任一规则即允许访问。 - 规则: 1. podSelector:此选择器将在与NetworkPolicy相同的名字空间中选择特定的Pod,将其允许作为入站流量来源; 2. namespaceSelector:此选择器将选择特定的名字空间,将所有Pod用作其入站流量来源; 3. ipBlock:此选择器将选择特定的IP CIDR范围用作入站流量来源。 - 端口:支持TCP和UDP协议。 | 本示例不添加任何来源规则。 |
去向 | 配置出站规则(egress)列表,用于声明目标Pod可以访问哪些地址。每个列表项包含规则和端口。 每个规则表示一组允许的去向,若配置多个规则,则满足任一规则即允许访问。 - 规则: 1. podSelector:此选择器将在与NetworkPolicy相同的名字空间中选择特定的Pod,将其允许作为出站流量目的地; 2. namespaceSelector:此选择器将选择特定的名字空间,将所有Pod用作其出站流量目的地; 3. ipBlock:此选择器将选择特定的IP CIDR范围用作出站流量目的地。 - 端口:支持TCP和UDP协议。 | 本示例不添加任何去向规则。 |
4. 点击下一步,点击确认;
5. 在另一个命名空间(例如demo)部署demo服务(可使用Nginx镜像),登陆容器,测试与示例Nginx的通信。可见,网络策略没有允许demo服务访问,导致访问会超时:
6. 修改网络策略为允许demo服务访问,点击编辑,在来源右侧,单击+添加,规则设置如下:
配置名 | 示例值 |
---|---|
选择器 | namespaceSelector |
命名空间 | demo |
标签 | kubernetes.io/metadata.name: demo |
点击下一步,点击确认;
7. 登陆容器,测试与示例Nginx的通信。可见,网络策略允许demo服务访问,访问正常: