3.2. 创建网络策略
作为集群管理员,您可以为命名空间创建网络策略。
3.2.1. 示例 NetworkPolicy 对象 复制链接链接已复制到粘贴板!
以下配置注解一个 NetworkPolicy 对象:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-27107
spec:
podSelector:
matchLabels:
app: mongodb
ingress:
- from:
- podSelector:
matchLabels:
app: app
ports:
- protocol: TCP
port: 27017
其中:
name- NetworkPolicy 对象的名称。
spec.podSelector- 描述策略应用到的 pod 的选择器。策略对象只能选择定义 NetworkPolicy 对象的项目中的 pod。
ingress.from.podSelector- 与策略对象允许从中入口流量的 pod 匹配的选择器。选择器与 NetworkPolicy 在同一命名空间中的 pod 匹配。
ingress.ports- 接受流量的一个或多个目标端口的列表。
3.2.2. 使用 CLI 创建网络策略 复制链接链接已复制到粘贴板!
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个网络策略。
如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的网络插件,如带有设置了mode: NetworkPolicy的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc)。 -
使用具有
admin权限的用户登陆到集群。 - 您在网络策略要应用到的命名空间中。
流程
创建策略规则。
创建一个
<policy_name>.yaml文件:$ touch <policy_name>.yaml其中:
<policy_name>- 指定网络策略文件名。
在创建的 文件中定义网络策略。以下示例拒绝来自所有命名空间中的所有 pod 的入口流量。这是一个基本的策略,阻止配置其他网络策略所允许的跨 pod 流量以外的所有跨 pod 网络。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 spec: podSelector: {} policyTypes: - Ingress ingress: []以下示例配置允许来自同一命名空间中的所有 pod 的入口流量:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: ingress: - from: - podSelector: {} # ...以下示例允许从特定命名空间中到一个 pod 的入口流量。此策略允许流量从在
namespace-y中运行的 pod 中获取pod-a标签。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-traffic-pod spec: podSelector: matchLabels: pod: pod-a policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace-y # ...以下示例配置限制了服务的流量。应用此策略可确保每个带有标签
app=bookstore和role=api的 Pod 只能被带有标签app=bookstore的 Pod 访问。在本例中,应用可以是 REST API 服务器,标记为标签app=bookstore和role=api。这个示例配置示例解决了以下用例:
- 将到一个服务的流量限制为仅使用需要它的其他微服务。
将连接限制为只允许使用它的应用程序。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: api-allow spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore # ...
运行以下命令来创建网络策略对象。成功输出列出了策略对象的名称
以及创建的状态。$ oc apply -f <policy_name>.yaml -n <namespace>其中:
<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文件中:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default namespace: my-project spec: podSelector: {} ingress: []其中:
namespace-
指定要部署策略的命名空间。例如,
my-project命名空间。 podSelector-
如果此字段为空,则配置与所有 pod 匹配。因此,该策略适用于
my-project命名空间中的所有 pod。 ingress-
其中
[]表示没有指定入口规则。这会导致传入的流量丢弃至所有 pod。
输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建的状态。$ oc apply -f deny-by-default.yaml
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文件中:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建的状态。$ oc apply -f web-allow-external.yaml此策略允许来自所有资源的流量,包括下图所示的外部流量:
3.2.5. 创建网络策略,允许从所有命名空间中到应用程序的流量 复制链接链接已复制到粘贴板!
您可以配置允许从所有命名空间中的所有 pod 流量到特定应用程序的策略。
如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的网络插件,如带有设置了mode: NetworkPolicy的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc)。 -
使用具有
admin权限的用户登陆到集群。 - 您在网络策略要应用到的命名空间中。
流程
创建一个策略,允许从所有命名空间中的所有 pod 流量到特定应用。将 YAML 保存到
web-allow-all-namespaces.yaml文件中:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 spec: podSelector: matchLabels: app: web policyTypes: - Ingress ingress: - from: - namespaceSelector: {}其中:
app-
仅将策略应用到 default 命名空间中的
app:webpod。 namespaceSelector选择所有命名空间中的所有 pod。
注意默认情况下,如果您没有在策略对象中指定
namespaceSelector参数,则不会选择命名空间。这意味着策略只允许从网络策略部署的命名空间的流量。
输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建的状态。$ oc apply -f web-allow-all-namespaces.yaml
验证
输入以下命令在
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>
3.2.6. 创建网络策略,允许从一个命名空间中到应用程序的流量 复制链接链接已复制到粘贴板!
您可以配置允许从特定命名空间中到带有 app=web 标签的 pod 的策略。这个配置在以下情况下很有用:
- 将流量限制为部署了生产工作负载的命名空间。
- 启用部署到特定命名空间的监控工具,以从当前命名空间中提取指标。
如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的网络插件,如带有设置了mode: NetworkPolicy的 OpenShift SDN 网络插件。 -
已安装 OpenShift CLI(
oc)。 -
使用具有
admin权限的用户登陆到集群。 - 您在网络策略要应用到的命名空间中。
流程
创建一个策略,允许来自特定命名空间中所有 pod 的流量,其标签为
purpose=production。将 YAML 保存到web-allow-prod.yaml文件中:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-prod namespace: default spec: podSelector: matchLabels: app: web policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production其中:
app-
仅将策略应用到 default 命名空间中的
app:webpod。 目的-
将流量仅限制为具有标签
purpose=production的命名空间中的 pod。
输入以下命令应用策略。成功输出列出了策略对象的名称
以及创建的状态。$ oc apply -f web-allow-prod.yaml
验证
输入以下命令在
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:下载超时。# wget -qO- --timeout=2 http://web.default运行以下命令,在
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>
3.2.7. 使用 OpenShift Cluster Manager 创建网络策略 复制链接链接已复制到粘贴板!
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个网络策略。
先决条件
- 已登陆到 OpenShift Cluster Manager。
- 您在 AWS 集群上创建了 Red Hat OpenShift Service。
- 已为集群配置身份提供程序。
- 将您的用户帐户添加到配置的身份提供程序中。
- 您在 AWS 集群上的 Red Hat OpenShift Service 中创建项目。
流程
- 在 OpenShift Cluster Manager 中点您要访问的集群。
- 点 Open console 以进入到 OpenShift Web 控制台。
- 点身份提供程序,并提供您的凭证以登录到集群。
- 使用管理员视角,在 Networking 下点 NetworkPolicies。
- 点 Create NetworkPolicy。
- 在 Policy name 字段中,提供策略的名称。
- 可选:如果此策略仅适用于一个或多个特定的 pod,您可以为特定 pod 提供标签和选择器。如果您没有选择特定 pod,则此策略将适用于集群中的所有 pod。
- 可选: 您可以通过选择 Deny all ingress traffic 或 Deny all egress traffic 复选框来阻止所有入口和出口流量。
- 您还可以添加入口和出口规则的任意组合,允许您指定您要批准的端口、命名空间或 IP 块。
在您的策略中添加入站规则:
选择 Add ingress 规则来配置新规则。此操作在 Add allowed source 下拉菜单中创建一个新的 Ingress rule 行,允许您指定如何限制入站流量。下拉菜单提供三个选项来限制您的入口流量:
- Allow pods from the same namespace 将流量限制为到同一命名空间中的 pod。您可以在命名空间中指定 pod,但将此选项留空允许来自该命名空间中的所有 pod 的流量。
- Allow pods from inside the cluster 将流量限制到与策略相同的集群中的 pod。您可以指定要允许入站流量的命名空间和 pod。将此选项留空可让来自此集群中所有命名空间和 pod 的入站流量。
- Allow peers by IP block 限制指定无域间路由 (CIDR) IP 块的流量。您可以使用例外选项阻止特定的 IP。将 CIDR 字段留空允许所有外部来源的所有入站流量。
- 您可以将所有入站流量限制为端口。如果您不添加任何端口,则流量可以访问所有端口。
在您的网络策略中添加出口规则:
选择 Add egress rule 来配置新规则。此操作会创建一个带有 Add allowed destination"* 下拉菜单的新 Egress 规则 行,它允许您指定如何限制出站流量。下拉菜单提供三个选项来限制您的出口流量:
- Allow pods from the same namespace 将出站流量限制为同一命名空间中的 pod。您可以在命名空间中指定 pod,但将此选项留空允许来自该命名空间中的所有 pod 的流量。
- Allow pods from inside the cluster 将流量限制到与策略相同的集群中的 pod。您可以指定要允许出站流量的命名空间和 pod。将这个选项留空允许来自此集群中所有命名空间和 pod 的出站流量。
- Allow peers by IP block 限制指定 CIDR IP 块的流量。您可以使用例外选项阻止特定的 IP。将 CIDR 字段留空允许所有外部来源的出站流量。
- 您可以将所有出站流量限制为端口。如果您不添加任何端口,则流量可以访问所有端口。