Предотвращение взаимодействия между пространствами имен в 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/#the-networkpolicy-resource

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Насколько я понимаю, это полностью предотвращает сетевое взаимодействие для всех модулей в пространстве имен.

  • Как разрешить весь сетевой трафик, но только в определенном пространстве имен?
  • Нужен ли мне сетевой плагин, например Calico, Flannel или Weave? Какой выбрать?

person mitchkman    schedule 20.02.2018    source источник
comment
Здесь вы можете найти множество примеров сетевых политик: github.com/ahmetb/kubernetes-network- политики-рецепты   -  person dSebastien    schedule 18.10.2019


Ответы (1)


Нужен ли мне сетевой плагин, например Calico, Flannel или Weave?

Независимо от того, какой сетевой плагин вам нужен, не все плагины поддерживают объект NetworkPolicy API. В соответствии с пошаговым руководством по объявлению сетевой политики, следующее (вероятно, неполный) список плагинов, которые действительно поддерживают NetworkPolicy:

Без подключаемого модуля, поддерживающего NetworkPolicy, создание ресурса не будет иметь никакого эффекта.

Какой мне выбрать?

Что касается того, какой из них вы должны выбрать, stackoverflow - не место для того, чтобы просить такого совета. Что я могу порекомендовать, так это прочитать обзор / документацию по функциям для различных доступных опций. Возможно, попробуйте один или два разных плагина в локальном кластере разработки, чтобы понять, насколько сложно или легко их установить, поддерживать и обновлять.

Как разрешить весь сетевой трафик, но только в пределах определенного пространства имен?

Учитывая ваш пример настройки, я думаю, что следующие 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 ресурсе.

person Wayne Warren    schedule 21.02.2018