【问题标题】:Kubernetes Network Policy stops all traffic to PodKubernetes 网络策略停止所有到 Pod 的流量
【发布时间】:2026-02-01 04:50:01
【问题描述】:

场景:

  1. 我有四 (4) 个 Pod,Payroll,内部,外部,mysql。
  2. 我希望内部 pod 只能访问:
    • 一个。内部 > 8080 端口上的工资单
    • 乙。内部 > mysql 在端口 3306 上

请提出缺少的部分?我制定了以下网络策略。但我的吊舱无法与“任何”吊舱通信。 因此它已经实现了给定的目标,但实际上无法访问其他 pod。以下是我的网络政策详情。

master $ k describe netpol/internal-policy
Name:         internal-policy
Namespace:    default
Created on:   2020-02-20 02:15:06 +0000 UTC
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     name=internal
  Allowing ingress traffic:
    <none> (Selected pods are isolated for ingress connectivity)
  Allowing egress traffic:
    To Port: 8080/TCP
    To:
      PodSelector: name=payroll
    ----------
    To Port: 3306/TCP
    To:
      PodSelector: name=mysql
  Policy Types: Egress

政策 YAML

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: internal-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      name: internal
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          name: payroll
    ports:
      - protocol: TCP
        port: 8080
  - to:
    - podSelector:
        matchLabels:
          name: mysql
    ports:
      - protocol: TCP
        port: 3306 (edited) 

【问题讨论】:

  • mysql和payroll上的标签是否正确?
  • 负责实施网络策略的 CNI 怎么样?你用的是什么解决方案?
  • 是的,pod 标记正确。是的,一些网络策略插件已经到位,这就是为什么在创建此策略后 Pod 无法通信的原因。我访问了 kodekloud.com 中的虚拟 K8s 集群(通过 katakoda)

标签: networking kubernetes policy


【解决方案1】:

因此它达到了给定的目标,但实际上无法 访问其他 pod。

如果我对您的理解正确,您实现了网络政策中定义的目标,并且您所有的Pods 佩戴标签name: internal 目前都能够与payroll 通信(在端口@987654326 @) 和mysql(在端口3306Pods,对吧?

如果我错了,请纠正我,但我发现您的陈述有些矛盾。一方面,您希望您的 internal Pods 只能与一组非常特定的 Pods 通信并使用指定的端口与它们连接:

我希望内部 pod 只能访问:

一个。内部 > 8080 端口上的工资单

b.内部 > mysql 在端口 3306

另一方面,您似乎对他们无法访问任何其他Pods 感到惊讶:

因此它达到了给定的目标,但实际上无法 访问其他 pod。

请记住,当您对特定的 Pods 集合应用某些 NetworkPolicy 规则时,同时默认的 deny all 规则会隐式应用于选定的 Pods(除非您决定重新配置 default policy 以使其按您想要的方式工作)。

如你所见here:

Pod 通过选择它们的 NetworkPolicy 被隔离。一次 在选择特定 pod 的命名空间中有任何 NetworkPolicy, 该 pod 将拒绝任何不允许的任何连接 网络策略。 (命名空间中未被选中的其他 pod 任何 NetworkPolicy 都将继续接受所有流量。)

以上内容也适用于egress 规则。

如果当前您的internal Pods 只能访问指定的ports 上的payrollmysql Pod,则一切正常。

如果您有兴趣拒绝到您的 payrollmysql Pods 的所有其他流量,您应该对这些 Pods 应用 ingress 规则,而不是在 Pods 上定义 egress应该与他们交流,但同时他们不应该被剥夺与其他Pods交流的能力。

如果有帮助,请告诉我。如果有不清楚的地方或我的假设是错误的,也请告诉我,不要犹豫,提出其他问题。

【讨论】: