Поддержка прокси-сервера HTTP в Azure Kubernetes Service (AKS)

В этой статье вы узнаете, как настроить кластеры Azure Kubernetes Service (AKS) для использования HTTP-прокси для исходящего доступа к Интернету.

Кластеры AKS, развернутые в управляемых или пользовательских виртуальных сетях, имеют определенные исходящие зависимости, необходимые для правильной работы, что создало проблемы в средах, требующих перенаправления доступа к Интернету через прокси-серверы HTTP. Узлы не имели возможности провести начальную загрузку конфигурации, переменных среды и сертификатов, необходимых им для доступа к службам Интернета.

Функция прокси-сервера HTTP добавляет поддержку HTTP-прокси в кластеры AKS, предоставляя простой интерфейс, который можно использовать для защиты сетевого трафика, необходимого ДЛЯ AKS, в средах, зависящих от прокси-сервера. С помощью этой функции узлы AKS и модули pod настроены для использования прокси-сервера HTTP. Эта функция также позволяет установить доверенный центр сертификации на узлах при начальной загрузке кластера. Более сложные решения могут потребовать создания цепочки доверия для обеспечения безопасного взаимодействия в сети.

Рекомендации и ограничения

Следующие сценарии не поддерживаются:

  • Разные конфигурации прокси-сервера для разных пулов узлов
  • Аутентификация по имени пользователя и паролю
  • Пользовательские удостоверяющие центры (ЦС) для связи с API-сервером
  • Можно указать не более 20 доверенных сертификатов ЦС
  • Кластеры AKS с пулами узлов Windows
  • Пулы узлов с использованием групп доступности виртуальных машин (VMAS)
  • Использование * в качестве подстановочного знака, присоединенного к суффиксу домена для noProxy
  • Узлы noProxy должны быть совместимыми с RFC 1123

httpProxy, httpsProxyи trustedCa не имеет значения по умолчанию. Модули pod внедряются со следующими переменными среды:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

Чтобы отключить внедрение переменных среды прокси-сервера, необходимо отметить Pod с помощью "kubernetes.azure.com/no-http-proxy-vars":"true".

Перед началом работы

  • Для отключения прокси-сервера HTTP требуется минимальная версия CLI 2.85.0.

Создание файла конфигурации со значениями прокси-сервера HTTP

Создайте файл и укажите значения для httpProxy, httpsProxyи noProxy. Если в вашей среде это необходимо, укажите значение для trustedCa.

Схема файла конфигурации выглядит следующим образом:

{
  "httpProxy": "string",
  "httpsProxy": "string",
  "noProxy": [
    "string"
  ],
  "trustedCa": "string"
}

Проверьте требования к каждому параметру:

  • httpProxy: URL-адрес прокси-сервера, который будет использоваться для создания HTTP-соединений за пределами кластера. Схема URL-адреса должна быть http.
  • httpsProxy: URL-адрес прокси-сервера, который будет использоваться для создания HTTPS-соединений за пределами кластера. Если это не указано, httpProxy используется для подключений HTTP и HTTPS.
  • noProxy: список доменов назначения, доменов, IP-адресов или других сетевых CIDR для исключения прокси-сервера.
  • trustedCa: строка, содержащая альтернативное содержимое сертификата ЦС base64 encoded. В настоящее время поддерживается только PEM формат. Ограничение в 20 сертификатов.

Внимание

Для совместимости с компонентами Go, которые входят в систему Kubernetes, сертификат должен поддерживаться Subject Alternative Names(SANs) вместо устаревших сертификатов common Name.

Существуют различия в использовании переменной окружения http_proxy, https_proxy и no_proxy в приложениях. Curl и Python не поддерживают CIDR в no_proxy, но Ruby делает.

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

{
  "httpProxy": "http://myproxy.server.com:8080", 
  "httpsProxy": "https://myproxy.server.com:8080", 
  "noProxy": [
    "localhost",
    "127.0.0.1"
  ],
    "trustedCa": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgvVENDQmVXZ0F3SUJB...S0tLS0="
}

Создание кластера с конфигурацией прокси-сервера HTTP с помощью Azure CLI

Можно настроить кластер AKS с конфигурацией HTTP-прокси во время его создания.

  1. az aks create Используйте команду и передайте конфигурацию в виде JSON-файла.

    az aks create \
        --name $clusterName \
        --resource-group $resourceGroup \
        --http-proxy-config aks-proxy-config.json \
        --generate-ssh-keys
    

    Кластер должен инициализироваться с настроенным на узлах HTTP-прокси.

  2. Убедитесь, что конфигурация прокси-сервера HTTP сконфигурирована в pod и на узлах, проверяя, содержат ли переменные среды соответствующие значения для http_proxy, https_proxy и no_proxy с помощью команды kubectl describe pod.

    kubectl describe {any pod} -n kube-system
    

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

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

Обновление конфигурации прокси-сервера HTTP

Конфигурации прокси-сервера HTTP можно обновить в существующих кластерах, в том числе:

  • Обновление существующего кластера для включения прокси-сервера HTTP и добавления новой конфигурации прокси-сервера HTTP.
  • Обновление существующего кластера для изменения конфигурации прокси-сервера HTTP.

Рекомендации по обновлению прокси-сервера HTTP

При необходимости параметр --http-proxy-config должен быть установлен на новый JSON-файл с обновленными значениями для httpProxy, httpsProxy, noProxy и trustedCa. Обновление вводит новые переменные среды в модули pod с новыми значениями httpProxy, httpsProxy или noProxy. Pod'ы должны перезапускаться, чтобы приложения их приняли, так как значения переменных среды внедряются мутирующим веб-перехватчиком.

Примечание.

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

Обновление кластера для обновления или включения прокси-сервера HTTP

  1. Включите или обновите конфигурации прокси-сервера HTTP в существующем кластере az aks update с помощью команды.

    Например, предположим, что вы создали новый файл с строкой в кодировке Base64 нового сертификата ЦС с именем aks-proxy-config-2.json. Конфигурацию прокси-сервера в кластере можно обновить с помощью следующей команды:

    az aks update --name $clusterName --resource-group $resourceGroup --http-proxy-config aks-proxy-config-2.json
    

Осторожность

AKS автоматически перезаписывает образы всех пулов узлов в кластере при обновлении конфигурации прокси-сервера на вашем кластере с помощью команды az aks update. Вы можете использовать бюджеты нарушений pod (PDB) для защиты критически важных модулей pod во время повторного просмотра.

  1. Убедитесь, что конфигурация прокси-сервера HTTP сконфигурирована в pod и на узлах, проверяя, содержат ли переменные среды соответствующие значения для http_proxy, https_proxy и no_proxy с помощью команды kubectl describe pod.

    kubectl describe {any pod} -n kube-system
    

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

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

Отключение прокси-сервера HTTP в существующем кластере

Обновление кластера для отключения прокси-сервера HTTP

  1. Обновите кластер, чтобы отключить HTTP прокси, с помощью команды с флагом az aks update--disable-http-proxy.

    az aks update --name $clusterName --resource-group $resourceGroup --disable-http-proxy
    

Осторожность

AKS автоматически перезаписывает образы всех пулов узлов в кластере при обновлении конфигурации прокси-сервера на вашем кластере с помощью команды az aks update. Вы можете использовать бюджеты нарушений pod (PDB) для защиты критически важных модулей pod во время повторного просмотра.

  1. Убедитесь, что прокси-сервер HTTP отключен, проверив, что конфигурация прокси-сервера HTTP не задана в pod'ах и на узлах, с помощью команды kubectl describe pod.

    kubectl describe {any pod} -n kube-system
    

    Чтобы проверить, что переменные прокси-сервера не заданы в модулях pods, можно проверить переменные среды, присутствующие на узлах.

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

Повторно включите прокси-сервер HTTP в существующем кластере

При создании кластера прокси-сервер HTTP включен по умолчанию. После отключения HTTP-прокси в кластере конфигурация прокси-сервера сохраняется в базе данных, но переменные прокси-сервера удаляются из модулей pod и узлов.

Чтобы повторно включить HTTP-прокси в существующем кластере, используйте az aks update команду с флагом --enable-http-proxy .

az aks update --name $clusterName --resource-group $resourceGroup --enable-http-proxy

Осторожность

AKS автоматически перезаписывает образы всех пулов узлов в кластере при обновлении конфигурации прокси-сервера на вашем кластере с помощью команды az aks update. Вы можете использовать бюджеты нарушений pod (PDB) для защиты критически важных модулей pod во время повторного просмотра.

Внимание

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

Настройка конфигурации прокси-сервера HTTP с помощью шаблона Azure Resource Manager (ARM)

Кластер AKS можно развернуть с помощью HTTP-прокси с использованием шаблона ARM.

  1. Проверьте требования к каждому параметру:

    • httpProxy: URL-адрес прокси-сервера, который будет использоваться для создания HTTP-соединений за пределами кластера. Схема URL-адреса должна быть http.
    • httpsProxy: URL-адрес прокси-сервера, который будет использоваться для создания HTTPS-соединений за пределами кластера. Если это не указано, httpProxy используется для подключений HTTP и HTTPS.
    • noProxy: список доменов назначения, доменов, IP-адресов или других сетевых CIDR для исключения прокси-сервера.
    • trustedCa: строка, содержащая альтернативное содержимое сертификата ЦС base64 encoded. В настоящее время поддерживается только PEM формат.

    Внимание

    Для совместимости с компонентами Go, которые входят в систему Kubernetes, сертификат должен поддерживаться Subject Alternative Names (SANs) вместо устаревших сертификатов common Name.

    Существуют различия в использовании переменной окружения http_proxy, https_proxy и no_proxy в приложениях. Curl и Python не поддерживают CIDR в no_proxy, но Ruby делает.

  2. Создайте шаблон с параметрами прокси-сервера HTTP. В шаблоне укажите значения для httpProxy, httpsProxyи noProxy. При необходимости укажите значение для trustedCa. Та же схема, используемая для развертывания CLI, существует в определении Майкрософт.ContainerService/managedClusters в разделе "properties", как показано в следующем примере:

    "properties": {
        ...,
        "httpProxyConfig": {
          "enabled": "true",
            "httpProxy": "string",
            "httpsProxy": "string",
            "noProxy": [
                "string"
            ],
            "trustedCa": "string"
        }
    }
    
  3. Разверните шаблон ARM с конфигурацией HTTP-прокси. Кластер должен инициализироваться с настроенным на узлах прокси-сервером HTTP.

Обновление конфигурации прокси-сервера HTTP

Конфигурации прокси-сервера HTTP можно обновить в существующих кластерах, в том числе:

  • Обновление существующего кластера для включения прокси-сервера HTTP и добавления новой конфигурации прокси-сервера HTTP.
  • Обновление существующего кластера для изменения конфигурации прокси-сервера HTTP.

Рекомендации по обновлению прокси-сервера HTTP

При необходимости параметр --http-proxy-config должен быть установлен на новый JSON-файл с обновленными значениями для httpProxy, httpsProxy, noProxy и trustedCa. Обновление вводит новые переменные среды в модули pod с новыми значениями httpProxy, httpsProxy или noProxy. Pod'ы должны перезапускаться, чтобы приложения их приняли, так как значения переменных среды внедряются мутирующим веб-перехватчиком.

Примечание.

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

Обновление шаблона ARM для настройки HTTP-прокси-сервера

  1. В шаблоне укажите новые значения для httpProxy, httpsProxyа также noProxy. При необходимости укажите значение для trustedCa.

    Та же схема, используемая для развертывания CLI, существует в определении Майкрософт.ContainerService/managedClusters в разделе "properties", как показано в следующем примере:

    "properties": {
        ...,
        "httpProxyConfig": {
            "enabled": "true",
            "httpProxy": "string",
            "httpsProxy": "string",
            "noProxy": [
                "string"
            ],
            "trustedCa": "string"
        }
    }
    
  2. Разверните шаблон ARM с обновленной конфигурацией прокси-сервера HTTP.

Осторожность

AKS автоматически перезаписывает образы всех пулов узлов в кластере при обновлении конфигурации прокси-сервера на вашем кластере с помощью команды az aks update. Вы можете использовать бюджеты нарушений pod (PDB) для защиты критически важных модулей pod во время повторного просмотра.

  1. Убедитесь, что конфигурация прокси-сервера HTTP сконфигурирована в pod и на узлах, проверяя, содержат ли переменные среды соответствующие значения для http_proxy, https_proxy и no_proxy с помощью команды kubectl describe pod.

    kubectl describe {any pod} -n kube-system
    

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

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

Отключение прокси-сервера HTTP в существующем кластере с помощью шаблона ARM

Обновление кластера для отключения прокси-сервера HTTP

  1. Обновите шаблон ARM кластера, чтобы отключить прокси-сервер HTTP, установив для параметра enabled значение false. Та же схема, используемая для развертывания CLI, существует в определении Майкрософт.ContainerService/managedClusters в разделе "properties", как показано в следующем примере:

    "properties": {
        ...,
        "httpProxyConfig": {
           "enabled": "false",
        }
    }
    
  2. Разверните шаблон ARM с отключенным HTTP-прокси.

Осторожность

AKS автоматически перезаписывает образы всех пулов узлов в кластере при обновлении конфигурации прокси-сервера на вашем кластере с помощью команды az aks update. Вы можете использовать бюджеты нарушений pod (PDB) для защиты критически важных модулей pod во время повторного просмотра.

  1. Убедитесь, что прокси-сервер HTTP отключен, проверяя, что конфигурация прокси-сервера HTTP не задана в подах и узлах, используя команду kubectl describe pod.

    kubectl describe {any pod} -n kube-system
    

    Чтобы проверить, что переменные прокси-сервера не заданы в модулях pods, можно проверить переменные среды, присутствующие на узлах.

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

Повторно включите прокси-сервер HTTP в существующем кластере

При создании кластера прокси-сервер HTTP включен по умолчанию. После отключения ПРОКСИ-сервера HTTP в кластере больше не удается добавить конфигурации прокси-сервера HTTP в этот кластер.

Если вы хотите повторно включить HTTP-прокси, выполните действия по обновлению конфигурации прокси-сервера HTTP с помощью шаблона ARM.


Прокси-сервер HTTP надстройки Istio для внешних служб

Если вы используете надстройку сетевой сетки на основе Istio для AKS, необходимо создать Service Entry, чтобы приложения в сетке могли получать доступ к некластерным или внешним ресурсам через HTTP-прокси.

Например:

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
    name: proxy
spec:
    hosts:
    - my-company-proxy.com # ignored
    addresses:
    - $PROXY_IP/32
    ports:
    - number: $PROXY_PORT
        name: tcp
        protocol: TCP
    location: MESH_EXTERNAL
  1. Создайте файл и укажите значения для PROXY_IP и PROXY_PORT.

  2. Вы можете развернуть запись службы с использованием:

    kubectl apply -f service_proxy.yaml
    

Мониторинг конфигурации дополнения

HTTP-прокси с надстройкой мониторинга поддерживает следующие конфигурации:

  • Исходящий прокси-сервер без аутентификации
  • Исходящий прокси-сервер с доверенным сертификатом для конечной точки Log Analytics

Следующая конфигурация не поддерживается:

  • Пользовательские метрики и рекомендуемые функции оповещений при использовании прокси-сервера с доверенными сертификатами

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

Дополнительные сведения о требованиях к сети кластеров AKS см. в разделе "Управление исходящим трафиком" для узлов кластера в AKS.