kubernetes 中的 NetworkPolicy 与 podSelector 不匹配

Joh*_*han 3 kubernetes kubernetes-networkpolicy amazon-eks

我有一个简单的工作网络策略,如下所示

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
Run Code Online (Sandbox Code Playgroud)

但现在我想再限制一下。我不想允许从带有标签的所有 pod 到端口 61678 上的所有目的地的出口,app: prometheus而是只允许流向带有标签的 pod 的流量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
Run Code Online (Sandbox Code Playgroud)

根据https://kubernetes.io/docs/concepts/services-networking/network-policies/的政策,看起来像这样

  ...
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: alice
    - podSelector:
        matchLabels:
          role: client
  ...
Run Code Online (Sandbox Code Playgroud)

被描述为 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位于kube-system任何端口上的命名空间中带有标签的 Pod 相匹配。但是当我尝试连接到带有该标签的 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
Run Code Online (Sandbox Code Playgroud)

我正在将 AWS EKS 与 Calio 网络插件结合使用。

我在这里缺少什么?

aci*_*uji 5

发生这种情况是因为您省略了将 放入namespaceSelector清单中,默认情况下,如果未预设,系统将选择与策略自己的命名空间namespaceSelector匹配的 Pod 。PodSelector

看这里:

podSelector
这是一个选择 Pod 的标签选择器。该字段遵循标准标签选择器语义;如果存在但为空,则它会选择所有 Pod。如果还设置了NamespaceSelector,那么NetworkPolicyPeer会整体选择NamespaceSelector选择的Namespace中与PodSelector匹配的Pod。否则,它会在策略自己的 Namespace 中选择与 PodSelector 匹配的 Pod

你能做什么来解决它?您可以根据文档设置空名称空间选择器:

namespaceSelector
使用集群范围的标签选择命名空间。该字段遵循标准标签选择器语义;如果存在但为空,则它选择所有名称空间。如果还设置了PodSelector,那么NetworkPolicyPeer会整体选择NamespaceSelector选择的Namespaces中与PodSelector匹配的Pod。否则,它会选择 NamespaceSelector 选择的命名空间中的所有 Pod。

参考网络策略Peer

我重现了这个问题,文档是正确的,但对于实际上应该是空的地方有点误导。所以括号应该放在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: {}
Run Code Online (Sandbox Code Playgroud)

回答您对 calico 是否可能引起某些问题的担忧。事实上确实如此,但应该如此。为了使网络策略生效,您需要运行网络插件来强制执行它们。