如何使用 NetworkPolicy 隔离命名空间中的 pod,而无需禁用到 Kubernetes Pod 的外部流量



我正在尝试将命名空间中的 pod 与其他命名空间隔离开来。我试图创建一个网络策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-from-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}

此网络策略成功地将我的命名空间中的 Pod 与另一个命名空间隔离开来。但是,一旦应用此策略,就会禁用到这些 Pod 的所有外部流量。有没有办法只阻止来自其他命名空间的流量,并允许所有外部流量到pod。

使用 kubernetes 网络策略 我不相信在允许所有外部流量的同时拒绝 pod 之间的通信。 这是因为 kubernetes networkPolicy 资源没有显式拒绝规则的概念。 我会调整您的方法或考虑另一个具有拒绝规则的网络策略(例如 Calico(。

溶液:

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: deny-other-namespaces
namespace: prod
spec:
selector: all()
types:
- Ingress
- Egress
ingress:
- action: Deny
protocol: TCP
source:
namespaceSelector: name == 'dev'
- action: Allow
egress:
- action: Allow

您应用的网络策略阻止来自每个来源的流量。

您可以在定义中添加授权的 CIDR 块:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-policy
namespace: default
spec:
podSelector:
matchLabels:
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16

您可以确保为NetworkPolicy资源设置命名空间,并将入口/出口限制为仅命名空间。

apiVersion: extensions/v1beta1
kind: NetworkPolicy
metadata:
name: onlywithinnamespace
namespace: mynamespace
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
role: mynamespace
- podSelector: {}
egress:
- to:
- namespaceSelector:
matchLabels:
role: mynamespace
- podSelector: {}
podSelector:
matchLabels:
policyTypes:
- Ingress
- Egress

确保命名空间具有匹配的正确标签:

apiVersion: v1
kind: Namespace
metadata:
labels:
role: mynamespace
name: mynamespace

您可以允许所有流量,但阻止来自内部网络的流量。

下面的网络策略允许访问所有内部网络(192.168.0.0/16 和 172.23.40.0/24(

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-external
namespace: dmz
spec:
podSelector: {}
policyTypes:
- Egress
- Ingress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 192.168.0.0/16
- 172.23.42.0/24
- namespaceSelector:
matchLabels:
name: dmz

就我而言,我遇到了同样的问题,并且此链接中的响应 https://stackoverflow.com/a/56860217/7324872 很棒

请创建 2 个网络策略:

拒绝来自其他命名空间

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-from-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}

网络允许外部

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
app: <label>
ingress:
- {}

网络策略不排除。

最新更新