Политика сети Kubernetes Ingress работает, как и ожидалось, выход блокирует весь трафик - PullRequest
0 голосов
/ 01 марта 2020

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

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

Когда я импортирую следующую входную политику только в пространство имен 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 на рабочих узлах: есть ли эффективный способ отладки этого?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Я не думаю, что вы 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

на

  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 и Объявить сетевую политику .

0 голосов
/ 01 марта 2020

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

...