Документация находится в разработке, может содержать неполную информацию.

Основные положения

Для управления входящим и исходящим трафиком виртуальных машин на уровне 3 или 4 модели OSI используются стандартные сетевые политики Kubernetes. Более подробно об этом можно прочитать в официальной документации Network Policies.

Есть два основных типа управления трафиком, входящий и исходящий:

  • Ingress – входящий трафик;
  • Egress – исходящий трафик.

Для управления внутрикластерным трафиком рекомендуется использовать podSelector и namespaceSelector, а для сетевого взаимодействия за пределами кластера – ipBlock. Правила сетевых политик применяются одновременно, по принципу их складывания, для всех виртуальных машин, которые соответствуют указанным меткам.

Дальнейшие примеры будут показаны на примере проекта test-project с двумя виртуальными машинами в пространстве имён test-project.

По умолчанию входящий и исходящий трафик не ограничены:

d8 k get vm -n test-project

Пример вывода:

NAME   PHASE     NODE           IPADDRESS     AGE
vm-a   Running   virtlab-2      10.66.20.70   5m
vm-b   Running   virtlab-1      10.66.20.71   5m

Виртуальные машины имеют соответствующие им метки.

d8 k get vm -n test-project -o yaml | less

Пример вывода:

- apiVersion: virtualization.deckhouse.io/v1alpha2
  kind: VirtualMachine
  metadata:
    labels:
      vm: a
    name: vm-a
    namespace: test-project
- apiVersion: virtualization.deckhouse.io/v1alpha2
  kind: VirtualMachine
  metadata:
    labels:
      vm: b
    name: vm-b
    namespace: test-project

Изоляция всего входящего трафика виртуальной машины

Сетевая политика, ограничивающая весь входящий трафик для виртуальных машин с меткой vm-a, в пространстве имён test-project:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: vm-a-deny-ingress
  namespace: test-project
spec:
  podSelector:
    matchLabels:
      vm: a
  policyTypes:
    - Ingress

Тип политики (policy type) Ingress означает, что будут применены правила для входящего трафика. Так как никаких Ingress правил в спецификации не указано, то будет ограничен весь входящий трафик.

По такому же принципу можно ограничить и исходящий трафик, добавив Egress в блок spec.policyTypes.

policyTypes:
  - Egress
  - Ingress

Разрешение входящего трафика между виртуальными машинами

Сетевая политика, разрешающая входящий трафик от виртуальных машин с меткой vm-b, до виртуальных машин с меткой vm-a:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-from-vm-b-to-vm-a
  namespace: test-project
spec:
  podSelector:
    matchLabels:
      vm: a
  ingress:
    - from:
      - podSelector:
          matchLabels:
            vm: b
  policyTypes:
    - Ingress

С помощью spec.podSelector для всех виртуальных машин с меткой vm: a применяется сетевая политика с типом Ingress. В спецификации spec.ingress указано правило, которое разрешает входящий трафик from из виртуальных машин с меткой vm: b.

Разрешение исходящего трафика виртуальной машины за пределы кластера

Сетевая политика, разрешающая исходящий трафик от виртуальных машин с меткой vm-a до внешнего адреса 8.8.8.8:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-egress-from-vm-a-to-8-8-8-8
  namespace: test-project
spec:
  podSelector:
    matchLabels:
      vm: a
  egress:
    - to:
      - ipBlock:
          cidr: 8.8.8.8/32
        ports:
          - protocol: TCP
            port: 53
  policyTypes:
    - Egress

Тип политики (policy type) указывает на то, что будут применены правила исходящего трафика в спецификации spec.egress. Также указаны протокол TCP и порт 53, на который разрешён трафик.

Порты могут быть указаны в виде диапазона с помощью дополнительного поля endPort в блоке ports.

ports:
  - protocol: TCP
    port: 32000
    endPort: 32768

Разрешение входящего трафика между пространствами имён

Сетевая политика разрешает входящий трафик до виртуальных машин с меткой vm: a из пространства имён another-project, которое имеет соответствующую метку kubernetes.io/metadata.name: another-project.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-from-namespace-another-project-to-vm-a
  namespace: test-project
spec:
  podSelector:
    matchLabels:
      vm: a
  ingress:
    - from:
      - namespaceSelector:
          matchLabels:
            kubernetes.io/metadata.name: another-project
  policyTypes:
    - Ingress

Полезные ссылки

С полным описанием спецификации сетевых политик можно ознакомиться в документации: