簡體   English   中英

Kubernetes 入口網絡策略按預期工作,出口阻塞所有流量

[英]Kubernetes Ingress network policy working as expected, egress is blocking all traffic

我已經從這里在 EKS 上安裝了 Calico。

我有兩個命名空間,foo 和 bar,都標有“目的”標簽,每個都包含一個應用程序 pod。

當我將以下 Ingress-only 策略導入 foo 命名空間時,它完全按預期工作; 其他測試 pod 無法連接到 foo-app,但 bar-app 可以。

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: foo
  namespace: foo
spec:
  podSelector:
    matchLabels:
      app: foo-app
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - from:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

但是,當我導入包含入口和出口規則的策略時,它會完全關閉與 pod 的網絡連接。 我什至無法從 bar-app ping foo-app pod IP。

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: foo
  namespace: foo
spec:
  podSelector:
    matchLabels:
      app: foo-app
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - from:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

在刪除並系統地重新添加部分策略之后,肯定是在出口中添加namespaceSelector條目破壞了它。

集群上沒有其他網絡策略。

如果沒有直接明顯的原因說明為什么會發生這種情況; 除了在工作節點上瀏覽 netfilter 規則之外:有沒有有效的方法來調試這個?

我認為您的Network Policy編寫不正確。

我覺得你應該改變

  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - to:
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

這是因為您可能阻止了用於將服務名稱解析為其 IP 地址的 DNS。 您可以閱讀非常好的Kubernetes 網絡策略安全人員簡介

如果這仍然是一個問題,請提供有關 pod 在哪里運行的詳細信息,標簽是什么以及您要實施哪些規則。

您還可以在 GitHub - ahmetb/kubernetes-network-policy-recipesDeclare Network Policy上查看 Ingress 和 Egress 的一些不錯的示例。

您的最后一個網絡策略同時解決了 Egress 和 Ingress。 我會在兩個不同的 yaml 文件中拆分 Egress 和 Ingress(如果有幾個不同的 Ingress/Egress 策略,我也會將它們拆分到不同的文件中),然后我會一一應用它們。 這種方式更容易閱讀。 另外,如果您使用拒絕規則,我會先應用它,然后再應用其他規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM