本文介绍如何将 Azure Kubernetes 服务 (AKS) 群集配置为使用 HTTP 代理进行出站 Internet 访问。
部署到托管或自定义虚拟网络中的 AKS 群集具有某些出站依赖项,正常运行需要这些依赖项,这在需要通过 HTTP 代理路由 Internet 访问的环境中造成了问题。 节点无法启动访问 Internet 服务所需的配置、环境变量和证书。
HTTP 代理功能为 AKS 群集添加了 HTTP 代理支持,公开了一个简单的接口,可以使用该接口来保护依赖代理的环境中需要 AKS 的网络流量。 借助此功能,AKS 节点和 Pod 都配置为使用 HTTP 代理。 此功能还支持在启动群集的过程中,在节点上安装受信任的证书颁发机构。 更多复杂的解决方案可能需要创建信任链来建立跨网络的安全通信。
限制和注意事项
不支持以下方案:
- 每个节点池使用不同的代理配置
- 用户/密码身份验证
- 用于 API 服务器通信的自定义证书颁发机构 (CA)
- 具有 Windows 节点池的 AKS 群集
- 使用虚拟机可用性集 (VMAS) 的节点池
- 使用 * 作为通配符,附加到 noProxy 的域后缀
httpProxy
、httpsProxy
、trustedCa
默认没有值。 Pod 注入到以下环境变量:
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
NO_PROXY
no_proxy
若要禁用代理环境变量的注入,需要用 "kubernetes.azure.com/no-http-proxy-vars":"true"
注释 Pod。
开始之前
可以使用本地 Azure CLI。
如果需要, 请安装 Azure CLI 以运行 CLI 引用命令。
本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
使用 HTTP 代理值创建配置文件
创建文件并提供 httpProxy
、httpsProxy
、noProxy
的值。 如果环境需要,请提供 trustedCa
的值。
配置文件的架构如下所示:
{
"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 的组件兼容,该证书必须支持 而非已弃用的公用名证书。
应用程序在如何符合环境变量 http_proxy
、https_proxy
和 no_proxy
方面存在差异。 Curl 和 Python 不支持 no_proxy
中的 CIDR,而 Ruby 支持。
输入示例:
{
"httpProxy": "http://myproxy.server.com:8080/",
"httpsProxy": "https://myproxy.server.com:8080/",
"noProxy": [
"localhost",
"127.0.0.1"
],
"trustedCA": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgvVENDQmVXZ0F3SUJB...S0tLS0="
}
使用 Azure CLI 创建具有 HTTP 代理配置的群集
可以在创建群集期间使用 HTTP 代理配置配置 AKS 群集。
az aks create
使用命令并将配置作为 JSON 文件传入。az aks create \ --name $clusterName \ --resource-group $resourceGroup \ --http-proxy-config aks-proxy-config.json \ --generate-ssh-keys
你的群集应使用节点上配置的 HTTP 代理进行初始化。
通过检查环境变量是否包含相应的值
http_proxy
https_proxy
以及no_proxy
使用kubectl describe pod
命令,验证 HTTP 代理配置是否位于 Pod 和节点上。kubectl describe {any pod} -n kube-system
若要验证 Pod 中设置了代理变量,可以检查节点上存在的环境变量。
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
。 此更新使用新的 httpProxy
、httpsProxy
或 noProxy
值将新的环境变量注入 Pod。 必须轮换 Pod 才能让应用拾取它,因为环境变量值是由一个变异准入 Webhook 创建的。
注意
如果切换到新代理,则新代理必须已存在才能更新成功。 升级完成后,可以删除旧代理。
更新群集以更新或启用 HTTP 代理
使用
az aks update
命令在现有群集上启用或更新 HTTP 代理配置。例如,假设你创建了一个新文件,其中包含名为 aks-proxy-config-2.json 的新 CA 证书的 base64 编码字符串。 可以使用以下命令更新群集上的代理配置:
az aks update --name $clusterName --resource-group $resourceGroup --http-proxy-config aks-proxy-config-2.json
注意
使用命令更新群集上的代理配置时,AKS 会自动重新映像群集
az aks update
中的所有节点池。 可以使用 Pod 中断预算(PDB) 在重置映像期间保护对关键 Pod 的中断。通过检查环境变量是否包含相应的值
http_proxy
https_proxy
以及no_proxy
使用kubectl describe pod
命令,验证 HTTP 代理配置是否位于 Pod 和节点上。kubectl describe {any pod} -n kube-system
若要验证 Pod 中设置了代理变量,可以检查节点上存在的环境变量。
kubectl get nodes kubectl node-shell {node name} cat /etc/environment
升级 AKS 节点映像
配置代理后,必须升级节点映像才能应用更改。 节点映像升级过程是更新代理配置更新所需的 OS 文件的唯一方法。 节点映像升级过程是滚动升级,它会更新节点池中每个节点上的 OS 映像。 AKS 控制平面负责处理升级过程,该过程不会使正在运行的应用程序中断。
若要升级 AKS 节点映像,请参阅升级 Azure Kubernetes 服务 (AKS) 节点映像。
在现有群集上禁用 HTTP 代理(预览版)
安装 aks-preview
扩展
使用
aks-preview
命令安装az extension add
Azure CLI 扩展。重要
AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
az extension add --name aks-preview
使用
az extension update
命令更新到扩展的最新版本。 禁用 HTTP 代理至少需要 18.0.0b13。az extension update --name aks-preview
注册 DisableHTTPProxyPreview
功能标志
使用
DisableHTTPProxyPreview
命令注册az feature register
功能标志。az feature register --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
使用
az feature show
命令验证注册状态。 几分钟后,状态将显示为“已注册”。az feature show --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
当状态反映为已注册时,使用 命令刷新
az provider register
资源提供程序的注册。az provider register --namespace Microsoft.ContainerService
更新群集以禁用 HTTP 代理(预览版)
使用带有标志的
az aks update
命令--disable-http-proxy
更新群集以禁用 HTTP 代理。az aks update --name $clusterName --resource-group $resourceGroup --disable-http-proxy
验证是否未使用
kubectl describe pod
命令在 Pod 和节点上设置 HTTP 代理配置来验证 HTTP 代理是否已禁用。kubectl describe {any pod} -n kube-system
若要验证 Pod 中未设置代理变量,可以检查节点上存在的环境变量。
kubectl get nodes kubectl node-shell {node name} cat /etc/environment
升级 AKS 节点映像
配置代理后,必须升级节点映像才能应用更改。 节点映像升级过程是更新代理配置更新所需的 OS 文件的唯一方法。 节点映像升级过程是滚动升级,它会更新节点池中每个节点上的 OS 映像。 AKS 控制平面负责处理升级过程,该过程不会使正在运行的应用程序中断。
若要升级 AKS 节点映像,请参阅升级 Azure Kubernetes 服务 (AKS) 节点映像。
在现有群集上重新启用 HTTP 代理
创建群集时,默认情况下会启用 HTTP 代理。 在群集上禁用 HTTP 代理后,代理配置将保存在数据库中,但代理变量将从 Pod 和节点中删除。
若要在现有群集上重新启用 HTTP 代理,请使用
az aks update
带有标志的--enable-http-proxy
命令。az aks update --name $clusterName --resource-group $resourceGroup --enable-http-proxy
升级 AKS 节点映像
配置代理后,必须升级节点映像才能应用更改。 节点映像升级过程是更新代理配置更新所需的 OS 文件的唯一方法。 节点映像升级过程是滚动升级,它会更新节点池中每个节点上的 OS 映像。 AKS 控制平面负责处理升级过程,该过程不会使正在运行的应用程序中断。
若要升级 AKS 节点映像,请参阅升级 Azure Kubernetes 服务 (AKS) 节点映像。
重要
如果在禁用之前群集上有 HTTP 代理配置,则当在该群集上重新启用 HTTP 代理时,现有 HTTP 代理配置会自动应用。 建议先验证配置以确保它满足当前要求,然后再继续。 如果要在重新启用 HTTP 代理后更改 HTTP 代理配置,请按照步骤 更新现有群集上的 HTTP 代理配置。
使用 Azure 资源管理器 (ARM) 模板配置 HTTP 代理配置
可以使用 ARM 模板部署具有 HTTP 代理的 AKS 群集。
查看每个参数的要求:
-
httpProxy
:用于在群集外部创建 HTTP 连接的代理 URL。 URL 方案必须为http
。 -
httpsProxy
:用于在群集外部创建 HTTPS 连接的代理 URL。 如果未指定,则httpProxy
会同时用于 HTTP 和 HTTPS 连接。 -
noProxy
:目标域名、域、IP 地址或其他网络 CIDR 的列表,用于排除代理。 -
trustedCa
:包含base64 encoded
备用 CA 证书内容的字符串。 目前仅支持PEM
格式。
重要
为了与属于 Kubernetes 系统的基于 Go 的组件兼容,该证书必须支持 而非已弃用的公用名证书。
应用程序在如何符合环境变量
http_proxy
、https_proxy
和no_proxy
方面存在差异。 Curl 和 Python 不支持no_proxy
中的 CIDR,而 Ruby 支持。-
使用 HTTP 代理参数创建模板。 在你的模板中,提供
httpProxy
、httpsProxy
、noProxy
的值。 必要时,请提供trustedCa
的值。 用于 CLI 部署的同一架构存在于Microsoft.ContainerService/managedClusters
定义中的"properties"
下,如以下示例所示:"properties": { ..., "httpProxyConfig": { "enabled": "true", "httpProxy": "string", "httpsProxy": "string", "noProxy": [ "string" ], "trustedCa": "string" } }
使用 HTTP 代理配置部署 ARM 模板。 你的群集应使用节点上配置的 HTTP 代理进行初始化。
更新 HTTP 代理配置
可以在现有群集上更新 HTTP 代理配置,包括:
- 更新现有群集以启用 HTTP 代理并添加新的 HTTP 代理配置。
- 更新现有群集以更改 HTTP 代理配置。
HTTP 代理更新注意事项
--http-proxy-config
参数应设置为一个新的 JSON 文件,其中包含更新的httpProxy
httpsProxy
noProxy
值,必要时更新trustedCa
。 此更新使用新的 httpProxy
、httpsProxy
或 noProxy
值将新的环境变量注入 Pod。 必须轮换 Pod 才能让应用拾取它,因为环境变量值是由一个变异准入 Webhook 创建的。
注意
如果切换到新代理,则新代理必须已存在才能更新成功。 升级完成后,可以删除旧代理。
更新 ARM 模板以配置 HTTP 代理
在模板中,为和
httpsProxy
noProxy
提供新值httpProxy
。 必要时,请提供trustedCa
的值。用于 CLI 部署的同一架构存在于
Microsoft.ContainerService/managedClusters
定义中的"properties"
下,如以下示例所示:"properties": { ..., "httpProxyConfig": { "enabled": "true", "httpProxy": "string", "httpsProxy": "string", "noProxy": [ "string" ], "trustedCa": "string" } }
注意
使用命令更新群集上的代理配置时,AKS 会自动重新映像群集
az aks update
中的所有节点池。 可以使用 Pod 中断预算(PDB) 在重置映像期间保护对关键 Pod 的中断。通过检查环境变量是否包含相应的值
http_proxy
https_proxy
以及no_proxy
使用kubectl describe pod
命令,验证 HTTP 代理配置是否位于 Pod 和节点上。kubectl describe {any pod} -n kube-system
若要验证 Pod 中设置了代理变量,可以检查节点上存在的环境变量。
kubectl get nodes kubectl node-shell {node name} cat /etc/environment
升级 AKS 节点映像
配置代理后,必须升级节点映像才能应用更改。 节点映像升级过程是更新代理配置更新所需的 OS 文件的唯一方法。 节点映像升级过程是滚动升级,它会更新节点池中每个节点上的 OS 映像。 AKS 控制平面负责处理升级过程,该过程不会使正在运行的应用程序中断。
若要升级 AKS 节点映像,请参阅升级 Azure Kubernetes 服务 (AKS) 节点映像。
使用 ARM 模板在现有群集上禁用 HTTP 代理(预览版)
安装 aks-preview
扩展
使用
aks-preview
命令安装az extension add
Azure CLI 扩展。重要
AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
az extension add --name aks-preview
使用
az extension update
命令更新到扩展的最新版本。 禁用 HTTP 代理至少需要 18.0.0b13。az extension update --name aks-preview
注册 DisableHTTPProxyPreview
功能标志
使用
DisableHTTPProxyPreview
命令注册az feature register
功能标志。az feature register --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
使用
az feature show
命令验证注册状态。 几分钟后,状态将显示为“已注册”。az feature show --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
当状态反映为已注册时,使用 命令刷新
az provider register
资源提供程序的注册。az provider register --namespace Microsoft.ContainerService
更新群集以禁用 HTTP 代理
通过设置为 <
a0/> 更新群集 ARM 模板以禁用 HTTP 代理。 用于 CLI 部署的同一架构存在于 Microsoft.ContainerService/managedClusters
定义中的"properties"
下,如以下示例所示:"properties": { ..., "httpProxyConfig": { "enabled": "false", } }
在禁用 HTTP 代理的情况下部署 ARM 模板。
通过验证未使用
kubectl describe pod
命令在 Pod 和节点上设置 HTTP 代理配置来验证 HTTP 代理是否已禁用。kubectl describe {any pod} -n kube-system
若要验证 Pod 中未设置代理变量,可以检查节点上存在的环境变量。
kubectl get nodes kubectl node-shell {node name} cat /etc/environment
升级 AKS 节点映像
配置代理后,必须升级节点映像才能应用更改。 节点映像升级过程是更新代理配置更新所需的 OS 文件的唯一方法。 节点映像升级过程是滚动升级,它会更新节点池中每个节点上的 OS 映像。 AKS 控制平面负责处理升级过程,该过程不会使正在运行的应用程序中断。
若要升级 AKS 节点映像,请参阅升级 Azure Kubernetes 服务 (AKS) 节点映像。
在现有群集上重新启用 HTTP 代理
创建群集时,默认情况下会启用 HTTP 代理。 在群集上禁用 HTTP 代理后,无法再向该群集添加 HTTP 代理配置。
若要重新启用 HTTP 代理,请按照步骤 使用 ARM 模板更新 HTTP 代理配置。
外部服务的 Istio 加载项 HTTP 代理
如果使用 基于 Istio 的服务网格加载项进行 AKS,则必须创建一个服务条目,使网格中的应用程序能够通过 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_IP
和PROXY_PORT
的值。可以通过以下方式部署服务条目:
kubectl apply -f service_proxy.yaml
监视加载项配置
结合使用 HTTP 代理与监视加载项时,支持以下配置:
- 无身份验证的出站代理
- 具有 Log Analytics 终结点的受信任证书的出站代理
不支持以下配置:
- 将代理与受信任的证书配合使用时的自定义指标和建议警报功能
后续步骤
有关 AKS 群集的网络要求的详细信息,请参阅控制 AKS 中群集节点的出口流量。