Использование сети с двойным стеком в службе Azure Kubernetes (AKS)

Кластеры AKS можно развернуть в режиме двойного стека при использовании виртуальной сети Azure с двойным стеком. В этой конфигурации узлы получают как IPv4, так и IPv6-адрес из подсети виртуальной сети Azure. Pod получают как IPv4-, так и IPv6-адреса из логически отличного пространства адресов, которое отличается от адресного пространства подсети виртуальной сети Azure узлов. Трансляция сетевых адресов (NAT) затем настраивается таким образом, чтобы поды могли получать доступ к ресурсам в виртуальной сети Azure. Исходный IP-адрес трафика преобразуется через NAT в основной IP-адрес узла той же сети (IPv4 на IPv4 и IPv6 на IPv6).

В этой статье показано, как использовать сеть с двумя стеками с кластером AKS. Для получения дополнительной информации об опциях и соображениях сетей см. Основные понятия сети для Kubernetes и AKS.

Это важно

Начиная с 30 ноября 2025 г. служба Azure Kubernetes (AKS) больше не поддерживает или предоставляет обновления безопасности для Azure Linux 2.0. Образ узла Linux 2.0 Azure заморожен в выпуске202512.06.0. Начиная с 31 октября 2026 г. образы узлов будут удалены, и вы не сможете масштабировать пулы узлов. Выполните миграцию в поддерживаемую версию Linux Azure, обновив пулы узлов до поддерживаемой версии Kubernetes или переключив ее на osSku AzureLinux3. Дополнительные сведения см. в вопросе о прекращении поддержки на GitHub и объявлении об устаревании обновлений Azure. Чтобы оставаться в курсе объявлений и обновлений, следуйте заметкам о выпуске AKS.

Ограничения

  • В пулах узлов Azure Linux для служб IPv6 требуется externalTrafficPolicy: Local.
  • Для виртуальной сети Azure и CIDR pod требуется сеть с двумя стеками.
    • Для IP-адресов узла и pod не поддерживается одиночный стек только IPv6. Службы могут быть развернуты на IPv4 или IPv6.
  • Azure CNI Overlay не поддерживает сетевые политики Azure или Calico при использовании двухстековой сети. Чтобы использовать политики сети, используйте Azure CNI с помощью CILIUM.
  • Шлюз NAT уровня "Стандартный" поддерживает только IPv4. Для исходящего трафика с двумя стеками используйте шлюз NAT StandardV2. Управляемый AKS тип исходящего трафика managedNATGatewayV2 доступен в предварительной версии.
  • Надстройка виртуальных узлов не поддерживается в сети с двумя стеками.

Предпосылки

В этой статье используется Azure CNI Overlay. Вы также можете развернуть двухстековый кластер с Azure CNI Powered by Cilium в кластерах Linux под управлением Kubernetes версии 1.29 или более поздней версии.

Обзор двухстековой сетевой архитектуры в Kubernetes

Kubernetes версии 1.23 обеспечивает стабильную поддержку кластеров с двойным стеком IPv4/IPv6, включая сетевое взаимодействие подов и служб. Узлы и поды всегда получают как IPv4, так и IPv6 адреса, в то время как службы могут быть настроены либо в двухстековом, либо в одностековом режиме в любом семействе адресов.

AKS настраивает необходимые вспомогательные службы для сети с двойным стеком. Эта конфигурация включает:

  • Если используется управляемая виртуальная сеть, конфигурация виртуальной сети с двумя стеками.
  • Узлы IPv4 и IPv6 и адреса pod.
  • Правила исходящего трафика для трафика IPv4 и IPv6.
  • Настройка подсистемы балансировки нагрузки для служб IPv4 и IPv6.

Замечание

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

Параметры кластера с двумя стеками

Следующие параметры поддерживают кластеры с двумя стеками:

Parameter Допустимые значения Значение по умолчанию Constraints
--ip-families ipv4 или ipv4,ipv6 Не указано Укажите разделенный запятыми список семейств IP-адресов для включения в кластере.
--pod-cidrs Диапазоны CIDR, разделенные запятыми 10.244.0.0/16,fd12:3456:789a::/64 Число и порядок диапазонов должны совпадать --ip-families.
--service-cidrs Диапазоны CIDR, разделенные запятыми 10.0.0.0/16,fd12:3456:789a:1::/108 Число и порядок диапазонов должны совпадать --ip-families. Подсеть IPv6 не может быть больше /108.

Развертывание кластера AKS с двумя стеками

  1. Создайте группу ресурсов Azure для кластера с помощью az group create команды.

    az group create --location <region> --name <resourceGroupName>
    
  2. Создайте кластер AKS с двумя стеками с помощью az aks create команды с заданным параметром --ip-familiesipv4,ipv6.

    az aks create \
        --location <region> \
        --resource-group <resourceGroupName> \
        --name <clusterName> \
        --network-plugin azure \
        --network-plugin-mode overlay \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. После создания кластера получите учетные данные кластера с помощью az aks get-credentials команды.

    az aks get-credentials --resource-group <resourceGroupName> --name <clusterName>
    

Проверьте узлы, чтобы просмотреть оба семейства IP-адресов

После подготовки кластера с помощью команды kubectl get nodes убедитесь, что узлы настроены для работы с двухстековой сетью.

kubectl get nodes -o=custom-columns="NAME:.metadata.name,ADDRESSES:.status.addresses[?(@.type=='InternalIP')].address,PODCIDRS:.spec.podCIDRs[*]"

Выходные данные команды kubectl get nodes показывают, что узлы имеют адреса и пространство распределения IP-адресов pod для IPv4 и IPv6.

NAME                                ADDRESSES                           PODCIDRS
aks-nodepool1-14508455-vmss000000   10.240.0.4,2001:1234:5678:9abc::4   10.244.0.0/24,fd12:3456:789a::/80
aks-nodepool1-14508455-vmss000001   10.240.0.5,2001:1234:5678:9abc::5   10.244.1.0/24,fd12:3456:789a:0:1::/80
aks-nodepool1-14508455-vmss000002   10.240.0.6,2001:1234:5678:9abc::6   10.244.2.0/24,fd12:3456:789a:0:2::/80

Создание примера рабочей нагрузки

Разверните веб-сервер NGINX с тремя репликами, чтобы проверить назначение IP-адресов подам в двухстековой конфигурации.

Развертывание веб-сервера NGINX

  1. Создайте веб-сервер NGINX, выполнив kubectl create deployment nginx команду.

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. Просмотрите ресурсы pod, выполнив kubectl get pods команду.

    kubectl get pods -o custom-columns="NAME:.metadata.name,IPs:.status.podIPs[*].ip,NODE:.spec.nodeName,READY:.status.conditions[?(@.type=='Ready')].status"
    

    В выходных данных показано, что поды имеют как IPv4, так и IPv6 адреса. Поды не отображают IP-адреса, пока они не готовы.

    NAME                     IPs                                NODE                                READY
    nginx-55649fd747-9cr7h   10.244.2.2,fd12:3456:789a:0:2::2   aks-nodepool1-14508455-vmss000002   True
    nginx-55649fd747-p5lr9   10.244.0.7,fd12:3456:789a::7       aks-nodepool1-14508455-vmss000000   True
    nginx-55649fd747-r2rqh   10.244.1.2,fd12:3456:789a:0:1::2   aks-nodepool1-14508455-vmss000001   True
    

Опубликуйте нагрузку через службу типа LoadBalancer

Это важно

Azure Load Balancer отправляет проверки работоспособности узлам IPv6 с локального адреса канала. В пулах узлов Azure Linux трафик к службам IPv6, использующим externalTrafficPolicy: Cluster, не проходит. Следующие примеры устанавливают externalTrafficPolicy: Local для службы IPv6, чтобы kube-proxy отвечал на зондирующий запрос на узле.

  1. Откройте доступ к развертыванию NGINX с помощью отдельных служб IPv4 и IPv6 LoadBalancer, используя команду kubectl expose deployment nginx.

    kubectl expose deployment nginx --name=nginx-ipv4 --port=80 --type=LoadBalancer
    kubectl expose deployment nginx --name=nginx-ipv6 --port=80 --type=LoadBalancer --overrides='{"spec":{"externalTrafficPolicy":"Local","ipFamilies":["IPv6"]}}'
    

    Вы получаете вывод, показывающий, что службы открыты.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. После публикации развертывания и полного развертывания служб LoadBalancer получите IP-адреса служб с помощью команды kubectl get services.

    kubectl get services
    
    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx-ipv4   LoadBalancer   10.0.88.78               20.46.24.24         80:30652/TCP   97s
    nginx-ipv6   LoadBalancer   fd12:3456:789a:1::981a   2603:1030:8:5::2d   80:32002/TCP   63s
    
  3. Проверьте функциональные возможности виртуальной машины Linux или локального компьютера с назначенным IPv6-адресом и настроенной маршрутизацией IPv6. Azure Cloud Shell не поддерживает IPv6.

    SERVICE_IP=$(kubectl get services nginx-ipv6 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    curl -s "http://[${SERVICE_IP}]" | head -n5
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>