在Kubernetes中为容器配置HTTP代理

时间:2020-06-17 20:09:18

标签: docker kubernetes

我有一个Kubernetes v1.18.3集群,而工作人员有一个Docker v19.03.6 dameon。

我正在寻找一种自动将HTTP_PROXYHTTPS_PROXY注入Kubernetes创建的每个容器的方法。

我尝试创建一个~/.docker/config.json文件,但是没有用。

完成它的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

对您的情况感兴趣,甚至使用相同的docker和k8s版本进行复制... 使用官方Configure Docker to use a proxy server文档在~/.docker/config.json

中为docker设置代理

配置Docker客户端在Docker客户端上,创建或编辑 用户主目录中的文件〜/ .docker / config.json 启动容器。添加如下所示的JSON,替换为 必要时使用httpsProxy或ftpProxy的代理类型,以及 替换代理服务器的地址和端口。您可以 同时配置多个代理服务器。

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:3001",
     "httpsProxy": "http://127.0.0.1:3001",
     "noProxy": "*.test.example.com,.example2.com"
   }
 }
}

保存文件。 创建或启动新容器时,环境变量会在容器内自动设置。

我的配置是:

{
  "proxies": {
    "default": {
      "httpProxy": "http://user:pass@my.proxy.domain.com",
      "httpsProxy": "http://user:pass@my.proxy.domain.com"
    }
  }
}

因此,基本上在~/.docker/config.json中进行了上述设置之后,在启动全新容器时将自动使用代理服务器。

在我认为可行的情况下,我可以使用cli并创建例如busybox容器来进行验证。

$ docker container run --rm busybox env
HTTP_PROXY=http://user:pass@my.proxy.domain.com
http_proxy=http://user:pass@my.proxy.domain.com
HTTPS_PROXY=http://user:pass@my.proxy.domain.com
https_proxy=http://user:pass@my.proxy.domain.com
HOME=/root

请记住,下一部分应该有问题:

在Docker客户端上,在以下位置创建或编辑文件〜/ .docker / config.json 启动容器的用户的主目录

请谨慎使用USER,并确保您的HOME环境设置正确。

链接到github几乎类似的问题和解决方法:

1)https://github.com/kubernetes/kubernetes/issues/45487#issuecomment-312042754

我对此进行了深入研究,对我来说,问题是家庭 通过kubelet启动时,环境变量为空 系统单位。虽然没有以这种方式记录下来,但是 从/root/docker/config.json或/root/.dockercfg配置 要求HOME = / root

在[服务]声明中设置User = root为我修复了该问题。

2)https://github.com/kubernetes/kubernetes/issues/45487#issuecomment-378116386

3)https://github.com/kubernetes/kubernetes/issues/45487#issuecomment-464516064(部分信息)

(3) vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Add User=root
File looks kind of like this
[Service]
User=root
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
(4) Reload and restart kubelet

systemctl daemon-reload
systemctl restart kubelet

就我而言,从头开始一切正常。因此,请仔细阅读并检查我强调的要点。很有可能您的问题/类型非常小,因为它按预期工作。

希望我的调查对您有帮助

答案 1 :(得分:0)

这听起来正确且合乎逻辑,但对我不起作用。

我正在运行 kubernetes 版本“v1.18.6”。数据如下。这失败了。但是为 dockerd 设置与 Env 相同的 http-proxy 是有效的。

admin@str-s6000-acs-13:/etc/systemd/system/kubelet.service.d$ sudo cat /proc/$(pidof kubelet)/environ | tr '\0' '\n'      
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/root
LOGNAME=root
USER=root
SHELL=/bin/sh
INVOCATION_ID=fd58e75d7be64758b01e2d8d63fdf7f6
JOURNAL_STREAM=9:11737012
KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf
KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml
KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2
admin@str-s6000-acs-13:/etc/systemd/system/kubelet.service.d$ sudo cat /root/.docker/config.json
{
    "proxies":
    {
        "default":
        {
            "httpProxy": "http://20.72.201.152:3128",
            "httpsProxy": "http://20.72.201.152:3128"
        }
    }
}
admin@str-s6000-acs-13:/etc/systemd/system/kubelet.service.d$ 

Apr 12 01:14:49 str-s6000-acs-13 dockerd[27360]: time="2021-04-12T01:14:49.630282308Z" level=error msg="Handler for POST /images/create returned error: Get https://sonicanalytics.azurecr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"