У меня есть мультитенантный кластер, в котором мультитенантность достигается через пространства имен. У каждого арендатора есть собственное пространство имен. Модули одного арендатора не могут взаимодействовать с модулями другого арендатора. Однако некоторые модули в каждом арендаторе должны предоставлять услугу в Интернете с помощью 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"
Есть ли лучшее решение без указания kube-system
метки вручную?
Изменить: я попытался дополнительно добавить правило «ИЛИ», чтобы разрешить связь от модулей с меткой «app = nginx-ingress», но безуспешно:
- from
...
- podSelector:
matchLabels:
app: nginx-ingress # Allow pods that have the app=nginx-ingress label