docker - 如何在 Kubernetes pod 中设置 no_proxy
问题描述
因为我的 Kubernetes Cluster 在企业代理后面,所以我需要通过环境变量在 Pod 中设置 http/https 代理,并设置 no_proxy 以允许 Pod 间和服务间通信以及与其他本地私有服务器的通信。
通过 env 变量传递到 pod 时,代理 http/https 配置工作得很好;但是 no_proxy 不能很好地工作,它会破坏内部 pod/service 通信。
我曾尝试在 Kubernetes 的不同级别设置 no_proxy 和 NO_PROXY,但未成功,主要在:
- Docker 守护进程:/etc/systemd/system/docker.service.d/http-proxy.conf
- Docker 客户端:/root/.docker/config.json(虽然在 CentOS 上使用 Docker v1.13.1 时似乎不适用)
- Docker 客户端:通过在创建时传递给 Pod 的环境变量,在使用 kubectl 运行它们的 yaml 文件中
- Kubernetes 主节点和工作节点作为环境变量
- 以及上述设置的许多组合
POD 中的代理配置通过 POD 中的 env 变量成功:
导出 http_proxy="http://10.16.1.1:8080"
导出 https_proxy="https://10.16.1.1:8080"
但是,以上都不适用于 no_proxy 异常,我尝试了很多语法,还添加了我的节点、pod 和服务网络以及 .svc(如 OpenShift 所建议的那样)......如下所示:
export no_proxy=".svc,.example.com"
export no_proxy="localhost,127.0.0.0/8,10.1.16.0/24,10.240.0.0/16,10.241.0.0/16,*.domain.com"
export no_proxy =".svc,.default,.local,.cluster.local,localhost,127.0.0.0/8,10.1.16.0/24,10.240.0.0/16,10.241.0.0/16,.domain.com"
导出 NO_PROXY= $no_proxy
我在 CentOS7 上使用 Kubernetes v1.11.2 + Docker v1.13.1;
任何帮助,将不胜感激。
解决方案
我们可以做一个合理的假设,我们不直接使用IP地址访问外部网络服务器。换句话说,我们使用 FQDN 访问,比如 python.com、google.com、github.com,但不直接使用它们的 IP 地址。
有了这个假设,我们可以绕过所有直接 IP 地址访问的网络代理。
export no_proxy=localhost,.svc
printf -v allip '%s,' .{0..255}
export no_proxy="$no_proxy,${allip%,}"
这增加.0,.1,.2,...,.255
了 no_proxy 环境变量。这里没有魔法。我们只是将 IP 地址视为 FQDN,因此后缀匹配作为 FQDN no_proxy 设置。比如说,.120 将匹配所有 IP 地址 xxx122。
推荐阅读
- azure-devops-server-2019 - 谁更改了部署标签
- npgsql - 使用 Npgsql 和 EF Core 为 JSONB 列生成迁移时引发异常
- react-native - 更新类型阴影节点中的属性“numberOfLines”时出错:RCTText
- ios - 无法覆盖“UICollectionView”类型的可变属性“collectionView”?具有协变类型“GeminiCollectionView?”
- reactjs - React Bootstrap Dropdown 组件没有收到任何样式
- javascript - Rails,如果多个文本框为空,如何隐藏/显示按钮?
- ngrok - 如何将 ngrok 与主机文件一起使用 (laradock)
- java - 将无效 ID 传递给端点:如何处理这种情况?
- reactjs - 我在 Jest ReferenceError 中收到以下错误:未定义响应
- r - 计算几行并在 R 中创建一个新列