Azure Kubernetes 服务中的 HTTP 代理支持

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

此功能为 AKS 群集添加了 HTTP 代理支持,并公开了一个简单的接口,群集操作员可以使用该接口来保护依赖代理的环境中需要 AKS 的网络流量。

AKS 节点和 Pod 都将配置为使用 HTTP 代理。

一些更复杂的解决方案可能需要创建信任链来建立跨网络的安全通信。 此功能还支持在启动群集的过程中,在节点上安装受信任的证书颁发机构。

限制和其他详细信息

支持以下方案:

  • 每个节点池使用不同的代理配置
  • 用户/密码身份验证
  • 用于 API 服务器通信的自定义 CA
  • 基于 Windows 的群集
  • 使用虚拟机可用性集 (VMAS) 的节点池
  • 使用 * 作为通配符,附加到 noProxy 的域后缀

默认情况下,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"

先决条件

最新版本的 Azure CLI。 可通过运行 az --version 查找版本,运行 az upgrade 升级版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

使用 Azure CLI 配置 HTTP 代理

可通过以下方式结合使用 AKS 与 HTTP 代理来创建群集:使用 az aks create 命令,并以 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="
}

创建一个文件并为 httpProxy、httpsProxy 和 noProxy 提供值。 如果环境需要,请提供 trustedCa 的值。 接下来,部署群集,并使用 http-proxy-config 标志传入文件名。

az aks create -n $clusterName -g $resourceGroup --http-proxy-config aks-proxy-config.json

群集将使用节点上配置的 HTTP 代理进行初始化。

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

使用通过 ARM 模板配置的 HTTP 代理部署 AKS 群集非常简单。 用于 CLI 部署的相同架构位于属性下的 Microsoft.ContainerService/managedClusters 定义中:

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

在模板中,为 httpProxy、httpsProxy 和 noProxy 提供值。 必要时,请为 trustedCa 提供值。 部署模板,群集应使用节点上配置的 HTTP 代理进行初始化。

更新代理配置

注意

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

可以使用 az aks update 更改 httpProxyhttpsProxytrustedCaNoProxy 的值并将其应用到群集。 httpProxyhttpsProxy 和/或 NoProxy 的 aks 更新将使用新的 httpProxyhttpsProxyNoProxy 值自动将新环境变量注入到 Pod 中。 必须轮换 Pod 才能让应用拾取它,因为环境变量值是在 Pod 中注入的,而 Pod 是通过一个变异准入 Webhook 创建的。 对于 kubernetes 下的组件(如 containerd 和节点本身),这在执行节点映像升级之前不会生效。

例如,假设使用名为 aks-proxy-config-2.json 的新 CA 证书的 base64 编码字符串创建了一个新文件,以下操作会更新群集。 或者,你需要将应用程序的新终结点 URL 添加到 No Proxy:

az aks update -n $clusterName -g $resourceGroup --http-proxy-config aks-proxy-config-2.json

监视加载项配置

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

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

不支持下列配置:

  • 使用具有受信任证书的代理时,不支持自定义指标和建议的警报功能

后续步骤

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