本页面介绍了如何在 Google Distributed Cloud (GDC) 空气隔离环境中,使用 Kubernetes 网络政策为标准集群配置集群内流量。
Kubernetes NetworkPolicy 指定 Pod 群组可以如何与彼此及其他网络端点进行通信。NetworkPolicy 资源使用标签选择 Pod,并定义规则,以便指定允许流向选定 Pod 的流量。这些政策的作用范围仅限于本地,并且仅适用于定义它们的集群内的流量,除非创建了允许所有流量的政策,该政策还允许与来自其他标准集群和共享集群的端点进行通信。
准备工作
如需配置 Kubernetes 网络政策,您必须在集群中拥有必要的权限,才能在相关命名空间中创建、修改和删除 NetworkPolicy 资源。
创建集群内 pod 到 pod 的政策
这些政策用于控制同一标准集群中各 Pod 之间的流量。
创建集群内 Pod 到 Pod 的入站流量政策
如需允许集群内部 Pod 到 Pod 的入站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-intra-cluster-ingress-traffic namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: Kubernetes.io/metadata.name: PEER_NAMESPACE podSelector: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。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关联的值。PORT:允许流量通过的主体工作负载上的端口。
创建集群内 pod 到 pod 的出站流量政策
如需允许集群内 pod 到 pod 的出站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-egress-intra-cluster-traffic namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: Kubernetes.io/metadata.name: PEER_NAMESPACE podSelector: matchLabels: PEER_LABEL_KEY: PEER_LABEL_VALUE ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。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关联的值。PORT:对等工作负载上允许流量通过的端口。
使用负载均衡器创建集群内 pod 到 pod 政策
当流量通过外部负载均衡器路由时,这些政策会控制同一集群中各 Pod 之间的流量。
使用负载均衡器创建集群内 pod 到 pod 的入站流量政策
如需使用负载均衡器允许集群内 pod 到 pod 的入站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-intra-cluster-ingress-traffic-via-elb namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Ingress ingress: - from: - ipBlock: cidr: EGRESS_NAT_IP/32 ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则具有标签app: backend的工作负载正在接收流量。EGRESS_NAT_IP:源 pod 的出站 NAT IP。PORT:允许流量通过的主体工作负载上的端口。
使用负载均衡器创建集群内 pod 到 pod 的出站流量政策
如需允许使用负载均衡器进行集群内 pod 到 pod 的出站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-intra-cluster-egress-traffic-via-elb namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Egress egress: - to: - ipBlock: cidr: ELB_EXTERNAL_IP/32 ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则具有app: backend标签的工作负载会发送流量。ELB_EXTERNAL_IP:负载均衡器的外部 IP 地址。PORT:允许流量流向的外部端点上的端口。
创建集群内节点政策
集群内节点政策用于控制同一标准集群内 Pod 与特定节点(例如控制平面 [API 服务器] 节点或工作器节点)之间的入站流量和出站流量。
您可以使用 NetworkPolicy 资源中的 ipBlock 字段来指定各个节点 IP 地址或节点 CIDR 范围(预览版)。
创建从集群节点到 pod 的入站流量政策
您可以创建入站流量政策,以允许来自特定集群节点的流量进入 pod。例如,您可以允许控制平面(API 服务器)节点访问运行自定义 Kubernetes 准入 Webhook 的 pod。
如需允许从集群节点到 pod 的入站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-from-node-to-pod namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Ingress ingress: - from: - ipBlock: cidr: NODE_IP_CIDR ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为webhook,则带有标签app: webhook的工作负载会接收流量。NODE_IP_CIDR:源集群节点(或多个节点)的 IP 地址或 CIDR 范围,例如采用/32表示法的控制平面节点 IP(例如10.200.0.10/32)。如需列出控制平面节点 IP 地址,请运行kubectl --kubeconfig CLUSTER_API_SERVER get nodes -l node-role.kubernetes.io/control-plane -o wide。PORT:允许流量通过的目标工作负载上的端口(例如8443或443)。
创建从 pod 到集群节点的出站流量政策
您可以创建出站流量政策,以允许 Pod 与特定集群节点通信。例如,您可以允许从 pod 到控制平面(API 服务器)节点的出站流量,同时默认拒绝规则会阻止到工作器节点的出站流量。
如需允许从 pod 到特定集群节点的出站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-egress-from-pod-to-node namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Egress egress: - to: - ipBlock: cidr: NODE_IP_CIDR ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为controller,则带有标签app: controller的工作负载会发送流量。NODE_IP_CIDR:目标集群节点(或多个节点)的 IP 地址或 CIDR 范围,例如采用/32表示法的控制平面节点 IP(例如10.200.0.10/32)。如需列出控制平面节点 IP 地址,请运行kubectl --kubeconfig CLUSTER_API_SERVER get nodes -l node-role.kubernetes.io/control-plane -o wide。PORT:允许流量到达的目标节点上的端口(例如6444或443)。
规模注意事项
在配置 Kubernetes 网络政策以定位特定节点或使用广泛的 CIDR 范围时,您的政策配置选择可能会影响可伸缩性和性能:
0.0.0.0/0的行为:在ipBlock规则中使用0.0.0.0/0等广泛的 CIDR 范围,不仅会匹配集群中的所有节点,还会匹配外部 IP 地址。- 规模:集群中的每个节点都有唯一的 CIDR 身份,每个 pod 端点都有一个存储其网络规则的内部政策表。在大型集群中,广泛的
ipBlock规则(例如0.0.0.0/0)会使政策表的使用量与节点数量成正比地增加,因为系统必须为每个唯一的节点 CIDR 身份创建条目。 - 警告:如果您的集群具有大量节点或许多复杂政策,请避免在
ipBlock规则中使用过于宽泛的 CIDR 范围,因为您可能会达到端点的政策表限制。如果某个端点超出此限制,则新的网络政策将无法应用,这可能会中断网络连接或阻止对相应 pod 强制执行政策。
创建组织外部政策
这些政策用于控制标准集群中的 Pod 与外部端点(集群外的任何 IP 地址)之间的流量。
为组织外部流量创建入站政策
如需允许来自组织外部端点的入站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-from-organization-external-to-standard-cluster-pod namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Ingress ingress: - from: - ipBlock: cidr: EXTERNAL_CIDR ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则具有标签app: backend的工作负载正在接收流量。EXTERNAL_CIDR:外部 CIDR,例如:20.0.0.0/16。PORT:允许流量通过的主体工作负载上的端口。
为组织外部流量创建出站政策
如需允许出站流量流向组织外部端点,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-egress-from-standard-cluster-pod-to-organization-external namespace: SUBJECT_NAMESPACE spec: podSelector: matchLabels: SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE policyTypes: - Egress egress: - to: - ipBlock: cidr: EXTERNAL_CIDR ports: - protocol: TCP port: PORT EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。SUBJECT_LABEL_KEY:用于选择目标工作负载的标签的键。例如app、tier或role。SUBJECT_LABEL_VALUE:与SUBJECT_LABEL_KEY关联的值。例如,如果SUBJECT_LABEL_KEY为app,且SUBJECT_LABEL_VALUE为backend,则具有app: backend标签的工作负载会发送流量。EXTERNAL_CIDR:外部 CIDR,例如:20.0.0.0/16。PORT:允许流量流向的外部端点上的端口。
创建“全部允许”政策
以下政策可用于明确允许所有流量。这样便可与来自其他标准集群和共享集群的端点进行通信。
创建入站流量全允许政策
如需允许所有入站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-ingress-traffic namespace: SUBJECT_NAMESPACE spec: podSelector: {} policyTypes: - Ingress ingress: - {} EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。
创建出站流量“全部允许”政策
如需允许所有出站流量,请创建并应用以下资源:
kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-egress-traffic namespace: SUBJECT_NAMESPACE spec: podSelector: {} policyTypes: - Egress egress: - {} EOF替换以下内容:
CLUSTER_API_SERVER:集群 API 服务器的 kubeconfig 路径。如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。SUBJECT_NAMESPACE:标准集群中的主体命名空间。