Защита трафика между модулями pod с помощью политик сети в AKS

При выполнении современных приложений на базе микрослужб в Kubernetes часто требуется управлять тем, какие компоненты могут взаимодействовать друг с другом. Применяйте Принцип наименьших привилегий при передаче трафика между модулями pod в кластере Azure Kubernetes Service (AKS). Предположим, что вы хотите заблокировать трафик непосредственно в внутренние приложения. Функция политики сети в Kubernetes позволяет определять правила для входящего трафика и исходящего трафика между модулями pod в кластере.

В этой статье показано, как установить подсистему политик сети и создать политики сети Kubernetes для управления потоком трафика между группами pod в AKS. Политики сети можно использовать для узлов и модулей pod на основе Linux в AKS.

Общие сведения о политике сети

По умолчанию все группы pod в кластере AKS могут отправлять и получать трафик без ограничений. Для повышения безопасности вы можете определить правила, управляющие потоком трафика. Например, серверные приложения часто предоставляются только обязательным интерфейсным службам. Или компоненты базы данных доступны только для уровней приложений, которые к ним подключаются.

Сетевая политика — это спецификация Kubernetes, которая определяет политики доступа для обмена данными между модулями pod. При использовании политик сети вы определяете упорядоченный набор правил для отправки и получения трафика. Правила применяются к коллекции модулей pod, которые соответствуют одному или нескольким селекторам меток.

Правила политики сети определяются как манифесты YAML. Политики сети могут быть включены в более глобальный манифест, который помимо политики сети создает развертывание или службу.

Параметры политики сети в AKS

Azure предоставляет три подсистемы политики сети для применения политик сети:

  • Cilium для кластеров AKS, использующих Azure CNI Powered cilium.
  • Диспетчер политик сети Azure.
  • Calico, решение для безопасности сети с открытым исходным кодом и сетью, основанное Tigera.

Cilium — это наш рекомендуемый модуль политики сети. Cilium применяет политику сети к трафику с помощью фильтра пакетов Linux Berkeley (BPF), что, как правило, более эффективно, чем IPTables. Дополнительные сведения см. в документации по CNI Azure cni с помощью Cilium.
Для применения указанных политик диспетчер сетевых политик Azure для Linux использует IPTables Linux. Диспетчер сетевых политик Azure для Windows использует ACLPolicies службы узла (HNS). Политики преобразовываются в наборы разрешенных и запрещенных пар IP-адресов. Затем эти пары запрограммируются как IPTable или HNS ACLPolicy фильтруют правила.

Различия между подсистемами политики сети: Cilium, Azure NPM и Calico

Возможность Диспетчер политик сети Azure Calico Ресница
Поддерживаемые платформы Linux, Windows Server 2022 (предварительная версия). Linux, Windows Server 2019 и 2022. Linux.
Поддерживаемые сетевые подключения Сетевой интерфейс контейнера Azure (CNI). Azure CNI (Linux, Windows Server 2019 и 2022) и kubenet (Linux). Azure CNI.
Соответствие спецификации Kubernetes Поддерживаются все типы политик. Поддерживаются все типы политик. Поддерживаются все типы политик.
Другие функции Нет. Расширенная модель политики, состоящая из политики глобальной сети, набора глобальных сетей и конечной точки узла. Дополнительные сведения об использовании интерфейса командной строки calicoctl для управления этими расширенными функциями см. в справочных материалах по calicoctl. Нет.
Поддержка Поддерживается командой поддержки и инженерии Azure. Поддерживается командой поддержки и инженерии Azure. Поддерживается командой поддержки и инженерии Azure.

Ограничения диспетчера политик сети Azure

Примечание.

С помощью Azure NPM для Linux мы не разрешаем масштабирование за пределами 250 узлов и 20 000 модулей pod. Если вы пытаетесь увеличить масштаб за пределами этих ограничений, может возникнуть ошибка "Вне памяти" (OOM). Для повышения масштабируемости и поддержки IPv6, а также при возникновении следующих ограничений рекомендуется использовать или обновить до Azure CNI с помощью Cilium для использования Cilium в качестве подсистемы политики сети.

Azure NPM не поддерживает IPv6. В противном случае она полностью поддерживает спецификации политики сети в Linux.

В Windows NPM не поддерживает следующие функции спецификаций политики сети:

  • Именованные порты.
  • Протокол передачи потока (SCTP).
  • Отрицательные метки или селекторы пространства имен. Например, все метки, кроме debug=true.
  • except Блоки маршрутизации без класса между доменами (CIDR) (CIDR с исключениями).

Примечание.

Диспетчер сетевых политик Azure регистрирует ошибку, если создается неподдерживаемая сетевая политика.

Изменение и удаление политик сети

В некоторых редких случаях возникает вероятность попадания в состояние гонки, что может привести к временному, неожиданному подключению для новых подключений к модулям pod и из модулей pod на всех затронутых узлах при редактировании или удалении политики сети "достаточно большого размера". Попадание в это состояние гонки никогда не влияет на активные соединения.

Если это условие гонки возникает для узла, модуль pod Azure NPM на этом узле вводит состояние, в котором оно не может обновлять правила безопасности, что может привести к неожиданному подключению для новых подключений к модулям pod или из модулей pod на затронутом узле. Чтобы устранить проблему, модуль pod Azure NPM автоматически перезапускается примерно через 15 секунд после ввода этого состояния. Хотя NPM Azure перезагружается на затронутом узле, он удаляет все правила безопасности, а затем повторно применяет правила безопасности для всех политик сети. Хотя все правила безопасности применяются повторно, есть вероятность временного, неожиданного подключения для новых подключений к модулям pod или из модулей pod на затронутом узле.

Чтобы ограничить вероятность попадания в это состояние гонки, можно уменьшить размер политики сети. Эта проблема, скорее всего, произойдет для политики сети с несколькими ipBlock разделами. Сетевая политика с четырьмя или менее ipBlock разделами, скорее всего, достигнет этой проблемы.

Подготовка к работе

Необходимо установить и настроить Azure CLI версии 2.0.61 или более поздней. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Создание кластера AKS и включение политики сети

Чтобы увидеть политики сети в действии, создайте кластер AKS, поддерживающий сетевую политику, а затем работаете над добавлением политик.

Чтобы использовать диспетчер политик сети Azure, необходимо использовать подключаемый модуль Azure CNI. Calico можно использовать с подключаемым модулем Azure CNI или подключаемым модулем Kubenet CNI.

В следующем примере скрипта создается кластер AKS с назначаемым системой удостоверением и включает политику сети с помощью диспетчера сетевых политик Azure.

Примечание.

Calico можно использовать либо с параметрами, либо --network-plugin kubenet с параметрами--network-plugin azure.

Вместо назначаемого системой удостоверения можно также использовать назначаемое пользователем удостоверение. Дополнительные сведения см. в статье о том, как использовать управляемые удостоверения.

Создание кластера AKS с включенным диспетчером сетевых политик Azure — только Linux

В этом разделе описано, как создать кластер с пулами узлов Linux и включенным диспетчером сетевых политик Azure.

Для начала замените значения для $RESOURCE_GROUP_NAME переменных и $CLUSTER_NAME переменных.

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast

Создайте кластер AKS и укажите azure для network-plugin этого и network-policy.

Чтобы создать кластер, используйте следующую команду:

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --network-plugin azure \
    --network-policy azure \
    --generate-ssh-keys

Создание кластера AKS с включенным диспетчером сетевых политик Azure — Windows Server 2022 (предварительная версия)

В этом разделе описано, как создать кластер с пулами узлов Windows и включенным диспетчером сетевых политик Azure.

Примечание.

Диспетчер сетевых политик Azure с узлами Windows доступен только в Windows Server 2022.

Установка расширения Azure CLI для aks-preview

Внимание

Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.

Чтобы установить aks-preview расширение, выполните следующую команду:

az extension add --name aks-preview

Чтобы обновить до последней версии выпущенного расширения, выполните следующую команду:

az extension update --name aks-preview

Регистрация флага компонента WindowsNetworkPolicyPreview

Зарегистрируйте флаг компонента WindowsNetworkPolicyPreview, используя команду az feature register, как показано в указанном ниже примере.

az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

Через несколько минут отобразится состояние Registered (Зарегистрировано). Проверьте состояние регистрации с помощью команды az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

Когда состояние отражает зарегистрировано, обновите регистрацию Microsoft.ContainerService поставщика ресурсов с помощью команды az provider register :

az provider register --namespace Microsoft.ContainerService

Создание кластера AKS

Теперь вы замените значения для $RESOURCE_GROUP_NAME$CLUSTER_NAMEпеременных и $WINDOWS_USERNAME переменных.

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast

Создайте имя пользователя для использования в качестве учетных данных администратора для контейнеров Windows Server в кластере. Следующая команда запрашивает имя пользователя. Присвойте ему значение $WINDOWS_USERNAME. Помните, что команды в этой статье вводятся в оболочку Bash.

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME

Чтобы создать кластер, используйте следующую команду:

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy azure \
    --generate-ssh-keys

Создание кластера занимает несколько минут. По умолчанию кластер создается только с пулом узлов Linux. Если вы хотите использовать пулы узлов Windows, его можно добавить. Приведем пример:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

Создание кластера AKS с поддержкой Calico

Создайте кластер AKS и укажите --network-plugin azureи --network-policy calico. Указание --network-policy calico включения Calico в пулах узлов Linux и Windows.

Если вы планируете добавить пулы узлов Windows в кластер, включите windows-admin-username параметры, windows-admin-password соответствующие требованиям к паролям Windows Server.

Внимание

В настоящее время использование политик сети Calico с узлами Windows доступно в новых кластерах с помощью Kubernetes версии 1.20 или более поздней версии с Calico 3.17.2 и требует использования сети Azure CNI. Узлы Windows в кластерах AKS с поддержкой Calico также имеют ip-адрес с плавающей запятой по умолчанию.

Для кластеров с пулами узлов Linux под управлением Kubernetes 1.20 с более ранними версиями Calico версия Calico автоматически обновляется до версии 3.17.2.

Создайте имя пользователя для использования в качестве учетных данных администратора для контейнеров Windows Server в кластере. Следующая команда запрашивает имя пользователя. Присвойте ему значение $WINDOWS_USERNAME. Помните, что команды в этой статье вводятся в оболочку Bash.

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy calico \
    --generate-ssh-keys

Создание кластера занимает несколько минут. По умолчанию кластер создается только с пулом узлов Linux. Если вы хотите использовать пулы узлов Windows, его можно добавить. Например:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

Установка диспетчера политик сети Azure или Calico в существующем кластере

Кроме того, поддерживается установка Диспетчера сетевых политик Azure или Calico в существующих кластерах AKS.

Предупреждение

Процесс обновления активирует повторное изображение каждого пула узлов одновременно. Обновление каждого пула узлов отдельно не поддерживается. Любые нарушения сети кластера аналогичны обновлению образа узла или обновлению версии Kubernetes, где каждый узел в пуле узлов повторно создается.

Пример команды для установки диспетчера сетевых политик Azure:

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy azure

Пример команды для установки Calico:

Предупреждение

Это предупреждение относится к обновлению кластеров Kubenet с поддержкой Calico в Azure CNI Overlay с включенной функцией Calico.

  • В кластерах Kubenet с поддержкой Calico в качестве обработчика политики сети и CNI используется Calico.
  • В кластерах Azure CNI Калифорния используется только для применения политик сети, а не как CNI. Это может привести к короткой задержке между запуском модуля pod и тем, когда Calico разрешает исходящий трафик из модуля pod.

Рекомендуется использовать Cilium вместо Calico, чтобы избежать этой проблемы. Дополнительные сведения о Cilium в Azure CNI Powered cilium

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy calico

Обновление существующего кластера с установленным azure NPM или Calico в Azure CNI Powered cilium

Сведения об обновлении существующего кластера с установленным подсистемой политики сети до Azure CNI с помощью CILIUM см. в статье Об обновлении существующего кластера до Azure CNI Powered by Cilium

Проверка настройки политики сети

Когда кластер будет готов, выполните команду az aks get-credentials, чтобы настроить kubectl для подключения к кластеру Kubernetes. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.

az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME

Чтобы начать проверку сетевой политики, создайте пример приложения и задайте правила трафика.

Сначала создайте пространство имен, вызываемое demo для запуска примеров модулей pod:

kubectl create namespace demo

Теперь создайте два модуля pod в кластере с именем client и server.

Примечание.

Если вы хотите запланировать клиент или сервер на определенном узле, добавьте следующий бит перед --command аргументом в команде запуска kubectl для создания pod:

--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'

server Создание модуля pod. Этот модуль pod служит для TCP-порта 80:

kubectl run server -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --labels="app=server" --port=80 --command -- /agnhost serve-hostname --tcp --http=false --port "80"

client Создание модуля pod. Следующая команда запускает Bash в модуле client pod:

kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash

Теперь в отдельном окне выполните следующую команду, чтобы получить IP-адрес сервера:

kubectl get pod --output=wide -n demo

Выходные данные должны выглядеть так:

NAME     READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATES
server   1/1     Running   0          30s   10.224.0.72   akswin22000001   <none>           <none>

Тестирование подключения без политики сети

В оболочке клиента выполните следующую команду, чтобы проверить подключение к серверу. Замените server-ip ip-адрес, найденный в выходных данных предыдущей команды. Если подключение выполнено успешно, выходные данные отсутствуют.

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

Проверка подключения с помощью политики сети

Чтобы добавить политики сети, создайте файл с именем demo-policy.yaml и вставьте следующий манифест YAML:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: demo-policy
  namespace: demo
spec:
  podSelector:
    matchLabels:
      app: server
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: client
    ports:
    - port: 80
      protocol: TCP

Укажите имя манифеста YAML и примените его с помощью kubectl apply:

kubectl apply –f demo-policy.yaml

Теперь в оболочке клиента проверьте подключение к серверу, выполнив следующую /agnhost команду:

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

Подключение с трафиком блокируется, так как сервер помечен с app=serverметкой, но клиент не помечен. Предыдущая команда connect выдает следующие выходные данные:

TIMEOUT

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

kubectl label pod client -n demo app=client

Удаление диспетчера сетевых политик Azure или Calico

Требования:

  • Azure CLI версии 2.63 или более поздней

Примечание.

  • Процесс удаления не удаляет пользовательские определения ресурсов (CRD) и пользовательские ресурсы (CR), используемые Calico. Эти crD и CR имеют имена, заканчивающиеся "projectcalico.org" или "tigera.io". Эти crD и связанные CR можно вручную удалить после успешного удаления Calico (удаление CRD перед удалением Calico разрыва кластера).
  • Обновление не удаляет ресурсы NetworkPolicy в кластере, но после удаления этих политик больше не применяется.

Предупреждение

Процесс обновления активирует повторное изображение каждого пула узлов одновременно. Обновление каждого пула узлов отдельно не поддерживается. Любые нарушения сети кластера аналогичны обновлению образа узла или обновлению версии Kubernetes, где каждый узел в пуле узлов повторно создается.

Чтобы удалить диспетчер политик сети Azure или Calico из кластера, выполните следующую команду:

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy none

Очистка ресурсов

В этой статье вы создали пространство имен и два модуля pod и применили политику сети. Чтобы очистить эти ресурсы, используйте команду kubectl delete и укажите имя ресурса:

kubectl delete namespace demo

Следующие шаги

Дополнительные сведения о сетевых ресурсах см. в разделе Основные понятия сети в Службе Azure Kubernetes (AKS).

Чтобы узнать больше об использовании политик, ознакомьтесь с разделом Network Policies (Политики сети).