gpt4 book ai didi

kubernetes - 使用 NetworkPolicy 将 "kube-system"命名空间列入白名单

转载 作者:行者123 更新时间:2023-12-03 17:40:40 27 4
gpt4 key购买 nike

我有一个 Multi-Tenancy 集群,其中通过命名空间实现 Multi-Tenancy 。每个租户都有自己的命名空间。来自租户的 Pod 无法与其他租户的 Pod 通信。但是,每个租户中的某些 Pod 必须使用 Ingress 向 Internet 公开服务。

这是我走了多远(我正在使用 Calico):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant1-isolate-namespace
namespace: tenant1
spec:
policyTypes:
- Ingress
podSelector: {} # Select all pods in this namespace
ingress:
- from:
- namespaceSelector:
matchLabels:
name: tenant1 # white list current namespace

为每个命名空间( tenant1tenant2 、 ... )部署,这限制了其命名空间内 pod 之间的通信。但是,这会阻止 pod 来自 kube-system命名空间与此命名空间中的 Pod 对话。

然而, kube-system命名空间默认没有任何标签,所以我不能专门将这个命名空间列入白名单。

我通过手动给它一个标签找到了解决这个问题的(肮脏的)解决方法:
kubectl label namespace/kube-system permission=talk-to-all

并将白名单规则添加到网络策略中:
...
- from:
- namespaceSelector:
matchLabels:
permission: talk-to-all # allow namespaces that have the "talk-to-all privilege"

有没有更好的解决方案,不用手动给 kube-system一个标签?

编辑:我尝试另外添加一个“OR”规则,以专门允许来自标签为“app=nginx-ingress”的 pod 进行通信,但没有运气:
  - from
...
- podSelector:
matchLabels:
app: nginx-ingress # Allow pods that have the app=nginx-ingress label

最佳答案

apiVersion: networking.k8s.io/v1

namespaceSelector 旨在仅通过标签匹配命名空间。无法按名称选择命名空间。

podSelector 只能选择与 NetworkPolicy 对象位于同一命名空间中的 pod。对于位于不同命名空间中的对象,只能选择整个命名空间。

以下是 Kubernetes 网络策略实现的示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978

关注此 link阅读对网络策略的整个概念的很好的解释,或者这个 link观看讲座。

apiVersion: projectcalico.org/v3

Calico API 为您提供了更多编写 NetworkPolicy 规则的选项,因此,在某些时候,您可以以更少的努力和突破性的方式实现您的目标。

例如,使用网络策略的 Calico 实现,您可以:
  • 为规则设置操作(允许、拒绝、记录、通过),
  • 使用负匹配(protocol、notProtocol、selector、notSelector),
  • 应用更复杂的标签选择器(has(k), k not in { ‘v1’, ‘v2’ }),
  • 将选择器与运算符 &&、
  • 结合使用
  • 使用端口范围(端口:[8080, "1234:5678", "named-port"]),
  • 匹配其他命名空间中的 pod。

  • 但是,您仍然只能通过标签匹配 namespace 。

    考虑阅读印花布 documentation详情。

    以下是 Calico 网络策略实现的示例:
    apiVersion: projectcalico.org/v3
    kind: NetworkPolicy
    metadata:
    name: allow-tcp-6379
    namespace: production
    spec:
    selector: role == 'database'
    types:
    - Ingress
    - Egress
    ingress:
    - action: Allow
    protocol: TCP
    source:
    selector: role == 'frontend'
    destination:
    ports:
    - 6379
    egress:
    - action: Allow

    关于kubernetes - 使用 NetworkPolicy 将 "kube-system"命名空间列入白名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807579/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com