#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
-
Приведенное выше правило входа не работало, поскольку в пространстве имен не было метки «name = simon-test»
. Я думал, что по умолчанию все пространства имен имеют метку с именем «name», на которую
вы можете ссылаться отсюда, но, похоже, это не так. Чтобы
решить эту проблему, мне пришлось добавить метку:
kubectl label ns simontest name=simon-test
. -
Что касается второй проблемы:
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?) следовательно, сетевая политика не фильтруется.