【问题标题】:How to set no_proxy in Kubernetes pods如何在 Kubernetes pod 中设置 no_proxy
【发布时间】:2019-02-16 20:02:40
【问题描述】:

因为我的 Kubernetes Cluster 在企业代理后面,所以我需要通过环境变量在 Pod 中设置 http/https 代理,并设置 no_proxy 以允许 Pod 间和服务间通信以及与其他本地私有服务器的通信。

代理 http/https 配置在通过 env 变量传递到 pod 时完美运行;但是 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 内有环境变量:

导出 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;
任何帮助,将不胜感激。

【问题讨论】:

  • 能否添加您的 pod、服务和本地网络范围?
  • 我的网络范围如下(已经在 no_proxy 中尝试过):Nodes 10.1.16.0/24、Pods 10.240.0.0/16 和 Service 10.241.0.0/16
  • 您使用的是哪个 CNI?按照article 中的说明在 Calico 中进行设置似乎存在问题(这也可能对您的问题有所帮助)
  • 我确实在使用 Calico,它比 Weave 和 Flannel 效果更好。事实上,我无法使用自定义 pod/service 网络子网设置我的 Kubernetes 集群,也无法在没有 Calico 的情况下使用 Ingress。但是查看您发送的链接,它似乎与 Pod 内的 Proxy 配置无关,而是谈论 Kubernetes 节点级别的 Proxy 配置和设置环境。

标签: docker kubernetes


【解决方案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 地址 x.x.x.122。

【讨论】:

    【解决方案2】:

    我仔细研究了这个案例,发现问题出在环境变量上。 no_proxy 变量不支持网络范围。

    因此,理论上,您可以使用一些初始化脚本来排除所需的网络。但是,这将非常棘手,因为可能有很多地址要放在那里。
    不幸的是,我对网络没有那么丰富的经验,所以我无法为您提供更多关于如何解决这个问题的帮助。您可以找到有关代理的更多信息here。 在这种情况下,您可以阅读有关它的更多信息。 Set a network range in the no_proxy environment variable

    【讨论】:

      【解决方案3】:

      我在使用 OKD 时遇到了同样的问题,我解决了将以下 env 变量添加到 deployment.yaml

          spec:
            containers:
              - env:
                  - name: HTTP_PROXY
                  - name: HTTPS_PROXY
                  - name: http_proxy
                  - name: no_proxy
                  - name: https_proxy
      

      有些变量可能是多余的,但我没有时间测试。 希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        • 2021-12-06
        • 2017-09-10
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 2019-04-06
        相关资源
        最近更新 更多