(http(s)?://)?<svc>(.<ns>(.svc.cluster.local)?)?(:<portNum>)? (1)
构建时网络策略工具允许您使用roxctl
CLI 自动创建和验证 Kubernetes 网络策略,以用于您的开发和运维工作流程。这些工具与包含项目工作负载和网络策略清单的指定文件目录一起工作,不需要 RHACS 身份验证。
命令 | 描述 |
---|---|
|
通过分析指定目录中项目的 YAML 清单来生成 Kubernetes 网络策略。更多信息,请参见 使用构建时网络策略生成器。 |
|
通过检查工作负载和 Kubernetes 网络策略清单,列出项目目录中工作负载之间的允许连接。您可以生成各种文本格式或图形 |
|
此功能列出两个项目版本之间允许连接的差异。这由每个版本目录中的工作负载和 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 通信,因此您可以在任何开发环境中使用它。
构建时网络策略生成器会在您运行命令时递归扫描您指定的目录。因此,在运行命令之前,您必须已将服务清单、配置映射和工作负载清单(例如 `Pod`、`Deployment`、`ReplicaSet`、`Job`、`DaemonSet` 和 `StatefulSet`)作为 YAML 文件放在指定的目录中。
验证您可以使用 `kubectl apply -f` 命令按原样应用这些 YAML 文件。构建时网络策略生成器不适用于使用 Helm 风格模板的文件。
验证服务网络地址没有硬编码。每个需要连接到服务的负载都必须将服务网络地址指定为变量。您可以使用工作负载的资源环境变量或配置映射来指定此变量。
服务网络地址必须匹配以下官方正则表达式模式
(http(s)?://)?<svc>(.<ns>(.svc.cluster.local)?)?(:<portNum>)? (1)
1 | 在此模式中,
|
以下是与模式匹配的一些示例
wordpress-mysql:3306
redis-follower.redis.svc.cluster.local:6379
redis-leader.redis
http://rating-service.
通过运行帮助命令来验证构建时网络策略生成功能是否可用
$ roxctl netpol generate -h
使用 `netpol generate` 命令生成策略
$ roxctl netpol generate <folder_path> [flags] (1)
1 | 指定文件夹的路径,该路径可以包含包含要分析的 YAML 资源的子文件夹。该命令会扫描整个子文件夹树。或者,您还可以指定参数来修改命令的行为。 |
有关可选参数的更多信息,请参阅 roxctl netpol generate 命令选项。
生成策略后,必须检查策略的完整性和准确性,以防 YAML 文件中未按预期指定任何相关的网络地址。
最重要的是,验证隔离策略是否未阻止所需的连接。为了帮助进行此检查,您可以使用 `roxctl netpol connectivity map` 工具。
在工作负载部署过程中使用自动化将网络策略应用于集群可以节省时间并确保准确性。您可以通过使用拉取请求提交生成的策略来遵循 GitOps 方法,从而使团队有机会在将策略作为管道的一部分部署之前对其进行审查。 |
连接映射提供有关基于 Kubernetes 清单中定义的网络策略的不同工作负载之间允许连接的详细信息。您可以可视化并了解根据您设置的网络策略,Kubernetes 环境中不同的工作负载如何相互通信。
要检索连接映射信息,`roxctl netpol connectivity map` 命令需要一个包含 Kubernetes 工作负载和网络策略清单的目录路径。输出提供有关所分析 Kubernetes 资源内连接详细信息。
运行以下命令以检索连接映射信息
$ roxctl netpol connectivity map <folder_path> [flags] (1)
1 | 指定文件夹的路径,该路径可以包含包含要分析的 YAML 资源和网络策略的子文件夹,例如 netpol-analysis-example-minimal/ 。该命令会扫描整个子文件夹树。或者,您还可以指定参数来修改命令的行为。 |
有关可选参数的更多信息,请参阅 roxctl netpol connectivity map 命令选项。
源 | 目标 | 连接 |
---|---|---|
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]
。
您可以使用各种输出格式,包括txt
、md
、csv
、json
和dot
。dot
格式非常适合将输出可视化为连接图。可以使用图形可视化软件(例如Graphviz工具和VSCode扩展)查看。您可以使用Graphviz(无论是本地安装还是通过在线查看器)将dot
输出转换为svg
、jpeg
或png
等格式。
请按照以下步骤从dot
输出创建svg
格式的图形。
Graphviz已安装在您的本地系统上。
运行以下命令以svg
格式创建图形
$ dot -Tsvg connlist_output.dot > connlist_output_graph.svg
以下是dot输出和Graphviz生成的图形示例
roxctl netpol connectivity map
命令支持以下选项
选项 | 描述 |
---|---|
|
在遇到第一个错误时失败。默认值为 `false`。 |
|
关注输出中指定工作负载名称的连接。 |
|
查看 |
|
将连接列表输出保存到特定文件。 |
|
配置输出格式。支持的格式包括 |
|
如果输出路径已存在,则将其删除。默认值为 |
|
将连接列表输出保存到默认文件。默认值为 |
|
将警告视为错误。默认值为 `false`。 |
此命令可帮助您了解两个项目版本之间允许连接的差异。它分析位于每个版本目录中的工作负载和Kubernetes网络策略清单,并创建文本格式的差异表示。
您可以查看各种输出格式的连接差异报告,包括text
、md
、dot
和csv
。
要生成连接差异报告,roxctl netpol connectivity diff
命令需要两个文件夹,dir1
和dir2
,每个文件夹都包含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命令选项。
该命令考虑您可以使用 |
差异类型 | 源 | 目标 | 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
命令支持以下选项
选项 | 描述 |
---|---|
|
输入资源的第一个目录路径。这是必选选项。 |
|
要与第一个目录路径比较的输入资源的第二个目录路径。这是必选选项。 |
|
在遇到第一个错误时失败。默认值为 `false`。 |
|
查看 |
|
将连接差异输出保存到特定文件。 |
|
配置输出格式。支持的格式包括 |
|
如果输出路径已存在,则将其删除。默认值为 |
|
将连接差异输出保存到默认文件。默认值为 |
|
将警告视为错误。默认值为 `false`。 |
在以下示例中,dir1
是netpol-analysis-example-minimal/
,dir2
是netpol-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