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

#kubernetes #project-calico #kubernetes-networkpolicy #kubernetes-networking

#kubernetes #проект-calico #kubernetes-networkpolicy #kubernetes-сеть

Вопрос:

Контекст: я использую 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 он не может.)

Комментарии:

1. Вы пробовали разрешить выход для dns в пространстве имен kube-system? Смотрите Здесь пункт 5. Пожалуйста, дайте мне знать

Ответ №1:

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

   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, который, как оказалось, использовал включенную сеть хостов, следовательно, IP-адрес, назначенный модулем, оказался IP-адресом узла k8s (а не IP-адресом узла k8s).IP модуля, по-видимому, сетевые политики могут различать, когда IP-адрес присваивается модулю и узлу k8s?) следовательно, сетевая политика не фильтруется.