为标准集群创建 Kubernetes 网络政策

本页面介绍了如何在 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:用于选择主题工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 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:用于选择主题工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 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:用于选择主题工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 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:用于选择主题工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 app: backend 的工作负载正在发送流量。
    • ELB_EXTERNAL_IP:负载均衡器的外部 IP 地址。
    • PORT:允许流量流向的外部端点上的端口。

创建组织外部政策

这些政策用于控制标准集群中的 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:用于选择主题工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 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:用于选择主题工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 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:标准集群中的正文命名空间。