22.4. 配置多网络策略
作为集群管理员,您可以为单根 I/O 虚拟化 (SR-IOV)、MAC Virtual Local Area Network (MacVLAN) 或 OVN-Kubernetes 额外网络配置多网络策略。macvlan 额外网络被完全支持。不支持其他类型的额外网络,如 IP Virtual Local Area Network (IPVLAN)。
支持为 SR-IOV 额外网络配置多网络策略,仅支持内核网络接口控制器 (NIC)。SR-IOV 不支持 Data Plane Development Kit (DPDK)应用程序。
22.4.1. 多网络策略和网络策略之间的区别
虽然 MultiNetworkPolicy
API 实现 NetworkPolicy
API,但有几个重要的区别:
您必须使用
MultiNetworkPolicy
API:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy
-
当使用 CLI 与多网络策略交互时,您必须使用
multi-networkpolicy
资源名称。例如,您可以使用oc get multi-networkpolicy <name>
命令来查看多网络策略对象,其中<name>
是多网络策略的名称。 您必须使用定义 macvlan 或 SR-IOV 额外网络的网络附加定义名称指定一个注解:
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for: <network_name>
其中:
<network_name>
- 指定网络附加定义的名称。
22.4.2. 为集群启用多网络策略
作为集群管理员,您可以在集群中启用多网络策略支持。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。
流程
使用以下 YAML 创建
multinetwork-enable-patch.yaml
文件:apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: useMultiNetworkPolicy: true
配置集群以启用多网络策略:
$ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
输出示例
network.operator.openshift.io/cluster patched
22.4.3. 在 IPv6 网络中支持多网络策略
ICMPv6 Neighbor Discovery Protocol (NDP) 是一组消息和流程,使设备能够发现和维护有关邻居节点的信息。NDP 在 IPv6 网络中扮演着关键角色,用于处理同一链路上的设备间的交互。
当 useMultiNetworkPolicy
参数被设置为 true
时,Cluster Network Operator (CNO) 会部署多网络策略的 iptables 实现。
要在 IPv6 网络中支持多网络策略,Cluster Network Operator 会在受多网络策略影响的每个 pod 中部署以下规则集:
多网络策略自定义规则
kind: ConfigMap apiVersion: v1 metadata: name: multi-networkpolicy-custom-rules namespace: openshift-multus data: custom-v6-rules.txt: | # accept NDP -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT 1 -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT 2 # accept RA/RS -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT 3 -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT 4
您不能编辑这些预定义规则。
这些规则共同启用基本的 ICMPv6 流量,以便正确实现网络功能,包括 IPv6 环境中的地址解析和路由器通信。使用这些规则以及多网络策略拒绝流量时,应用程序应不会遇到连接问题。
22.4.4. 使用多网络策略
作为集群管理员,您可以创建、编辑、查看和删除多网络策略。
22.4.4.1. 先决条件
- 您已为集群启用了多网络策略支持。
22.4.4.2. 使用 CLI 创建多网络策略
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个多网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如 OVN-Kubernetes 网络插件或设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建策略规则:
创建一个
<policy_name>.yaml
文件:$ touch <policy_name>.yaml
其中:
<policy_name>
- 指定多网络策略文件名。
在您刚才创建的文件中定义多网络策略,如下例所示:
拒绝来自所有命名空间中的所有 pod 的入口流量
这是一个基本的策略,阻止配置其他网络策略所允许的跨 pod 流量以外的所有跨 pod 网络。
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: podSelector: {} policyTypes: - Ingress ingress: []
其中:
<network_name>
- 指定网络附加定义的名称。
允许来自所有命名空间中的所有 pod 的入口流量
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-same-namespace annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: ingress: - from: - podSelector: {}
其中:
<network_name>
- 指定网络附加定义的名称。
允许从特定命名空间中到一个 pod 的入口流量
此策略允许流量从在
namespace-y
中运行的容器集到标记pod-a
的 pod。apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-traffic-pod annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: pod: pod-a policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace-y
其中:
<network_name>
- 指定网络附加定义的名称。
限制到服务的流量
应用此策略可确保每个带有标签
app=bookstore
和标签role=api
的 pod 只能被带有标签app=bookstore
的 pod 访问。在本例中,应用可以是 REST API 服务器,标记为标签app=bookstore
和role=api
。这个示例可以解决了以下用例:
- 将到一个服务的流量限制为仅使用需要它的其他微服务。
将连接限制为只允许使用它的应用程序。
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: api-allow annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore
其中:
<network_name>
- 指定网络附加定义的名称。
运行以下命令来创建多网络策略对象:
$ oc apply -f <policy_name>.yaml -n <namespace>
其中:
<policy_name>
- 指定多网络策略文件名。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
如果您使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式创建网络策略。
22.4.4.3. 编辑多网络策略
您可以编辑命名空间中的多网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如 OVN-Kubernetes 网络插件或设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
可选: 要列出命名空间中的多网络策略对象,请输入以下命令:
$ oc get multi-networkpolicy
其中:
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
编辑多网络策略对象。
如果您在文件中保存了多网络策略定义,请编辑该文件并进行必要的更改,然后输入以下命令。
$ oc apply -n <namespace> -f <policy_file>.yaml
其中:
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
<policy_file>
- 指定包含网络策略的文件的名称。
如果您需要直接更新多网络策略对象,请输入以下命令:
$ oc edit multi-networkpolicy <policy_name> -n <namespace>
其中:
<policy_name>
- 指定网络策略的名称。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
确认已更新多网络策略对象。
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
其中:
<policy_name>
- 指定多网络策略的名称。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
如果您使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或通过 Actions 菜单从 web 控制台中的策略编辑网络策略。
22.4.4.4. 使用 CLI 查看多网络策略
您可以检查命名空间中的多网络策略。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
列出命名空间中的多网络策略:
要查看命名空间中定义的多网络策略对象,请输入以下命令:
$ oc get multi-networkpolicy
可选: 要检查特定的多网络策略,请输入以下命令:
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
其中:
<policy_name>
- 指定要检查的多网络策略的名称。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
如果您使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式查看网络策略。
22.4.4.5. 使用 CLI 删除多网络策略
您可以删除命名空间中的多网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如 OVN-Kubernetes 网络插件或设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
要删除多网络策略对象,请输入以下命令:
$ oc delete multi-networkpolicy <policy_name> -n <namespace>
其中:
<policy_name>
- 指定多网络策略的名称。
<namespace>
- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
如果使用 cluster-admin
权限登录到 web 控制台,您可以选择在集群上以 YAML 或通过 Actions 菜单从 web 控制台中的策略删除网络策略。
22.4.4.6. 创建默认拒绝所有多网络策略
这是一个基本的策略,阻止其他部署网络策略允许的网络流量以外的所有跨 pod 网络。此流程强制使用默认 deny-by-default
策略。
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如 OVN-Kubernetes 网络插件或设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建以下 YAML,以定义
deny-by-default
策略,以拒绝所有命名空间中的所有 pod 的入口流量。将 YAML 保存到deny-by-default.yaml
文件中:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default namespace: default 1 annotations: k8s.v1.cni.cncf.io/policy-for: <namespace_name>/<network_name> 2 spec: podSelector: {} 3 policyTypes: 4 - Ingress 5 ingress: [] 6
输入以下命令应用策略:
$ oc apply -f deny-by-default.yaml
输出示例
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
22.4.4.7. 创建多网络策略以允许来自外部客户端的流量
使用 deny-by-default
策略,您可以继续配置策略,允许从外部客户端到带有标签 app=web
的 pod 的流量。
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置策略,以直接从公共互联网允许外部服务,或使用 Load Balancer 访问 pod。只有具有标签 app=web
的 pod 才允许流量。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如 OVN-Kubernetes 网络插件或设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建策略,以直接从公共互联网的流量或使用负载均衡器访问 pod。将 YAML 保存到
web-allow-external.yaml
文件中:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-external namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}
输入以下命令应用策略:
$ oc apply -f web-allow-external.yaml
输出示例
multinetworkpolicy.k8s.cni.cncf.io/web-allow-external created
此策略允许来自所有资源的流量,包括下图所示的外部流量:
22.4.4.8. 创建一个多网络策略,允许从所有命名空间中到应用程序的流量
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置允许从所有命名空间中的所有 pod 流量到特定应用程序的策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如 OVN-Kubernetes 网络插件或设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建一个策略,允许从所有命名空间中的所有 pod 流量到特定应用。将 YAML 保存到
web-allow-all-namespaces.yaml
文件中:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-all-namespaces namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: {} 2
注意默认情况下,如果您省略了指定
namespaceSelector
而不是选择任何命名空间,这意味着策略只允许从网络策略部署到的命名空间的流量。输入以下命令应用策略:
$ oc apply -f web-allow-all-namespaces.yaml
输出示例
multinetworkpolicy.k8s.cni.cncf.io/web-allow-all-namespaces created
验证
输入以下命令在
default
命名空间中启动 web 服务:$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
运行以下命令在
secondary
命名空间中部署alpine
镜像并启动 shell:$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
在 shell 中运行以下命令,并观察是否允许请求:
# wget -qO- --timeout=2 http://web.default
预期输出
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
22.4.4.9. 创建多网络策略允许从命名空间中到应用程序的流量
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置允许从特定命名空间中到带有 app=web
标签的 pod 的策略。您可能需要进行以下操作:
- 将流量限制为部署生产工作负载的命名空间。
- 启用部署到特定命名空间的监控工具,以从当前命名空间中提取指标。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如 OVN-Kubernetes 网络插件或设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建一个策略,允许来自特定命名空间中所有 pod 的流量,其标签为
purpose=production
。将 YAML 保存到web-allow-prod.yaml
文件中:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-prod namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production 2
输入以下命令应用策略:
$ oc apply -f web-allow-prod.yaml
输出示例
multinetworkpolicy.k8s.cni.cncf.io/web-allow-prod created
验证
输入以下命令在
default
命名空间中启动 web 服务:$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
运行以下命令来创建
prod
命名空间:$ oc create namespace prod
运行以下命令来标记
prod
命名空间:$ oc label namespace/prod purpose=production
运行以下命令来创建
dev
命名空间:$ oc create namespace dev
运行以下命令来标记
dev
命名空间:$ oc label namespace/dev purpose=testing
运行以下命令在
dev
命名空间中部署alpine
镜像并启动 shell:$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
在 shell 中运行以下命令,并观察请求是否被阻止:
# wget -qO- --timeout=2 http://web.default
预期输出
wget: download timed out
运行以下命令,在
prod
命名空间中部署alpine
镜像并启动 shell:$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
在 shell 中运行以下命令,并观察是否允许请求:
# wget -qO- --timeout=2 http://web.default
预期输出
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>