×

构建时网络策略工具允许您使用roxctl CLI 自动创建和验证 Kubernetes 网络策略,以用于您的开发和运维工作流程。这些工具与包含项目工作负载和网络策略清单的指定文件目录一起工作,不需要 RHACS 身份验证。

表 1. 网络策略工具
命令 描述

roxctl netpol generate

通过分析指定目录中项目的 YAML 清单来生成 Kubernetes 网络策略。更多信息,请参见 使用构建时网络策略生成器

roxctl netpol connectivity map

通过检查工作负载和 Kubernetes 网络策略清单,列出项目目录中工作负载之间的允许连接。您可以生成各种文本格式或图形.dot格式的输出。更多信息,请参见 使用 roxctl netpol connectivity map 命令进行连接映射

roxctl netpol connectivity diff

此功能列出两个项目版本之间允许连接的差异。这由每个版本目录中的工作负载和 Kubernetes 网络策略清单决定。此功能显示语义差异,在执行源代码 (语法) `diff` 时并不明显。更多信息,请参阅 识别项目版本之间允许连接的差异

使用构建时网络策略生成器

构建时网络策略生成器可以根据应用程序 YAML 清单自动生成 Kubernetes 网络策略。您可以在将应用程序部署到集群之前,将其用作持续集成/持续交付 (CI/CD) 管道的一部分来开发网络策略。

Red Hat 与 NP-Guard 项目 的开发人员合作开发了此功能。首先,构建时网络策略生成器分析本地文件夹中的 Kubernetes 清单,包括服务清单、配置映射和工作负载清单,例如 `Pod`、`Deployment`、`ReplicaSet`、`Job`、`DaemonSet` 和 `StatefulSet`。然后,它会发现所需的连接并创建 Kubernetes 网络策略以实现 Pod 隔离。这些策略只允许所需的不超过也不少于所需的入口和出口流量。

生成构建时网络策略

构建时网络策略生成器包含在 `roxctl` CLI 中。对于构建时网络策略生成功能,`roxctl` CLI 不需要与 RHACS Central 通信,因此您可以在任何开发环境中使用它。

先决条件
  1. 构建时网络策略生成器会在您运行命令时递归扫描您指定的目录。因此,在运行命令之前,您必须已将服务清单、配置映射和工作负载清单(例如 `Pod`、`Deployment`、`ReplicaSet`、`Job`、`DaemonSet` 和 `StatefulSet`)作为 YAML 文件放在指定的目录中。

  2. 验证您可以使用 `kubectl apply -f` 命令按原样应用这些 YAML 文件。构建时网络策略生成器不适用于使用 Helm 风格模板的文件。

  3. 验证服务网络地址没有硬编码。每个需要连接到服务的负载都必须将服务网络地址指定为变量。您可以使用工作负载的资源环境变量或配置映射来指定此变量。

  4. 服务网络地址必须匹配以下官方正则表达式模式

    (http(s)?://)?<svc>(.<ns>(.svc.cluster.local)?)?(:<portNum>)? (1)
    1 在此模式中,
    • <svc> 是服务名称。

    • <ns> 是您定义服务的命名空间。

    • <portNum> 是公开的服务端口号。

    以下是与模式匹配的一些示例

    • wordpress-mysql:3306

    • redis-follower.redis.svc.cluster.local:6379

    • redis-leader.redis

    • http://rating-service.

步骤
  1. 通过运行帮助命令来验证构建时网络策略生成功能是否可用

    $ roxctl netpol generate -h
  2. 使用 `netpol generate` 命令生成策略

    $ roxctl netpol generate <folder_path> [flags] (1)
    1 指定文件夹的路径,该路径可以包含包含要分析的 YAML 资源的子文件夹。该命令会扫描整个子文件夹树。或者,您还可以指定参数来修改命令的行为。

    有关可选参数的更多信息,请参阅 roxctl netpol generate 命令选项

后续步骤
  • 生成策略后,必须检查策略的完整性和准确性,以防 YAML 文件中未按预期指定任何相关的网络地址。

  • 最重要的是,验证隔离策略是否未阻止所需的连接。为了帮助进行此检查,您可以使用 `roxctl netpol connectivity map` 工具。

在工作负载部署过程中使用自动化将网络策略应用于集群可以节省时间并确保准确性。您可以通过使用拉取请求提交生成的策略来遵循 GitOps 方法,从而使团队有机会在将策略作为管道的一部分部署之前对其进行审查。

roxctl netpol generate 命令选项

`roxctl netpol generate` 命令支持以下选项

选项 描述

-h, --help

查看 `netpol` 命令的帮助文本。

-d, --output-dir <dir>

将生成的策略保存到目标文件夹。每个策略一个文件。

-f, --output-file <filename>

将生成的策略保存并合并到单个 YAML 文件中。

--fail

在遇到第一个错误时失败。默认值为 `false`。

--remove

如果输出路径已存在,则将其删除。

--strict

将警告视为错误。默认值为 `false`。

使用 roxctl netpol connectivity map 命令进行连接映射

连接映射提供有关基于 Kubernetes 清单中定义的网络策略的不同工作负载之间允许连接的详细信息。您可以可视化并了解根据您设置的网络策略,Kubernetes 环境中不同的工作负载如何相互通信。

要检索连接映射信息,`roxctl netpol connectivity map` 命令需要一个包含 Kubernetes 工作负载和网络策略清单的目录路径。输出提供有关所分析 Kubernetes 资源内连接详细信息。

从 Kubernetes 清单目录检索连接映射信息

步骤
  • 运行以下命令以检索连接映射信息

    $ roxctl netpol connectivity map <folder_path> [flags] (1)
    1 指定文件夹的路径,该路径可以包含包含要分析的 YAML 资源和网络策略的子文件夹,例如 netpol-analysis-example-minimal/。该命令会扫描整个子文件夹树。或者,您还可以指定参数来修改命令的行为。

    有关可选参数的更多信息,请参阅 roxctl netpol connectivity map 命令选项

    示例 1. 示例输出
    目标 连接

    0.0.0.0-255.255.255.255

    default/frontend[Deployment]

    TCP 8080

    default/frontend[Deployment]

    0.0.0.0-255.255.255.255

    UDP 53

    default/frontend[Deployment]

    default/backend[Deployment]

    TCP 9090

输出显示一个包含允许连接行的列表的表格。每条连接线由三个部分组成:源 (src)、目标 (dst) 和允许的连接属性 (conn)。

您可以将 src 解释为源端点,dst 解释为目标端点,conn 解释为允许的连接属性。端点的格式为 namespace/name[Kind],例如 default/backend[Deployment]

连接图输出格式和可视化

您可以使用各种输出格式,包括txtmdcsvjsondotdot格式非常适合将输出可视化为连接图。可以使用图形可视化软件(例如Graphviz工具VSCode扩展)查看。您可以使用Graphviz(无论是本地安装还是通过在线查看器)将dot输出转换为svgjpegpng等格式。

使用Graphviz从dot输出生成svg图形

请按照以下步骤从dot输出创建svg格式的图形。

先决条件
  • Graphviz已安装在您的本地系统上。

步骤

roxctl netpol connectivity map命令选项

roxctl netpol connectivity map命令支持以下选项

选项 描述

--fail

在遇到第一个错误时失败。默认值为 `false`。

--focus-workload string

关注输出中指定工作负载名称的连接。

-h, --help

查看roxctl netpol connectivity map命令的帮助文本。

-f, --output-file string

将连接列表输出保存到特定文件。

-o, --output-format string

配置输出格式。支持的格式包括txtjsonmddotcsv。默认值为txt

--remove

如果输出路径已存在,则将其删除。默认值为false

--save-to-file

将连接列表输出保存到默认文件。默认值为false

--strict

将警告视为错误。默认值为 `false`。

识别项目版本之间允许连接的差异

此命令可帮助您了解两个项目版本之间允许连接的差异。它分析位于每个版本目录中的工作负载和Kubernetes网络策略清单,并创建文本格式的差异表示。

您可以查看各种输出格式的连接差异报告,包括textmddotcsv

使用roxctl netpol connectivity diff命令生成连接差异报告

要生成连接差异报告,roxctl netpol connectivity diff命令需要两个文件夹,dir1dir2,每个文件夹都包含Kubernetes清单,包括网络策略。

步骤
  • 运行以下命令以确定指定目录中Kubernetes清单之间的连接差异

    $ roxctl netpol connectivity diff --dir1=<folder_path_1> --dir2=<folder_path_2> [flags] (1)
    1 指定文件夹的路径,其中可以包含包含YAML资源和网络策略以供分析的子文件夹。该命令会扫描两个目录的整个子文件夹树。例如,<folder_path_1>netpol-analysis-example-minimal/,而<folder_path_2>netpol-diff-example-minimal/。您还可以选择指定参数来修改命令的行为。

    有关可选参数的更多信息,请参见roxctl netpol connectivity diff命令选项

    该命令考虑您可以使用kubectl apply -f接受的所有YAML文件,然后这些文件将成为roxctl netpol connectivity diff命令的有效输入。

    示例2. 示例输出
    差异类型 目标 dir 1 dir 2 工作负载差异信息

    已更改

    default/frontend[Deployment]

    default/backend[Deployment]

    TCP 9090

    TCP 9090,UDP 53

    已添加

    0.0.0.0-255.255.255.255

    default/backend[Deployment]

    无连接

    TCP 9090

语义差异报告概述了与dir1中允许的连接相比,在dir2中更改、添加或删除的连接。查看输出时,每一行都表示与dir1相比,在dir2中添加、删除或更改的一个允许连接。

以下是roxctl netpol connectivity diff命令生成的各种格式的示例输出

如果适用,workloads-diff-info将提供有关与添加或删除的连接相关的已添加或删除工作负载的更多详细信息。

例如,如果由于删除了工作负载B而删除了从工作负载A到工作负载B的连接,则workloads-diff-info指示已删除工作负载B。但是,如果仅由于网络策略更改而删除了此类连接,并且既没有删除工作负载A也没有删除工作负载B,则workloads-diff-info为空。

roxctl netpol connectivity diff命令选项

roxctl netpol connectivity diff命令支持以下选项

选项 描述

--dir1 string

输入资源的第一个目录路径。这是必选选项。

--dir2 string

要与第一个目录路径比较的输入资源的第二个目录路径。这是必选选项。

--fail

在遇到第一个错误时失败。默认值为 `false`。

-h, --help

查看roxctl netpol connectivity diff命令的帮助文本。

-f, --output-file string

将连接差异输出保存到特定文件。

-o, --output-format string

配置输出格式。支持的格式包括txtmddotcsv。默认值为txt

--remove

如果输出路径已存在,则将其删除。默认值为false

--save-to-file

将连接差异输出保存到默认文件。默认值为false

--strict

将警告视为错误。默认值为 `false`。

区分语法和语义差异输出

在以下示例中,dir1netpol-analysis-example-minimal/dir2netpol-diff-example-minimal/。这两个目录之间的区别是网络策略backend-netpol的一小处更改。

来自dir1的示例策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  creationTimestamp: null
  name: backend-netpol
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - port: 9090
      protocol: TCP
  podSelector:
    matchLabels:
      app: backendservice
  policyTypes:
  - Ingress
  - Egress
status: {}

dir2中的更改是在ports属性之前添加了-,这会产生差异输出。

语法差异输出

步骤
  • 运行以下命令以比较两个指定目录中netpols.yaml文件的内容

    $ diff netpol-diff-example-minimal/netpols.yaml netpol-analysis-example-minimal/netpols.yaml
    示例输出
    12c12
    <   - ports:
    ---
    >     ports:

语义差异输出

步骤
  • 运行以下命令以分析两个指定目录中Kubernetes清单和网络策略之间的连接差异

    $ roxctl netpol connectivity diff --dir1=roxctl/netpol/connectivity/diff/testdata/netpol-analysis-example-minimal/ --dir2=roxctl/netpol/connectivity/diff/testdata/netpol-diff-example-minimal
    示例输出
    Connectivity diff:
    diff-type: changed, source: default/frontend[Deployment], destination: default/backend[Deployment], dir1:  TCP 9090, dir2: TCP 9090,UDP 53
    diff-type: added, source: 0.0.0.0-255.255.255.255, destination: default/backend[Deployment], dir1:  No Connections, dir2: TCP 9090