kubernetes - Kubernetes 中的 NetworkPolicy 在 podSelector 上不匹配
问题描述
我有一个简单的工作 NetworkPolicy 看起来像这样
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: monitoring-network-policy-prometheus-jbn
namespace: monitoring
spec:
podSelector:
matchLabels:
app: prometheus
policyTypes:
- Egress
egress:
- to:
ports:
- port: 61678
但现在我想进一步限制这一点。而不是允许从所有带有标签的 Pod 到端口 61678 上的所有目的地的出口,app: prometheus
我只想允许流量到带有标签的 Podk8s-app: aws-node
所以我将政策更改为:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: monitoring-network-policy-prometheus-jbn
namespace: monitoring
spec:
podSelector:
matchLabels:
app: prometheus
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
k8s-app: aws-node
根据https://kubernetes.io/docs/concepts/services-networking/network-policies/一个看起来像这样的策略
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
- podSelector:
matchLabels:
role: client
...
被描述为 allows connections from Pods in the local Namespace with the label role=client, or from any Pod in any namespace with the label user=alice.
所以我认为这将匹配一个带有标签的 pod,该标签k8s-app: aws node
位于kube-system
任何端口的命名空间中。但是,当我尝试使用该标签连接到 pod 时,我会超时。
这是我要连接的 pod
kubectl get pods -n kube-system -l k8s-app=aws-node
NAME READY STATUS RESTARTS AGE
aws-node-ngmnd 1/1 Running 0 46h
我正在使用带有 Calio 网络插件的 AWS EKS。
我在这里想念什么?
解决方案
发生这种情况是因为您忽略了将 放置namespaceSelector
在清单中,并且默认情况下,当namespaceSelector
未预设时,系统将PodSelector
在策略自己的命名空间中选择匹配的 Pod。
看这里:
podSelector
这是一个标签选择器,用于选择 Pod。该字段遵循标准标签选择器语义;如果存在但为空,它会选择所有 pod。如果还设置了 NamespaceSelector,那么 NetworkPolicyPeer 整体会在 NamespaceSelector 选择的 Namespaces 中选择匹配 PodSelector 的 Pod。否则,它会在策略自己的 Namespace 中选择与 PodSelector 匹配的 Pod。
你能做些什么来解决它?您可以根据文档设置空的命名空间选择器:
namespaceSelector
使用集群范围标签选择命名空间。该字段遵循标准标签选择器语义;如果存在但为空,它会选择所有命名空间。如果 PodSelector 也被设置了,那么 NetworkPolicyPeer 整体会在 NamespaceSelector 选择的 Namespaces 中选择匹配 PodSelector 的 Pod。否则,它会选择 NamespaceSelector 选择的 Namespaces 中的所有 Pod。
我重现了这个问题,文档是正确的,但对实际上应该是空的地方有点误导。所以括号应该放在后面matchLabels
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: monitoring-network-policy-prometheus-jbn
namespace: monitoring
spec:
podSelector:
matchLabels:
app: prometheus
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
k8s-app: aws-node
namespaceSelector:
matchLabels: {}
回答您对印花布是否会引起一些问题的担忧。好吧,事实上它是,但它应该是。要使网络策略生效,您需要运行将强制执行它们的网络插件。
推荐阅读
- css - Ionic 5 ion-tab-bar 渐变背景
- spring-kafka - 如果生产者应用程序在发送到代理之前崩溃,生产者“buffer.memory”中的消息会发生什么?
- c++ - 如何在 C++ 中将浮点数转换为无符号整数?
- java - 如何使用 Jackson 的 ObjectMapper 从 JSON 字符串创建对象?
- apache-spark - Pyspark 中的表格显示来自 CSV 文件的标题
- mysql - 是否有可能在数据库触发器中使用多个 Before 或 After 语句
- python - 如何在 Django Rest Framework 中接收我不想存储的 json 字段?
- python - 如何将日期时间对象的格式更改为指定格式?
- c - sscanf: %* 不会忽略空字段
- python - 如何使用 sklearn 对 CSV 文件中的多列进行一次热编码?