Предотвращение связи между именами в Kubernetes
Я новичок в сети Kubernetes.
Мы разделили кластер Kubernetes на набор пространств имен (например, namespace-a
, namespace-b
). В каждом пространстве имен есть набор стручков Kubernetes. Каждый пакет имеет сервис, который доступен на my-svc.namespace-x.svc.cluster.local
,
Теперь мы хотим предотвратить стручки пространства имен namespace-a
разговаривать с услугами или пакетами, которые являются частью namespace-b
и наоборот. Общение в пространстве имен должно быть неограниченным.
Это то, что я нашел в качестве примера в документации по политике сети: https://kubernetes.io/docs/concepts/services-networking/network-policies/
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Насколько я понимаю, это полностью предотвращает сетевое взаимодействие для всех модулей в пространстве имен.
- Как я могу разрешить весь сетевой трафик, но только в пределах определенного пространства имен?
- Нужен ли мне сетевой плагин, такой как Calico, Flannel или Weave? Какой из них выбрать?
1 ответ
Нужен ли мне сетевой плагин, такой как Calico, Flannel или Weave?
Независимо от того, что вам нужно сетевой плагин, но не все плагины поддерживают NetworkPolicy
API-объект. В соответствии с пошаговым руководством " Объявить сетевую политику" ниже приведен (возможно, не исчерпывающий) список плагинов, которые поддерживают NetworkPolicy
:
Без плагина, который поддерживает NetworkPolicy
Создание ресурса не будет иметь никакого эффекта.
Какой из них выбрать?
Что касается того, что вы должны выбрать, stackru не место для получения такого рода рекомендаций. Что я могу порекомендовать, так это прочитать обзорную / функциональную документацию по различным доступным опциям. Возможно, попробуйте один или два различных плагина в локальном кластере разработки, чтобы понять, насколько сложны или просты в установке, обслуживании и обновлении.
Как я могу разрешить весь сетевой трафик, но только в пределах определенного пространства имен?
Учитывая ваш пример настройки, я думаю, что следующее NetworkPolicy
ресурсы будут соответствовать вашим потребностям:
Для стручков в namespace-a
только вход namspace-a
стручки, отрицающие проникновение из любого другого источника. Выход неограничен:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: namespace-a
spec:
policyTypes:
- Ingress
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace-a
Для стручков в namespace-b
только вход namspace-b
стручки, отрицающие проникновение из любого другого источника. Выход неограничен:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: namespace-b
spec:
policyTypes:
- Ingress
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace-b
Обратите внимание, что это предполагает, что вы установили name: namespace-a
а также name: namespace-b
метки в ваших пространствах имен, похожие на это:
apiVersion: v1
kind: Namespace
metadata:
name: namespace-a
labels:
name: namespace-a
other: labelname
Я лишь указываю на это, чтобы не вводить вас в заблуждение в связи с тем, что метки, которые я показывал выше, совпадают с вашими гипотетическими именами пространства имен. Метки могут быть произвольными и потенциально включать несколько пространств имен - например, вы можете иметь namespace-a
а также namespace-c
оба с этикеткой под названием other: labelname
что позволит вам выбрать несколько пространств имен, используя один namespaceSelector
в вашем NetworkPolicy
ресурс.