как запретить выход для всех пространств имен и разрешить вход из некоторых пространств имен в кубернетах с помощью сетевых политик

Контекст: я использую EKS с плагином calico для сетевых политик и группы управляемых узлов.

У меня есть пространство имен, называемое simon-test, в котором я хочу запретить любой выход из пространства имен другим (поэтому модули в simon-test не смогут видеть другие модули в других пространствах имен). Я попытался сделать это, используя следующую сетевую политику (которая, похоже, работает должным образом):

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: default-deny-all-egress
  namespace: simon-test
spec:
  policyTypes:
  - Egress
  podSelector: {}
  egress: []

но это также заблокировало всю внутреннюю сеть в пространстве имен. Поэтому, чтобы исправить это, я создал другую сетевую политику, которая должна разрешать весь трафик в пространстве имен:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-internal
  namespace: simon-test
spec:
  podSelector:
    matchLabels: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: simon-test

Но это не решает проблему, поскольку в пространстве имен по-прежнему нет сети. Мне любопытно, почему я все еще могу получить доступ к simon-test из другого модуля в другом пространстве имен (я запускаю nc -nlvp 9999 в модуле в simon-test и nc -z ip-of-pod-in-simon-test-ns 9999 из модуля из другого пространства имен, и он может достичь его, но при пинге модуля из в рамках simon-test это невозможно.)


person Simon Ernesto Cardenas Zarate    schedule 05.10.2020    source источник
comment
Вы пробовали разрешить выход для DNS в пространстве имен kube-system? См. здесь, пункт 5. Сообщите мне   -  person Mr.KoopaKiller    schedule 06.10.2020


Ответы (1)


Я не совсем уверен во внутреннем устройстве ситцевых / сетевых политик, но я смог решить эту проблему следующим образом:

  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: simon-test
  1. Вышеупомянутое правило входа не работало, потому что в пространстве имен не было метки name = simon-test. Я думал, что по умолчанию все пространства имен имеют метку с именем name, на которую вы можете ссылаться отсюда, но, похоже, это не так. Чтобы решить эту проблему, мне пришлось добавить метку: kubectl label ns simontest name=simon-test.

  2. Что касается второй проблемы: I am curious why I can still reach "simon-test" from another pod in another namespace though (when ingress was blocked) это произошло из-за того, что я пытался связаться с simon-test ns из модуля в kube-system, который, как оказалось, использовал hostNetwork enabled, следовательно, IP-адрес, назначенный модулем, оказался IP-адресом узла k8s (а не IP-адреса модуля, очевидно, сетевая политика может различать, когда IP-адрес назначается модулю и узлу k8s?), следовательно, не фильтруется сетевой политикой.

person Simon Ernesto Cardenas Zarate    schedule 07.10.2020