Защита трафика между модулями 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 Cilium
Поддерживаемые платформы 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 не поддерживает IPv6. В противном случае диспетчер сетевых политик Azure полностью поддерживает спецификации политики сети в Linux.

В Windows диспетчер сетевых политик Azure не поддерживает:

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

Примечание.

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

Масштабировать

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

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

Необходимо установить и настроить 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

Создание кластера 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

Создание кластера занимает несколько минут. По умолчанию кластер создается только с пулом узлов 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

Создание кластера занимает несколько минут. По умолчанию кластер создается только с пулом узлов 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 (предварительная версия)

Требования:

  • aks-preview расширение Azure CLI версии 0.5.166 или более поздней версии. См . раздел "Установка расширения Azure CLI для aks-preview".
  • Azure CLI версии 2.54 или более поздней
  • REST API AKS версии 2023-08-02-preview или более поздней

Примечание.

  • Процесс удаления не удаляет пользовательские определения ресурсов (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 (Политики сети).