3.2. 创建网络策略
作为具有 admin
角色的用户,您可以为命名空间创建网络策略。
3.2.1. 示例 NetworkPolicy 对象 复制链接链接已复制到粘贴板!
下文解释了示例 NetworkPolicy 对象:
3.2.2. 使用 CLI 创建网络策略 复制链接链接已复制到粘贴板!
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个网络策略。
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
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 允许来自所有命名空间中的所有 pod 的入口流量
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 允许从特定命名空间中到一个 pod 的入口流量
此策略允许流量从在
namespace-y
中运行的 pod 中获取pod-a
标签。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来创建网络策略对象。成功输出列出了策略对象的名称
以及创建
的状态。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.2.3. 创建默认拒绝所有网络策略 复制链接链接已复制到粘贴板!
此策略会阻止由配置其他部署的网络策略和主机网络 pod 间的网络流量允许的所有跨 pod 网络。此流程通过在 my-project
命名空间中应用 deny-by-default
策略来强制实施强大的拒绝策略。
如果没有配置允许流量通信的 NetworkPolicy
自定义资源(CR),以下策略可能会导致集群中的通信问题。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
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.2.4. 创建网络策略以允许来自外部客户端的流量 复制链接链接已复制到粘贴板!
使用 deny-by-default
策略,您可以继续配置策略,允许从外部客户端到带有标签 app=web
的 pod 的流量。
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置策略,以直接从公共互联网允许外部服务,或使用 Load Balancer 访问 pod。只有具有标签 app=web
的 pod 才允许流量。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
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.2.5. 创建网络策略,允许从所有命名空间中到应用程序的流量 复制链接链接已复制到粘贴板!
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置允许从所有命名空间中的所有 pod 流量到特定应用程序的策略。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
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.2.6. 创建网络策略,允许从一个命名空间中到应用程序的流量 复制链接链接已复制到粘贴板!
如果使用具有 cluster-admin
角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
按照以下步骤配置允许从特定命名空间中到带有 app=web
标签的 pod 的策略。您可能需要进行以下操作:
- 将流量限制为部署了生产工作负载的命名空间。
- 启用部署到特定命名空间的监控工具,以从当前命名空间中提取指标。
先决条件
-
集群使用支持
NetworkPolicy
对象的网络插件,如带有设置了mode: NetworkPolicy
的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc
)。 -
使用具有
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