Сетевая политика для запрета трафика c из определенного пространства имен - PullRequest
0 голосов
/ 09 января 2020

Итак, скажем, у меня есть 5 пространств имен - prod, preprod, uat, dev и test. Каждое пространство имен имеет свою метку - ns = prod, ns = preprod, ns = uat, ns = dev и ns = test.

Вопрос: Итак, я хочу создать сетевую политику, где я не хотите отправить traffi c (выход) из ns = test в определенное пространство имен, метка которого ns = prod. Но ns = test должен иметь возможность сделать выход ко всему другому пространству имен.

Документация: https://kubernetes.io/docs/concepts/services-networking/network-policies/ https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy/

Я пытался создать файл манифеста из вышеуказанной документации, но не повезло. Я могу сделать это, используя podSelector (метки пакетов, но не используя только пространства имен в целом).

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Было бы проще, если бы вы могли добавить фрагмент кода. Однако выяснить, что происходит не так сложно.

Я думаю, что-то подобное может быть проблемой с вашей сетевой политикой. Возможно, для ваших модулей требуется подключение к всемирной сети, поэтому вы не можете запретить передачу сообщений с теста на продвижение по правилу egress, так как вы можете добавить 0.0.0.0/0, чтобы позволить вашим модулям в любом окружении общаться с внешним миром для загрузки внешних библиотек или чего-либо еще материал, связанный с вашим приложением.

В связи с этим немного сложнее добавить правило egress для остановки связи в любой среде. Но, наоборот, вы можете добавить правило igress в prod ns, чтобы не допускать сообщения от test или dev. Нечто подобное может сработать, но, опять же, мы можем изменить его в зависимости от потребностей.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: prod-network-policy
  namespace: prod
spec:
  podSelector:
    matchLabels:
      ns: prod
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          ns: prod
          ns: dev
          ns: uat
    - podSelector:
        matchLabels:
          ns: prod
          ns: dev
          ns: uat
    - ipBlock:
        cidr: 10.0.1.101/32 #Assuming allow incoming request from ingress controller
  egress:
  - to: []

Есть несколько способов добиться этого. Но я также иногда ссылаюсь на эти примеры рецептов на Github .

Редактирование на основе комментария Добавление других пространств имен к правилу входа, чтобы разрешить traffi c из других пространств имен, кроме test.

Надеюсь, это полезно.

1 голос
/ 10 января 2020

Вы можете сделать это:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy-example
  namespace: test
spec:
  podSelector:
    matchLabels:
      ns: test
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          ns: preprod
          ns: uat
          ns: dev
          ns: test
    ports:
    - protocol: TCP
      port: 80

..., что предотвратит любой модуль в пространстве имен test и с метками ns=test, чтобы общаться с кем-либо, кроме модулей в пространствах имен, перечисленных в matchlabels.

Вы также можете сделать наоборот; создать NetworkPolicy в пространстве имен prod и отключить входные трафики c пакетов с меткой ns=prod. Тот же результат.

Примечание: вам нужен контроллер NetworkPolicy, которого нет в двоичных файлах kubernetes.

...