Сетевая политика Kubernetes Ingress работает должным образом, исходящий трафик блокирует весь трафик

Я установил Calico на EKS из здесь.

У меня есть два пространства имен, foo и bar, оба помечены меткой «цель» и содержат по одному модулю приложения каждое.

Когда я импортирую следующую политику только для Ingress в пространство имен foo, она работает точно так, как ожидалось; другие тестовые модули не могут подключиться к foo-app, но bar-app может.

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: foo
  namespace: foo
spec:
  podSelector:
    matchLabels:
      app: foo-app
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - from:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

Однако, когда я импортирую политику, содержащую правила входа и выхода, она полностью отключает сеть для модуля. Я больше не могу пинговать IP-адрес модуля foo-app из bar-app.

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: foo
  namespace: foo
spec:
  podSelector:
    matchLabels:
      app: foo-app
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - from:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

После удаления и систематического повторного добавления частей политики именно добавление namespaceSelector записи в исходящих данных нарушает ее.

В кластере нет других сетевых политик.

Если нет прямо очевидной причины, почему это происходит; кроме обхода правил netfilter на рабочих узлах: есть ли эффективный способ отладить это?


person GDev    schedule 01.03.2020    source источник
comment
Ваш ямл неправильный. Почему вы открываете 0.0.0.0/0? Это то же самое, что не создавать NetworkPolicy. Я не знаю, почему он иногда блокируется, потому что этого не должно быть.   -  person suren    schedule 02.03.2020


Ответы (2)


Я не думаю, что вы написали Network Policy правильно.

Я думаю тебе стоит изменить

  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

to

  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          purpose: bar
  - to:
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

Это связано с тем, что вы можете блокировать DNS, который используется для преобразования имен служб в их IP-адреса. Вы можете прочитать действительно хорошее Введение к сетевым политикам Kubernetes для сотрудников службы безопасности.

Если это по-прежнему проблема, предоставьте подробную информацию о том, где работают модули, каковы метки и какие правила вы хотите реализовать.

Вы также можете проверить несколько хороших примеров для Ingress и Egress на GitHub - ahmetb / kubernetes-network- policy-recipes и Объявить сетевую политику .

person Crou    schedule 02.03.2020

Ваша последняя сетевая политика относится как к исходящему, так и к входящему. Я бы разделил Egress и Ingress на два разных файла yaml (если есть несколько разных политик Ingress / Egress, я бы также разделил их по разным файлам) и применил бы их один за другим. Так их легче читать. Кроме того, если вы используете правило запрета, я бы применил его первым, а затем применил другие правила.

person JGG    schedule 01.03.2020