[英]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-recipes和Declare Network Policy上查看 Ingress 和 Egress 的一些不錯的示例。
您的最后一個網絡策略同時解決了 Egress 和 Ingress。 我會在兩個不同的 yaml 文件中拆分 Egress 和 Ingress(如果有幾個不同的 Ingress/Egress 策略,我也會將它們拆分到不同的文件中),然后我會一一應用它們。 這種方式更容易閱讀。 另外,如果您使用拒絕規則,我會先應用它,然后再應用其他規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.