Допустим, я создал кластер с таким манифестом, как:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
use_db: "true"
backend: "true"
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
containers:
- name: my-app
image: <...>
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
ports:
- containerPort: 80
- containerPort: <...>
---
apiVersion: v1
kind: Service
metadata:
name: my-app
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: my-app
Я активировал сетевой плагин и сетевые политики. Работает хорошо. Но я хочу настроить некоторые сетевые политики. Я нашел много примеров того, как управлять трафиком между модулями, как разрешить внешний трафик и трафик от всех отдельных сидов. Но не понимаю, как быть в моем случае. Это то, что я хочу:
Кто-нибудь может привести пример YAML-файла сетевой политики для этого случая?
Если вы укажете spec.podSelector
пустое поле, набор модулей, сетевая политика соответствует всем модулям в пространстве имен, по умолчанию блокируя весь трафик между модулями. В этом случае вы должны явно создать сетевые политики, заносящие в белый список всю связь между модулями.
Вы можете включить такую политику, применив следующий манифест в своем кластере Kubernetes (Источник):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
Чтобы разрешить внешний трафик для модулей с меткой бэкэнд из какой-то внешней подсети на порт 80 (но не из внутренних модулей) ваш NetworkPolicy
может выглядеть так:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.4.0.0/16
ports:
- protocol: TCP
port: 80
Краткое объяснение того, что здесь происходит, заключается в том, что мы разрешаем все соединения, идущие к модулям с бэкэнд метка, разрешающая все соединения, исходящие от 0.0.0.0/0
(вы можете перейти на другой диапазон) и блокировать соединения с 10.4.0.0/16
(это моя внутренняя сеть и вам нужно сменить на то, что у вас есть). Мы также разрешаем подключения к порту 80
только.
Чтобы разрешить обмен внешним трафиком с некоторой базой данных (я знаю, что это имя DNS и порт) для модулей с меткой use_db вам просто нужно следовать той же логике, что и в предыдущем примере.
Таким образом, ваши поды могут связываться с любым сервером за пределами вашего кластера Kubernetes. Мы не блокируем выход, только вход. Вам просто нужно указать на свой сервер БД внутри вашего приложения, как обычно.
Вы всегда можете обратиться к документация и получить более подробную информацию по этому поводу.