Azure Kubernetes 服务 (AKS) 中的 HTTP 代理支持

本文介绍如何将 Azure Kubernetes 服务 (AKS) 群集配置为使用 HTTP 代理进行出站 Internet 访问。

部署到托管或自定义虚拟网络中的 AKS 群集具有某些出站依赖项,正常运行需要这些依赖项,这在需要通过 HTTP 代理路由 Internet 访问的环境中造成了问题。 节点无法启动访问 Internet 服务所需的配置、环境变量和证书。

HTTP 代理功能为 AKS 群集添加了 HTTP 代理支持,公开了一个简单的接口,可以使用该接口来保护依赖代理的环境中需要 AKS 的网络流量。 借助此功能,AKS 节点和 Pod 都配置为使用 HTTP 代理。 此功能还支持在启动群集的过程中,在节点上安装受信任的证书颁发机构。 更多复杂的解决方案可能需要创建信任链来建立跨网络的安全通信。

限制和注意事项

支持以下方案:

  • 每个节点池使用不同的代理配置
  • 用户/密码身份验证
  • 用于 API 服务器通信的自定义证书颁发机构 (CA)
  • 不支持使用 HTTP 代理配置现有 AKS 群集;必须在创建群集时启用 HTTP 代理功能。
  • 基于 Windows 的群集
  • 使用虚拟机可用性集 (VMAS) 的节点池
  • 使用 * 作为通配符,附加到 noProxy 的域后缀

httpProxyhttpsProxytrustedCa 默认没有值。 Pod 注入到以下环境变量:

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

若要禁用代理环境变量的注入,需要用 "kubernetes.azure.com/no-http-proxy-vars":"true" 注释 Pod。

开始之前

  • 你需要最新版本的 Azure CLI。 可通过运行 az --version 查找版本,运行 az upgrade 升级版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 检查可用的 AKS 群集升级,以确保运行最新版本的 AKS。 如果需要升级,请参阅升级 AKS 群集
  • 代理配置更新所需的 OS 文件只能在节点映像升级过程中更新。 配置代理后,必须升级节点映像才能应用更改。 有关详细信息,请参阅升级 AKS 节点映像

使用 Azure CLI 配置 HTTP 代理

可以在群集创建期间使用 az aks create 命令通过 HTTP 代理配置 AKS 群集,并将配置作为 JSON 文件传入。

配置文件的架构如下所示:

{
  "httpProxy": "string",
  "httpsProxy": "string",
  "noProxy": [
    "string"
  ],
  "trustedCa": "string"
}
  • httpProxy:用于在群集外部创建 HTTP 连接的代理 URL。 URL 方案必须为 http
  • httpsProxy:用于在群集外部创建 HTTPS 连接的代理 URL。 如果未指定,则 httpProxy 会同时用于 HTTP 和 HTTPS 连接。
  • noProxy:目标域名、域、IP 地址或其他网络 CIDR 的列表,用于排除代理。
  • trustedCa:包含 base64 encoded 备用 CA 证书内容的字符串。 目前仅支持 PEM 格式。

重要

为了与属于 Kubernetes 系统的基于 Go 的组件兼容,该证书必须支持 Subject Alternative Names(SANs) 而非已弃用的公用名证书。

应用程序在如何符合环境变量 http_proxyhttps_proxyno_proxy 方面存在差异。 Curl 和 Python 不支持 no_proxy 中的 CIDR,而 Ruby 支持。

输入示例:

注意

CA 证书应是 PEM 格式证书内容的 base64 编码字符串。

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

创建文件并提供 httpProxyhttpsProxynoProxy 的值。 如果环境需要,请提供 trustedCa 的值。 接下来,可以使用 az aks create 命令部署群集,将 --http-proxy-config 参数设为你创建的文件。 你的群集应使用节点上配置的 HTTP 代理进行初始化。

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

使用 Azure 资源管理器 (ARM) 模板配置 HTTP 代理

可以使用 ARM 模板部署具有 HTTP 代理的 AKS 群集。 用于 CLI 部署的同一架构存在于 Microsoft.ContainerService/managedClusters 定义中的 "properties" 下,如以下示例所示:

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

在你的模板中,提供 httpProxyhttpsProxynoProxy 的值。 必要时,请提供 trustedCa 的值。 接下来,可以部署模板。 你的群集应使用节点上配置的 HTTP 代理进行初始化。

适用于外部服务的 Istio 加载项 HTTP 代理

如果正在使用 [适用于 AKS 的基于 Istio 的服务网格加载项][istio-add-on-docs],则必须创建服务条目,使网格中的应用程序能够通过 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

创建文件并提供 PROXY_IPPROXY_PORT 的值。 可以使用以下部署服务条目

kubectl apply -f service_proxy.yaml

更新代理配置

注意

如果切换到新代理,则新代理必须已存在才能更新成功。 升级完成后,可以删除旧代理。

可以使用 az aks update 命令更新群集上的代理配置,将 --http-proxy-config 参数设置为新的 JSON 文件,其中 httpProxyhttpsProxynoProxytrustedCa 有更新的值(如有必要)。 此更新使用新的 httpProxyhttpsProxynoProxy 值将新的环境变量注入 Pod。 必须轮换 Pod 才能让应用拾取它,因为环境变量值是由一个变异准入 Webhook 创建的。 对于 Kubernetes 下的组件(如 containerd 和节点本身),这在执行节点映像升级之前不会生效。

例如,假设你创建了一个新文件,其中包含名为 aks-proxy-config-2.json 的新 CA 证书的 base64 编码字符串。 可以使用以下命令更新群集上的代理配置:

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

升级 AKS 节点映像

配置代理后,必须升级节点映像才能应用更改。 节点映像升级过程是更新代理配置更新所需的 OS 文件的唯一方法。 节点映像升级过程是滚动升级,它会更新节点池中每个节点上的 OS 映像。 AKS 控制平面负责处理升级过程,该过程不会使正在运行的应用程序中断。

若要升级 AKS 节点映像,请参阅升级 Azure Kubernetes 服务 (AKS) 节点映像

监视加载项配置

结合使用 HTTP 代理与监视加载项时,支持以下配置:

  • 无身份验证的出站代理
  • 具有用户名和密码身份验证的出站代理
  • 具有 Log Analytics 终结点的受信任证书的出站代理

不支持下列配置:

  • 将代理与受信任的证书配合使用时的自定义指标和建议警报功能

后续步骤

有关 AKS 群集的网络要求的详细信息,请参阅控制 AKS 中群集节点的出口流量