У меня есть мультитенантный кластер, где мультитенантность достигается через пространства имен.Каждый арендатор имеет свое собственное пространство имен.Стручки от арендатора не могут общаться с другими арендаторами.Тем не менее, некоторые модули в каждом арендаторе должны предоставлять услугу Интернету, используя Ingress.
Это то, как далеко я ушел (я использую 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
Развернуто длякаждое пространство имен (tenant1
, tenant2
, ...), это ограничивает связь между модулями в их пространстве имен.Однако это препятствует тому, чтобы модули из пространства имен kube-system
могли общаться с модулями в этом пространстве имен.
Однако пространство имен 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"
Isесть лучшее решение, без указания вручную kube-system
метки?
Редактировать: Я попытался дополнительно добавить правило «ИЛИ», чтобы специально разрешить связь с модулями с приложением «метка»= nginx-ingress ", но без везения:
- from
...
- podSelector:
matchLabels:
app: nginx-ingress # Allow pods that have the app=nginx-ingress label