3.4. 配置多网络策略
管理员可以使用 MultiNetworkPolicy
API 创建多个网络策略,以管理附加到二级网络的 pod 的流量。例如,您可以创建根据特定端口、IP/范围或标签来允许或拒绝流量的策略。
多网络策略可用于管理集群中二级网络上的流量。这些策略无法管理默认集群网络或用户定义的网络的主网络。
作为集群管理员,您可以为以下任何网络类型配置多网络策略:
- 单根 I/O 虚拟化 (SR-IOV)
- MAC 虚拟局域网 (MacVLAN)
- IP 虚拟局域网 (IPVLAN)
- 通过 SR-IOV 绑定 Container Network Interface (CNI)
- OVN-Kubernetes 二级网络
支持为 SR-IOV 二级网络配置多网络策略,仅支持内核网络接口控制器 (NIC)。SR-IOV 不支持 Data Plane Development Kit (DPDK)应用程序。
3.4.1. 多网络策略和网络策略之间的区别 复制链接链接已复制到粘贴板!
虽然 MultiNetworkPolicy
API 实现 NetworkPolicy
API,但有几个重要的区别:
您必须使用
MultiNetworkPolicy
API:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
当使用 CLI 与多网络策略交互时,您必须使用
multi-networkpolicy
资源名称。例如,您可以使用oc get multi-networkpolicy <name>
命令来查看多网络策略对象,其中<name>
是多网络策略的名称。 您可以使用
MultiNetworkPolicy
对象上的k8s.v1.cni.cncf.io/policy-for
注解指向NetworkAttachmentDefinition
(NAD) 自定义资源(CR)。NAD CR 定义策略应用到的网络。包含
k8s.v1.cni.cncf.io/policy-for
注解的多网络策略示例apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace_name>
- 指定命名空间名称。
<network_name>
- 指定网络附加定义的名称。
3.4.2. 为集群启用多网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在集群中启用多网络策略支持。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。
流程
使用以下 YAML 创建
multinetwork-enable-patch.yaml
文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置集群以启用多网络策略。成功输出列出了策略对象的名称以及
补丁
的状态。oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
$ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.3. 在 IPv6 网络中支持多网络策略 复制链接链接已复制到粘贴板!
ICMPv6 Neighbor Discovery Protocol (NDP) 是一组消息和流程,使设备能够发现和维护有关邻居节点的信息。NDP 在 IPv6 网络中扮演着关键角色,用于处理同一链路上的设备间的交互。
当 useMultiNetworkPolicy
参数被设置为 true
时,Cluster Network Operator (CNO) 会部署多网络策略的 iptables 实现。
要在 IPv6 网络中支持多网络策略,Cluster Network Operator 会在受多网络策略影响的每个 pod 中部署以下规则集:
多网络策略自定义规则
您不能编辑这些预定义规则。
这些规则共同启用基本的 ICMPv6 流量,以便正确实现网络功能,包括 IPv6 环境中的地址解析和路由器通信。使用这些规则以及多网络策略拒绝流量时,应用程序应不会遇到连接问题。
3.4.4. 使用多网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以创建、编辑、查看和删除多网络策略。
3.4.4.1. 先决条件 复制链接链接已复制到粘贴板!
- 您已为集群启用了多网络策略支持。
3.4.4.2. 使用 CLI 创建多网络策略 复制链接链接已复制到粘贴板!
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个多网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建策略规则:
创建一个
<policy_name>.yaml
文件:touch <policy_name>.yaml
$ touch <policy_name>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>
- 指定多网络策略文件名。
在您刚才创建的文件中定义多网络策略,如下例所示:
拒绝来自所有命名空间中的所有 pod 的入口流量
这是一个基本的策略,阻止配置其他网络策略所允许的跨 pod 流量以外的所有跨 pod 网络。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<network_name>
- 指定网络附加定义的名称。
允许来自所有命名空间中的所有 pod 的入口流量
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<network_name>
- 指定网络附加定义的名称。
允许从特定命名空间中到一个 pod 的入口流量
此策略允许流量从在
namespace-y
中运行的 pod 中获取pod-a
标签。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<network_name>
- 指定网络附加定义的名称。
限制到服务的流量
应用此策略可确保每个带有标签
app=bookstore
和标签role=api
的 pod 只能被带有标签app=bookstore
的 pod 访问。在本例中,应用可以是 REST API 服务器,标记为标签app=bookstore
和role=api
。这个示例可以解决了以下用例:
- 将到一个服务的流量限制为仅使用需要它的其他微服务。
将连接限制为只允许使用它的应用程序。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<network_name>
- 指定网络附加定义的名称。
运行以下命令来创建多网络策略对象。成功输出列出了策略对象的名称
以及创建
的状态。oc apply -f <policy_name>.yaml -n <namespace>
$ oc apply -f <policy_name>.yaml -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>
- 指定多网络策略文件名。
<namespace>
- 可选参数。如果您在与当前命名空间不同的命名空间中定义了对象,则参数会特定于命名空间。
成功输出列出了策略对象的名称
以及创建
的状态。
如果您使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式创建网络策略。
3.4.4.3. 编辑多网络策略 复制链接链接已复制到粘贴板!
您可以编辑命名空间中的多网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
可选: 要列出命名空间中的多网络策略对象,请输入以下命令:
oc get multi-networkpolicy
$ oc get multi-networkpolicy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
编辑多网络策略对象。
如果您在文件中保存了多网络策略定义,请编辑该文件并进行必要的更改,然后输入以下命令。
oc apply -n <namespace> -f <policy_file>.yaml
$ oc apply -n <namespace> -f <policy_file>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
<policy_file>
- 指定包含网络策略的文件的名称。
如果您需要直接更新多网络策略对象,请输入以下命令:
oc edit multi-networkpolicy <policy_name> -n <namespace>
$ oc edit multi-networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>
- 指定网络策略的名称。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
确认已更新多网络策略对象。
oc describe multi-networkpolicy <policy_name> -n <namespace>
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>
- 指定多网络策略的名称。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
如果您使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或通过 Actions 菜单从 web 控制台中的策略编辑网络策略。
3.4.4.4. 使用 CLI 查看多网络策略 复制链接链接已复制到粘贴板!
您可以检查命名空间中的多网络策略。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
列出命名空间中的多网络策略:
要查看命名空间中定义的多网络策略对象,请输入以下命令:
oc get multi-networkpolicy
$ oc get multi-networkpolicy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要检查特定的多网络策略,请输入以下命令:
oc describe multi-networkpolicy <policy_name> -n <namespace>
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>
- 指定要检查的多网络策略的名称。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
如果您使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式查看网络策略。
3.4.4.5. 使用 CLI 删除多网络策略 复制链接链接已复制到粘贴板!
您可以删除命名空间中的多网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
要删除多网络策略对象,请输入以下命令。成功输出列出了策略对象的名称以及
已删除的
状态。oc delete multi-networkpolicy <policy_name> -n <namespace>
$ oc delete multi-networkpolicy <policy_name> -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>
- 指定多网络策略的名称。
<namespace>
- 可选参数。如果您在与当前命名空间不同的命名空间中定义了对象,则参数会特定于命名空间。
成功输出列出了策略对象的名称以及
已删除的
状态。
如果使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群上以 YAML 或通过 Actions 菜单从 web 控制台中的策略删除网络策略。
3.4.4.6. 创建默认拒绝所有多网络策略 复制链接链接已复制到粘贴板!
此策略会阻止由配置其他部署的网络策略和主机网络 pod 间的网络流量允许的所有跨 pod 网络。此流程通过在 my-project
命名空间中应用 deny-by-default
策略来强制实施强大的拒绝策略。
如果没有配置允许流量通信的 NetworkPolicy
自定义资源(CR),以下策略可能会导致集群中的通信问题。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建以下 YAML,以定义
deny-by-default
策略,以拒绝所有命名空间中的所有 pod 的入口流量。将 YAML 保存到deny-by-default.yaml
文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建
的状态。oc apply -f deny-by-default.yaml
$ oc apply -f deny-by-default.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 成功输出列出了策略对象的名称
以及创建
的状态。
3.4.4.7. 创建多网络策略以允许来自外部客户端的流量 复制链接链接已复制到粘贴板!
使用 deny-by-default
策略,您可以继续配置策略,允许从外部客户端到带有标签 app=web
的 pod 的流量。
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置策略,以直接从公共互联网允许外部服务,或使用 Load Balancer 访问 pod。只有具有标签 app=web
的 pod 才允许流量。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建策略,以直接从公共互联网的流量或使用负载均衡器访问 pod。将 YAML 保存到
web-allow-external.yaml
文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建
的状态。oc apply -f web-allow-external.yaml
$ oc apply -f web-allow-external.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 成功输出列出了策略对象的名称
以及创建
的状态。此策略允许来自所有资源的流量,包括下图所示的外部流量:
3.4.4.8. 创建一个多网络策略,允许从所有命名空间中到应用程序的流量 复制链接链接已复制到粘贴板!
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置允许从所有命名空间中的所有 pod 流量到特定应用程序的策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建一个策略,允许从所有命名空间中的所有 pod 流量到特定应用。将 YAML 保存到
web-allow-all-namespaces.yaml
文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意默认情况下,如果您没有在策略对象中指定
namespaceSelector
参数,则不会选择命名空间。这意味着策略只允许从网络策略部署的命名空间的流量。输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建
的状态。oc apply -f web-allow-all-namespaces.yaml
$ oc apply -f web-allow-all-namespaces.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 成功输出列出了策略对象的名称
以及创建
的状态。
验证
输入以下命令在
default
命名空间中启动 web 服务:oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令在
secondary
命名空间中部署alpine
镜像并启动 shell:oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 shell 中运行以下命令,并观察该服务是否允许请求:
wget -qO- --timeout=2 http://web.default
# wget -qO- --timeout=2 http://web.default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.4.9. 创建多网络策略允许从命名空间中到应用程序的流量 复制链接链接已复制到粘贴板!
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置允许从特定命名空间中到带有 app=web
标签的 pod 的策略。您可能需要进行以下操作:
- 将流量限制为部署了生产工作负载的命名空间。
- 启用部署到特定命名空间的监控工具,以从当前命名空间中提取指标。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建一个策略,允许来自特定命名空间中所有 pod 的流量,其标签为
purpose=production
。将 YAML 保存到web-allow-prod.yaml
文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建
的状态。oc apply -f web-allow-prod.yaml
$ oc apply -f web-allow-prod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 成功输出列出了策略对象的名称
以及创建
的状态。
验证
输入以下命令在
default
命名空间中启动 web 服务:oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
prod
命名空间:oc create namespace prod
$ oc create namespace prod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来标记
prod
命名空间:oc label namespace/prod purpose=production
$ oc label namespace/prod purpose=production
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
dev
命名空间:oc create namespace dev
$ oc create namespace dev
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来标记
dev
命名空间:oc label namespace/dev purpose=testing
$ oc label namespace/dev purpose=testing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令在
dev
命名空间中部署alpine
镜像并启动 shell:oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 shell 中运行以下命令,并观察请求的原因。例如,预期的输出状态为
wget:下载超时
。wget -qO- --timeout=2 http://web.default
# wget -qO- --timeout=2 http://web.default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在
prod
命名空间中部署alpine
镜像并启动 shell:oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 shell 中运行以下命令,并观察是否允许请求:
wget -qO- --timeout=2 http://web.default
# wget -qO- --timeout=2 http://web.default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
Copy to Clipboard Copied! Toggle word wrap Toggle overflow