本页面介绍了如何在 Google Distributed Cloud (GDC) air-gapped 中配置项目内流量网络政策。
项目级网络政策定义入站规则或出站规则。您可以定义允许在项目内、项目之间以及与外部 IP 地址进行通信的政策。
默认情况下,这些政策适用于所有可用区。如需详细了解 GDC 世界中的全局资源,请参阅多地区概览。
如果需要在单个可用区内强制执行项目内流量,请参阅创建单可用区工作负载级项目内政策。
准备工作
如需配置项目内流量网络政策,您必须具备以下条件:
- 必要的身份和访问权限角色。如需管理特定项目的政策,您需要拥有
project-networkpolicy-admin角色。对于需要管理跨所有可用区的政策的多可用区环境,您需要拥有global-project-networkpolicy-admin角色。如需了解详情,请参阅准备预定义角色和访问权限。 - 现有项目。如需了解详情,请参阅创建项目。
创建项目内政策
对于项目内的流量,GDC 默认会为每个项目应用预定义的项目网络政策(即项目内政策)。默认情况下,项目命名空间中的工作负载能够相互通信,而不会向外部资源公开任何内容。
默认情况下,系统不配置出站政策,因此允许所有项目内流量的出站流量。不过,当您设置单个出站政策时,系统仅允许该政策指定的流量。
创建入站项目内政策
创建项目时,您会隐式创建默认的基本 ProjectNetworkPolicy 资源,以实现项目内通信。此政策允许来自同一项目中其他工作负载的入站流量。
您可以移除默认政策,但请注意,移除后,项目中的所有服务和工作负载都将无法进行项目内通信。如需移除该政策,请使用 kubectl delete 命令:
kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT
您可以应用以下清单来重新添加默认政策:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
namespace: PROJECT
name: base-policy-allow-intra-project-traffic
spec:
policyType: Ingress
ingress:
- from:
- projectSelector:
projects:
matchNames:
- PROJECT
EOF
替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT:您的项目的名称。
创建出站项目内政策
当您停用数据渗漏防护功能并向项目应用 ProjectNetworkPolicy 出站流量政策(例如禁止访问外部资源)时,请使用以下必需的政策来允许项目内部的出站流量:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
namespace: PROJECT
name: allow-intra-project-outbound-traffic
spec:
policyType: Egress
egress:
- to:
- projectSelector:
projects:
matchNames:
- PROJECT
EOF
替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT:您的项目的名称。
创建工作负载级项目内政策
工作负载级网络政策可精细控制项目中各个工作负载之间的通信。这种精细度可实现更严格的网络访问权限控制,从而提高安全性和资源利用率。
创建入站工作负载级项目内政策
创建项目时,您会隐式创建默认的基本 ProjectNetworkPolicy 资源,从而实现项目内所有工作负载之间的通信。此政策允许来自同一项目中其他工作负载的入站流量。
如需创建入站流量工作负载级项目内政策,必须先删除默认的基本政策。否则,可能会出现意外行为。
如需删除默认基本政策,请运行以下命令:
kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT如需创建入站工作负载级项目内政策,请创建并应用以下自定义资源:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-workload-level-intra-project-inbound-traffic spec: policyType: Ingress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: workloads: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE ingress: - from: - projectSelector: projects: matchNames: - PROJECT workloadSelector: labelSelector: workloads: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT:您的项目的名称。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载会接收流量。PEER_LABEL_KEY:用于选择对等工作负载的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。PEER_LABEL_VALUE:与PEER_LABEL_KEY关联的值。
创建出站工作负载级项目内政策
如需创建出站工作负载级项目内政策,请创建并应用以下自定义资源:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-workload-level-intra-project-outbound-traffic spec: policyType: Egress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: workloads matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE egress: - to: - projectSelector: projects: matchNames: - PROJECT workloadSelector: labelSelector: workloads: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT:您的项目的名称。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载正在发送流量。PEER_LABEL_KEY:用于选择对等工作负载的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。PEER_LABEL_VALUE:与PEER_LABEL_KEY关联的值。
创建单可用区工作负载级项目内政策
工作负载级网络政策可以在单个可用区内强制执行 PNP。您可以向单个可用区中的工作负载添加特定标签,从而控制项目内或不同项目之间该可用区中各个工作负载之间的通信。
创建单可用区入站流量工作负载级项目内政策
创建项目时,您会隐式创建默认的基本 ProjectNetworkPolicy 资源,从而实现项目内所有工作负载之间的通信。此政策允许来自同一项目中其他工作负载的入站流量。
如需创建单区域入站流量工作负载级项目内政策,必须先删除默认的基础政策。否则,可能会出现意外行为。
如需删除默认基本政策,请运行以下命令:
kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT如需创建单可用区 Ingress 工作负载级项目内流量网络政策,请创建并应用以下自定义资源:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-single-zone-intra-project-inbound-traffic spec: policyType: Ingress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: workloads: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE ingress: - from: - projectSelector: projects: matchNames: - PROJECT workloadSelector: labelSelector: workloads: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE ZONE_PEER_LABEL_KEY: ZONE_PEER_LABEL_VALUE EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT:您的项目的名称。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载会接收流量。PEER_LABEL_KEY:用于选择对等工作负载的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。PEER_LABEL_VALUE:与PEER_LABEL_KEY关联的值。ZONE_SUBJECT_LABEL_KEY:用于选择主题地区的标签的键。例如,zone或region。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。ZONE_SUBJECT_LABEL_VALUE:与ZONE_SUBJECT_LABEL_KEY关联的值。例如,如果ZONE_SUBJECT_LABEL_KEY为zone,且ZONE_SUBJECT_LABEL_VALUE为us-central1-a,则带有标签zone: us-central1-a的工作负载会接收流量。ZONE_PEER_LABEL_KEY:用于选择与对等互联关联的可用区的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。ZONE_PEER_LABEL_VALUE:与ZONE_PEER_LABEL_KEY关联的值。
创建单可用区出站流量工作负载级项目内政策
如需创建单可用区出站工作负载级项目内政策,请创建并应用以下自定义资源:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-single-zone-intra-project-outbound-traffic spec: policyType: Egress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: workloads: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE egress: - to: - projectSelector: projects: matchNames: - PROJECT workloadSelector: labelSelector: workloads: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE ZONE_PEER_LABEL_KEY: ZONE_PEER_LABEL_VALUE EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT:您的项目的名称。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载会接收流量。PEER_LABEL_KEY:用于选择对等工作负载的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。PEER_LABEL_VALUE:与PEER_LABEL_KEY关联的值。ZONE_SUBJECT_LABEL_KEY:用于选择主题地区的标签的键。例如,zone或region。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。ZONE_SUBJECT_LABEL_VALUE:与ZONE_SUBJECT_LABEL_KEY关联的值。例如,如果ZONE_SUBJECT_LABEL_KEY为zone,且ZONE_SUBJECT_LABEL_VALUE为us-central1-a,则带有标签zone: us-central1-a的工作负载会接收流量。ZONE_PEER_LABEL_KEY:用于选择与对等互联关联的可用区的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。ZONE_PEER_LABEL_VALUE:与ZONE_PEER_LABEL_KEY关联的值。
为标准集群创建项目内政策
标准集群是项目级 Kubernetes 集群,可提供更高的控制力、灵活性和集群管理员权限。创建项目内政策时,标准集群默认会继承该政策。此政策允许同一项目中的标准集群之间进行所有通信。
为标准集群创建入站项目内政策
创建项目时,您会隐式创建默认的基本 ProjectNetworkPolicy 资源,从而实现项目内所有工作负载之间的通信。此政策允许来自同一项目中其他工作负载的入站流量,还允许项目中的标准集群内的所有工作负载之间进行集群内通信。
如需为标准集群创建入站项目内政策,必须先删除默认的基本政策。否则,可能会出现意外行为。
如需删除默认基本政策,请运行以下命令:
kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT您可以应用以下清单来重新添加默认政策:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: base-policy-allow-intra-project-traffic spec: policyType: Ingress ingress: - from: - projectSelector: projects: matchNames: - PROJECT EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。PROJECT:您的项目的名称。
如需在标准集群中创建入站集群内 pod 到 pod 政策,请创建并应用以下自定义资源
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: STANDARD_CLUSTER_PROJECT name: allow-ingress-from-intra-cluster-traffic spec: policyType: Ingress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: clusters: matchLabels: kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME namespaces: matchLabels: kubernetes.io/metadata.name: SUBJECT_NAMESPACE workloads: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE ingress: - from: - projectSelector: projects: matchNames: - STANDARD_CLUSTER_PROJECT workloadSelector: labelSelector: clusters: matchLabels: kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME namespaces: matchLabels: kubernetes.io/metadata.name: PEER_NAMESPACE workloads: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。STANDARD_CLUSTER_PROJECT:标准集群项目的名称。STANDARD_CLUSTER_NAME:标准集群的名称。SUBJECT_NAMESPACE:标准集群中的正文命名空间。PEER_NAMESPACE:标准集群中的对等命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载会接收流量。PEER_LABEL_KEY:用于选择对等工作负载的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。PEER_LABEL_VALUE:与PEER_LABEL_KEY关联的值。
如需在标准集群中创建入站集群内节点到 Pod 政策,请创建并应用以下自定义资源:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: STANDARD_CLUSTER_PROJECT name: allow-ingress-from-node-to-pod-traffic spec: policyType: Ingress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: clusters: matchLabels: kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME namespaces: matchLabels: kubernetes.io/metadata.name: SUBJECT_NAMESPACE workloads: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE ingress: - from: - ipBlocks: - cidr: NODE_IP ports: - protocol: TCP port: PORT EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。STANDARD_CLUSTER_PROJECT:标准集群项目的名称。STANDARD_CLUSTER_NAME:标准集群的名称。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载会接收流量。NODE_IP:节点的 IP 地址。PORT:允许流量通过的正文工作负载的端口。
为标准集群创建出站流量项目内政策
如需在标准集群中创建出站集群内 pod 到 pod 政策,请创建并应用以下自定义资源
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: STANDARD_CLUSTER_PROJECT name: allow-egress-to-intra-cluster-traffic spec: policyType: Egress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: clusters: matchLabels: kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME namespaces: matchLabels: kubernetes.io/metadata.name: SUBJECT_NAMESPACE workloads: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE egress: - to: - projectSelector: projects: matchNames: - STANDARD_CLUSTER_PROJECT workloadSelector: labelSelector: clusters: matchLabels: kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME namespaces: matchLabels: kubernetes.io/metadata.name: PEER_NAMESPACE workloads: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。STANDARD_CLUSTER_PROJECT:标准集群项目的名称。STANDARD_CLUSTER_NAME:标准集群的名称。SUBJECT_NAMESPACE:标准集群中的正文命名空间。PEER_NAMESPACE:标准集群中的对等命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载正在发送流量。PEER_LABEL_KEY:用于选择对等工作负载的标签的键。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。PEER_LABEL_VALUE:与PEER_LABEL_KEY关联的值。
- 如需在标准集群中创建出站集群内 Pod 到节点政策,请创建并应用以下自定义资源:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: STANDARD_CLUSTER_PROJECT name: allow-egress-from-pod-to-node-traffic spec: policyType: Egress subject: subjectType: UserWorkload userWorkloadSelector: labelSelector: clusters: matchLabels: kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME namespaces: matchLabels: kubernetes.io/metadata.name: SUBJECT_NAMESPACE workloads: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE egress: - to: - ipBlocks: - cidr: NODE_IP ports: - protocol: TCP port: PORT EOF替换以下内容:
GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。STANDARD_CLUSTER_PROJECT:标准集群项目的名称。STANDARD_CLUSTER_NAME:标准集群的名称。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。如果您要引用虚拟机标签,则必须为此键添加前缀;请参阅此列表后面的警告。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则带有标签app: backend的工作负载正在发送流量。NODE_IP:节点的 IP 地址。PORT:节点 IP 上允许流量通过的端口。