Допишите NetworkPolicy, чтобы Pod api принимали трафик только от role=frontend.
В namespace shop Pod api (метка app=api) принимают трафик от всех, потому что их не выбирает ни одна политика. Ограничьте ingress так, чтобы к ним могли обращаться ТОЛЬКО Pod с меткой role=frontend и только по TCP-порту 8080. Допишите манифест.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-allow-frontend
namespace: shop
spec:
podSelector:
matchLabels:
app: api
# TODO: пустить ingress только от role=frontend по TCP 8080
Добавьте недостающие policyTypes и правило ingress.
Задайте policyTypes в Ingress и одно правило ingress, чьё from — podSelector по role=frontend, с ограничением на TCP-порт 8080. Выбор Pod api переводит их в deny-by-default по ingress, поэтому проходит только это правило. Работает лишь если CNI применяет NetworkPolicy.
- ✗Ограничивать отправителя через egress вместо выбора Pod api
- ✗Забыть блок ports, из-за чего открыты все порты
- ✗Считать, что политика работает без CNI (Container Network Interface), применяющего NetworkPolicy
- →Как дополнительно пустить ingress из namespace мониторинга по метке?
- →Что случится с текущими соединениями в момент применения политики?
Решение
Pod api сейчас открыты всем, потому что их не выбирает ни одна NetworkPolicy — namespace по умолчанию allow-all. Как только политика выбирает эти Pod своим podSelector, они переходят в deny-by-default по выбранным направлениям, и проходит лишь то, что явно разрешено.
Нужно: policyTypes со значением Ingress; одно правило ingress, чьё from — это podSelector по role=frontend; и блок ports с TCP 8080. Всё прочее (другие источники, другие порты) отбрасывается.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-allow-frontend
namespace: shop
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 8080
Важно: NetworkPolicy применяет CNI-плагин (Container Network Interface). На CNI без её поддержки (например, чистый flannel) манифест примут, но правило не будет действовать.