带有命名空间的 Kubernetes Egress 调用限制

问题描述

我有应用程序在 K3s 中运行,并且只想实现基于命名空间的网络策略。

让我们假设目前我有三个命名空间 A、B 和 C。我想允许 namespace-A 和剩余的 namespace[B & C] 出口调用的出口(从 pod 到互联网的外部调用)应该被阻止/拒绝。

这在 Kubernetes 网络策略(而不是 calico 或 cilium)中是否可行?

解决方法

您可以定义 the documentation 中所述的 deny all egress 政策:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
  namespce: your-namespace
spec:
  podSelector: {}
  policyTypes:
  - Egress

此策略将应用于命名空间中的所有 Pod,因为 Pod 选择器为空,这意味着(引用 documentation):

空的 podSelector 选择命名空间中的所有 pod。

该策略将阻止所有出口流量,因为它具有 Egress 作为策略类型,但它没有任何 egress 部分。

如果您想允许集群内出口,您可能需要在策略中添加一个 egress 部分,例如:

  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          networking/namespace: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

这允许所有流量从您创建网络策略的命名空间到端口 53(TCP 和 UDP)上命名空间 k8s-app: kube-dns 中标有 kube-system 的 Pod。