apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
管理员可以使用MultiNetworkPolicy
API创建多个网络策略,以管理连接到辅助网络的Pod的流量。例如,您可以创建根据特定端口、IP/范围或标签允许或拒绝流量的策略。
多网络策略可用于管理集群中辅助网络上的流量。它们无法管理集群的默认网络或用户定义网络的主网络。
作为集群管理员,您可以为以下任何网络类型配置多网络策略
单根I/O虚拟化 (SR-IOV)
MAC虚拟局域网 (MacVLAN)
IP虚拟局域网 (IPVLAN)
基于SR-IOV的Bond容器网络接口 (CNI)
OVN-Kubernetes附加网络
仅支持使用内核网络接口控制器 (NIC) 配置SR-IOV附加网络的多网络策略。SR-IOV不支持数据平面开发工具包 (DPDK) 应用程序。 |
虽然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>
指定网络附件定义的名称。
作为集群管理员,您可以启用集群上的多网络策略支持。
安装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
ICMPv6邻居发现协议 (NDP) 是一组消息和流程,使设备能够发现并维护有关相邻节点的信息。NDP在IPv6网络中起着至关重要的作用,它促进了同一链路上的设备之间的交互。
当useMultiNetworkPolicy
参数设置为true
时,集群网络操作符 (CNO) 部署多网络策略的iptables实现。
为了在IPv6网络中支持多网络策略,集群网络操作符会在受多网络策略影响的每个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)
1 | 此规则允许传入ICMPv6邻居请求消息,这些消息是邻居发现协议 (NDP) 的一部分。这些消息有助于确定相邻节点的链路层地址。 |
2 | 此规则允许传入ICMPv6邻居通告消息,这些消息是NDP的一部分,并提供有关发送者链路层地址的信息。 |
3 | 此规则允许传入的ICMPv6路由器请求报文。主机使用这些报文请求路由器配置信息。 |
4 | 此规则允许传入的ICMPv6路由器广告报文,这些报文向主机提供配置信息。 |
您无法编辑这些预定义规则。 |
这些规则共同启用IPv6环境中正确的网络功能所需的ICMPv6流量,包括地址解析和路由器通信。在这些规则到位且多网络策略拒绝流量的情况下,应用程序预计不会遇到连接问题。
作为集群管理员,您可以创建、编辑、查看和删除多网络策略。
要定义描述允许集群中命名空间的入站或出站网络流量的粒度规则,您可以创建多网络策略。
您的集群使用支持NetworkPolicy
对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy
已设置。
您已安装OpenShift CLI (oc
)。
您已使用具有cluster-admin
权限的用户登录到集群。
您正在多网络策略适用的命名空间中工作。
创建策略规则
创建<policy_name>.yaml
文件
$ touch <policy_name>.yaml
其中
<policy_name>
指定多网络策略文件名。
在您刚刚创建的文件中定义多网络策略,例如以下示例
这是一个基本策略,阻止所有跨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>
指定网络附件定义的名称。
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>
指定网络附件定义的名称。
此策略允许来自namespace-y
中运行的Pod的流量进入标有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
如果您使用具有 |
您可以在命名空间中编辑多网络策略。
您的集群使用支持NetworkPolicy
对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy
已设置。
您已安装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>
可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。
如果您使用具有 |
您可以检查命名空间中的多网络策略。
您已安装OpenShift CLI (oc
)。
您已使用具有cluster-admin
权限的用户登录到集群。
您正在多网络策略存在的命名空间中工作。
列出命名空间中的多网络策略
要查看在命名空间中定义的多网络策略对象,请输入以下命令
$ oc get multi-networkpolicy
可选:要检查特定的多网络策略,请输入以下命令
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
其中
<policy_name>
指定要检查的多网络策略的名称。
<namespace>
可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。
如果您使用具有 |
您可以在命名空间中删除多网络策略。
您的集群使用支持NetworkPolicy
对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy
已设置。
您已安装OpenShift CLI (oc
)。
您已使用具有cluster-admin
权限的用户登录到集群。
您正在多网络策略存在的命名空间中工作。
要删除多网络策略对象,请输入以下命令
$ oc delete multi-networkpolicy <policy_name> -n <namespace>
其中
<policy_name>
指定多网络策略的名称。
<namespace>
可选:如果对象在与当前命名空间不同的命名空间中定义,则指定命名空间。
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
如果您使用具有 |
这是一个基本策略,阻止所有跨Pod网络,除了已部署的其他网络策略配置允许的网络流量。此过程强制执行默认的拒绝所有
策略。
如果您使用具有 |
您的集群使用支持NetworkPolicy
对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy
已设置。
您已安装OpenShift CLI (oc
)。
您已使用具有cluster-admin
权限的用户登录到集群。
您正在多网络策略适用的命名空间中工作。
创建以下YAML,该YAML定义一个拒绝所有
策略,以拒绝来自所有命名空间中所有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)
1 | namespace: default 将此策略部署到default 命名空间。 |
2 | network_name :指定网络附件定义的名称。 |
3 | podSelector: 为空,这意味着它匹配所有Pod。因此,该策略适用于default命名空间中的所有Pod。 |
4 | policyTypes: NetworkPolicy 相关的规则类型列表。 |
5 | 仅指定为Ingress policyType 。 |
6 | 没有指定ingress 规则。这会导致所有Pod的传入流量被丢弃。 |
通过输入以下命令来应用策略
$ oc apply -f deny-by-default.yaml
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
在拒绝所有
策略到位的情况下,您可以继续配置允许来自外部客户端到标有app=web
的Pod的流量的策略。
如果您使用具有 |
按照此步骤配置允许来自公共互联网的外部服务直接或通过使用负载均衡器访问Pod的策略。流量仅允许到标有app=web
的Pod。
您的集群使用支持NetworkPolicy
对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy
已设置。
您已安装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
此策略允许来自所有资源的流量,包括下图所示的外部流量
如果您使用具有 |
按照此步骤配置策略,允许所有命名空间中所有 Pod 与特定应用程序之间的流量。
您的集群使用支持NetworkPolicy
对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy
已设置。
您已安装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)
1 | 仅将策略应用于默认命名空间中的app:web Pod。 |
2 | 选择所有命名空间中的所有 Pod。 |
默认情况下,如果省略 |
通过输入以下命令来应用策略
$ 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="https://nginx.ac.cn/">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>
如果您使用具有 |
按照此步骤配置策略,允许来自特定命名空间的具有标签app=web
的 Pod 的流量。您可能希望这样做是为了:
将生产数据库的流量限制到部署生产工作负载的命名空间。
允许部署到特定命名空间的监控工具从当前命名空间抓取指标。
您的集群使用支持NetworkPolicy
对象的网络插件,例如OVN-Kubernetes网络插件,且mode: NetworkPolicy
已设置。
您已安装OpenShift CLI (oc
)。
您已使用具有cluster-admin
权限的用户登录到集群。
您正在多网络策略适用的命名空间中工作。
创建一个策略,允许来自具有标签purpose=production
的特定命名空间中的所有 Pod 的流量。将 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)
1 | 仅将策略应用于默认命名空间中的app:web Pod。 |
2 | 将流量限制到仅具有标签purpose=production 的命名空间中的 Pod。 |
通过输入以下命令来应用策略
$ 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="https://nginx.ac.cn/">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>