Назад | Перейти на главную страницу

сетевая политика azure kubernetes, позволяющая разрешить некоторые внешние хосты только для модуля

Допустим, я создал кластер с таким манифестом, как:

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. Мы не блокируем выход, только вход. Вам просто нужно указать на свой сервер БД внутри вашего приложения, как обычно.

Вы всегда можете обратиться к документация и получить более подробную информацию по этому поводу.