问题描述
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
@H_502_5@但现在我想限制更多。我不想允许所有标签为
的 Podapp: prometheus
的 Pod 出口到端口 61678 上的所有目的地,我只想允许流量到带有标签k8s-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
@H_502_5@根据https://kubernetes.io/docs/concepts/services-networking/network-policies/的政策,看起来像这样
... ingress: - from: - namespaceSelector: matchLabels: user: alice - podSelector: matchLabels: role: client ...
@H_502_5@被描述为
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.
所以我认为这会匹配一个标签为
k8s-app: aws node
的 pod,它位于任何端口的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
@H_502_5@我正在使用带有 Calio 网络插件的 AWS EKS。
我在这里遗漏了什么?
解决方法
发生这种情况是因为您省略了在清单中放置
namespaceSelector
,并且默认情况下,当namespaceSelector
未预设时,系统将在策略自己的命名空间中选择与PodSelector
匹配的 Pod。看这里:
podSelector
这是一个选择 Pod 的标签选择器。该字段遵循标准标签选择器语义;如果存在但为空,则选择 所有豆荚。如果 NamespaceSelector 也被设置,那么 NetworkPolicyPeer 作为一个整体在 Namespaces 中选择与 PodSelector 匹配的 Pod 由 NamespaceSelector 选择。 否则它会选择匹配的 Pods 策略自己的命名空间中的 PodSelector。你能做些什么来解决它?您可以根据文档设置空命名空间选择器:
命名空间选择器
使用集群范围的标签选择命名空间。该字段遵循标准标签选择器语义; 如果存在但为空,则选择 所有命名空间。如果还设置了 PodSelector,则 NetworkPolicyPeer 整体选择中匹配 PodSelector 的 Pod NamespaceSelector 选择的命名空间。否则它选择所有 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: {}
回答您对 calico 是否可能导致某些问题的担忧。嗯,事实上是,但它是假设。要使网络策略生效,您需要运行将强制执行它们的网络插件。