Неявный запрет в глобальной сетевой политике calico?

#nginx #kubernetes #calico

#nginx #kubernetes #calico

Вопрос:

Я озадачен таким поведением глобальных сетевых политик. Возьмите следующее.

 apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-dns-for-all-policy
spec:
  namespaceSelector: has(projectcalico.org/name) amp;amp; projectcalico.org/name not in {"kube-system", "calico-system"}
  order: 0
  egress:
  # allow all namespaces to communicate to DNS pods
  - action: Allow
    protocol: UDP
    destination:
      ports:
      - 53
  ingress:
  - action: Allow
 

Когда я выполняю wget из одного модуля в другой в «тестовом» пространстве имен, он, по-видимому, может разрешить dns, но не возвращает пакет:

 Resolving nginx-test (nginx-test)... 10.233.8.253
Connecting to nginx-test (nginx-test)|10.233.8.253|:80... failed: Connection timed out.
 

В кластере нет другой политики, особенно политики запрета по умолчанию. Я также тестировал без namespaceSelector. Только когда я добавляю второе Allow правило, соответствующее *, или когда я удаляю всю политику, я получаю успешный возврат.

Почему это так? Я бы ожидал, что эта политика не влияет на связь, поскольку нет правила запрета.

Ответ №1:

Хорошо получается, если есть хотя бы одно правило входа / выхода, совпадающее с ресурсом, calico автоматически добавляет правило запрета по умолчанию для входа / выхода.

Если к модулю не применяются сетевые политики, то весь трафик в / из этого модуля разрешен. Если одна или несколько сетевых политик применяются к pod, содержащему правила входа, то разрешается только входной трафик, специально разрешенный этими политиками. Если одна или несколько сетевых политик применяются к pod, содержащему правила выхода, то разрешается только выходной трафик, специально разрешенный этими политиками.

https://docs.projectcalico.org/security/calico-network-policy