本页面介绍了如何在 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 与外部端点(集群外的任何 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:标准集群中的正文命名空间。