Предотвращение связи между именами в 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 ресурс.

Другие вопросы по тегам