Поделиться через


Создание изолированного сетевого кластера Службы Azure Kubernetes (AKS)

Организации обычно имеют строгие требования к безопасности и соответствию требованиям для регулирования исходящего трафика (исходящего) сетевого трафика из кластера для устранения рисков кражи данных. По умолчанию стандартные кластеры SKU Службы Azure Kubernetes (AKS) имеют неограниченный исходящий доступ к Интернету. Такой уровень сетевого доступа позволяет работающим узлам и службам обращаться к внешним ресурсам по мере необходимости. Если вы хотите ограничить исходящий трафик, нужно сохранить доступ для ограниченного числа портов и адресов, чтобы обеспечить работоспособность для задач обслуживания кластера. Концептуальный документ по правилам исходящего трафика и полного доменного имени (FQDN) для кластеров AKS предоставляет список обязательных конечных точек для кластера AKS, а также его дополнительных надстроек и функций.

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

Чтобы снизить риск кражи данных, сетевой изолированный кластер позволяет загружать кластер AKS без каких-либо зависимостей исходящей сети, даже для получения компонентов или образов кластера из Реестра артефактов Майкрософт (MAR). Оператор кластера может постепенно настроить разрешенный исходящий трафик для каждого сценария, который требуется включить. В этой статье описаны шаги по созданию изолированного сетевого кластера.

Перед тем как начать

Замечание

Общедоступный исходящий тип none. Тип исходящего трафикаblock доступен в режиме предварительного просмотра.

Это важно

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

  • Для этой статьи требуется версия 2.71.0 или более поздняя версия Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена там.
  • Если вы используете исходящий тип aks-preview (предварительная версия), необходимо установить расширение Azure CLI версии block или более позднюю.
    • Если у вас еще нет aks-preview расширения, установите его с помощью az extension add команды.
      az extension add --name aks-preview
      
    • Если у вас уже есть aks-preview расширение, обновите его, чтобы убедиться, что у вас установлена последняя версия с помощью az extension update команды.
      az extension update --name aks-preview
      
  • Изолированные кластеры сети поддерживаются на кластерах AKS с Kubernetes версии 1.30 и выше.
  • Если вы выбираете использовать собственный реестр контейнеров Azure (BYO) (ACR), необходимо убедиться, что ACR — это уровень служб SKU уровня "Премиум".
  • Если вы используете изолированный сетевой кластер, настроенный с интеграцией виртуальной сети API Server, необходимо следовать предварительным требованиям и рекомендациям в этом документе.

Развертывание изолированного сетевого кластера с помощью ACR, управляемого AKS

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

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

При создании изолированного сетевого кластера AKS можно выбрать один из следующих режимов частного кластера — на основе частного канала связи или интеграция сервера API с виртуальной сетью.

Независимо от выбранного режима, следует задать --bootstrap-artifact-source и --outbound-type параметры.

Можно задать --bootstrap-artifact-source значение как Direct для использования прямого MAR (без изоляции сети) или Cache для использования частного ACR (с изоляцией сети) при извлечении изображений.

Можно задать значение для --outbound-type parameter, выбрав none или block (предварительная версия). Если для типа исходящего трафика задано noneзначение, AKS не настраивает исходящие подключения для кластера, позволяя пользователю настраивать их самостоятельно. Если для типа исходящего трафика задано значение block, все исходящие подключения блокируются.

Создайте изолированный кластер сети на основе приватной ссылки, выполнив команду az aks create с параметрами --bootstrap-artifact-source, --enable-private-cluster, и --outbound-type.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}   --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none  --network-plugin azure --enable-private-cluster

Интеграция виртуальной сети сервера API

Создайте изолированный сетевой кластер, настроенный с помощью интеграции виртуальной сети API Server, выполнив команду az aks create с параметрами --bootstrap-artifact-source, --enable-private-cluster, --enable-apiserver-vnet-integration и --outbound-type.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration

Обновление существующего кластера AKS до изолированного типа сети

Если вы предпочитаете включить сетевую изоляцию в существующем кластере AKS вместо создания нового кластера, используйте команду az aks update .

Чтобы включить функцию изолированной сети в существующем кластере AKS, сначала выполните следующую команду, чтобы обновить bootstrap-artifact-source:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache

Затем необходимо вручную восстановить изображение всех существующих пулов узлов.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Замечание

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

NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done

Подождите и убедитесь, что повторное создание образа завершится, а затем выполните следующую команду, чтобы обновить outbound-type:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none

Это важно

Не забудьте пересоздать образ пулов узлов кластера сразу после обновления источника артефактов для кэширования. В противном случае функция не вступит в силу для кластера.

Разверните изолированный сетевой кластер с использованием собственного ACR

AKS поддерживает возможность использования собственного (BYO) ACR. Для поддержки сценария ACR byO необходимо настроить частную конечную точку ACR и частную зону DNS перед созданием кластера AKS.

Ниже показано, как подготовить эти ресурсы:

  • Настраиваемая виртуальная сеть и подсети для AKS и ACR.
  • ACR, правило кэша ACR, частная конечная точка и частная зона DNS.
  • Пользовательское удостоверение для управляющего узла и удостоверение kubelet.

Шаг 1. Создание виртуальной сети и подсетей

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

az network vnet create  --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --address-prefixes 192.168.0.0/16

az network vnet subnet create --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.1.0/24

SUBNET_ID=$(az network vnet subnet show --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' --output tsv)

az network vnet subnet create --name ${ACR_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.2.0/24 --private-endpoint-network-policies Disabled

Шаг 2. Отключение исходящего подключения виртуальной сети (необязательно)

Существует несколько способов отключения исходящего подключения виртуальной сети.

Шаг 3. Создание ACR и включение кэша артефактов

  1. Создайте ACR с частной ссылкой.

    az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false
    
    REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP}  --query 'id' --output tsv)
    
  2. Создайте правило кэша ACR, выполнив приведенную ниже команду, чтобы разрешить пользователям кэшировать образы контейнеров MAR и двоичные файлы в новом ACR, обратите внимание, что имя правила кэша и имена репозитория должны быть строго согласованы с приведенными ниже рекомендациями.

    az acr cache create -n aks-managed-mcr -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "aks-managed-repository/*"
    

Замечание

При использовании ACR BYO вы несете ответственность за создание и правильное обслуживание правила кэша ACR, как описано выше. Этот шаг является критически важным для создания кластера, функционирования и обновления. Это правило кэша не должно быть изменено.

Шаг 4. Создание частной конечной точки для ACR

az network private-endpoint create --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --subnet ${ACR_SUBNET_NAME} --private-connection-resource-id ${REGISTRY_ID} --group-id registry --connection-name myConnection

NETWORK_INTERFACE_ID=$(az network private-endpoint show --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --query 'networkInterfaces[0].id' --output tsv)

REGISTRY_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" --output tsv)

DATA_ENDPOINT_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$LOCATION'].privateIPAddress" --output tsv)

Шаг 5. Создание частной зоны DNS и добавление записей

Создайте частную зону DNS с именем privatelink.azurecr.io. Добавьте записи для конечной точки {REGISTRY_NAME}.azurecr.ioREST реестра и конечной точки {REGISTRY_NAME}.{REGISTRY_LOCATION}.data.azurecr.ioданных реестра.

az network private-dns zone create --resource-group ${RESOURCE_GROUP} --name "privatelink.azurecr.io"

az network private-dns link vnet create --resource-group ${RESOURCE_GROUP} --zone-name "privatelink.azurecr.io" --name MyDNSLink --virtual-network ${VNET_NAME} --registration-enabled false

az network private-dns record-set a create --name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${REGISTRY_PRIVATE_IP}

az network private-dns record-set a create --name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${DATA_ENDPOINT_PRIVATE_IP}

Шаг 6. Создание контрольной плоскости и идентичностей kubelet

Идентичность контрольной плоскости

az identity create --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

CLUSTER_IDENTITY_RESOURCE_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

CLUSTER_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Удостоверение Kubelet

az identity create --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

KUBELET_IDENTITY_RESOURCE_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

KUBELET_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Предоставление разрешений AcrPull для удостоверения Kubelet

az role assignment create --role AcrPull --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

После настройки этих ресурсов можно продолжить создание изолированного кластера AKS сети с помощью BYO ACR.

Шаг 7. Создание изолированного сетевого кластера с помощью BYO ACR

При создании изолированного сетевого кластера можно выбрать один из следующих режимов частного кластера — на основе приватного подключения или интеграция виртуальной сети с сервером API.

Независимо от выбранного режима, следует задать --bootstrap-artifact-source и --outbound-type параметры.

Для --bootstrap-artifact-source можно задать значение Direct или Cache, чтобы использовать прямой реестр артефактов Майкрософт (MAR) (НЕ изолированная сеть) и частный ACR (изолированная сеть) для извлечения изображений соответственно.

Можно задать значение для --outbound-type parameter, выбрав none или block (предварительная версия). Если для типа исходящего трафика задано noneзначение, AKS не настраивает исходящие подключения для кластера, позволяя пользователю настраивать их самостоятельно. Если для типа исходящего трафика задано значение block, все исходящие подключения блокируются.

Создайте изолированный кластер сети на основе частных подключений для доступа к ACR, выполнив команду az aks create с необходимыми параметрами.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster

Интеграция виртуальной сети сервера API

Для изолированного сетевого кластера, настроенного с интеграцией сервера API с VNet, сначала создайте подсеть и назначьте правильную роль с помощью следующих команд:

az network vnet subnet create --name ${APISERVER_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.3.0/24

export APISERVER_SUBNET_ID=$(az network vnet subnet show --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${APISERVER_SUBNET_NAME} --query id -o tsv)
az role assignment create --scope ${APISERVER_SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

Создайте изолированный сетевой кластер, настроенный с интеграцией виртуальной сети API Server, и получите доступ к ACR, используя команду az aks create с необходимыми параметрами.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}

Обновление существующего кластера AKS

Если вы предпочитаете включить сетевую изоляцию в существующем кластере AKS вместо создания нового кластера, используйте команду az aks update .

При создании частной конечной точки и частной зоны DNS для ACR BYO используйте существующую виртуальную сеть и подсети существующего кластера AKS. При назначении разрешения AcrPull удостоверению kubelet используйте существующее удостоверение kubelet существующего кластера AKS.

Чтобы включить функцию изолированной сети в существующем кластере AKS, сначала выполните следующую команду, чтобы обновить bootstrap-artifact-source:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID}

Затем необходимо вручную восстановить изображение всех существующих пулов узлов.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Замечание

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

NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done

Подождите и убедитесь, что повторное создание образа завершится, а затем выполните следующую команду, чтобы обновить outbound-type:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none

Это важно

Не забудьте пересоздать образ пулов узлов кластера сразу после обновления источника артефактов для кэширования. В противном случае функция не вступит в силу для кластера.

Обновление идентификатора ACR

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

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

Обновление идентификатора ACR выполняется запуском команды az aks update с параметрами --bootstrap-artifact-source и --bootstrap-container-registry-resource-id.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id <New BYO ACR resource ID>

При обновлении идентификатора ACR в существующем кластере необходимо вручную восстановить все существующие узлы.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Это важно

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

Проверка включения изолированного сетевого кластера

Чтобы проверить функцию изолированного кластера сети, используйте команду az aks show

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

В следующих результатах показано, что функция включена на основании значений свойства outboundType (ни один или заблокировано) и свойства artifactSource (кэшировано).

"kubernetesVersion": "1.30.3",
"name": "myAKSCluster"
"type": "Microsoft.ContainerService/ManagedClusters"
"properties": {
  ...
  "networkProfile": {
    ...
    "outboundType": "none",
    ...
  },
  ...
  "bootstrapProfile": {
    "artifactSource": "Cache",
    "containerRegistryId": "/subscriptions/my-subscription-id/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
  },
  ...
}

Отключение изолированного сетевого кластера

Отключите функцию изолированного сетевого кластера, выполнив команду az aks update с параметрами --bootstrap-artifact-source и --outbound-type.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Direct --outbound-type LoadBalancer

При отключении функции в существующем кластере необходимо вручную повторно создать образ всех существующих узлов.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Это важно

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

Устранение неполадок

Если у вас возникают проблемы, например, ошибки извлечения изображений, см. статью Устранение неполадок в изолированных сетях кластеров Службы Azure Kubernetes (AKS).

Дальнейшие шаги

Если вы хотите настроить конфигурацию ограничений на исходящий трафик с помощью брандмауэра Azure, посетите Контроль исходящего трафика с помощью брандмауэра Azure в AKS.

Если вы хотите ограничить обмен данными pod между собой и East-West ограничениями трафика в кластере, см. раздел "Безопасный трафик между модулями pod с помощью политик сети в AKS".