docker - 代理背后的 Kubernetes Docker 容器

标签 docker proxy kubernetes kubernetes-pod

我们确实在代理后面部署了 Kubernetes 集群,并成功配置了 docker 守护程序以使用我们的代理来拉取图像,如下页所述:https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

我们确实配置了 Docker 客户端来设置环境参数“https_proxy”、“http_proxy”和“no_proxy”,如下页定义:https://docs.docker.com/network/proxy/#configure-the-docker-client

Kubernetes 集群设置如下:

aadigital1:~ # kubectl get node
NAME         STATUS    ROLES         AGE       VERSION
aadigital1   Ready     master,node   9d        v1.10.4
aadigital2   Ready     node          9d        v1.10.4
aadigital3   Ready     node          9d        v1.10.4
aadigital4   Ready     node          9d        v1.10.4
aadigital5   Ready     node          9d        v1.10.4

Docker 容器手动运行 - ENV 参数设置正确

手动部署的 docker 容器的环境参数设置为:
aadigital1:~ # docker run -i -t odise/busybox-curl ash
/ # printenv
HTTPS_PROXY=http://ssnproxy.ssn.xxx.com:80/
no_proxy=localhost,127.0.0.0,127.0.1.1,127.0.1.1,local.home,80.250.142.64,80.250.142.65,80.250.142.66,80.250.142.69,80.250.142.70,80.250.142.71,aadigital1.aan.xxx.com,aadigita2.ssn.xxx.com,aadigital3.ssn.xxx.com,aadigital4.ssn.xxx.com,aadigita5.ssn.xxx.com,aadigital6.ssn.xxx.com
HOSTNAME=0360a9dcd20b
SHLVL=1
HOME=/root
NO_PROXY=localhost,127.0.0.0,127.0.1.1,127.0.1.1,local.home,80.250.142.64,80.250.142.65,80.250.142.66,80.250.142.69,80.250.142.70,80.250.142.71,aadigital1.aan.xxx.com,aadigita2.ssn.xxx.com,aadigital3.ssn.xxx.com,aadigital4.ssn.xxx.com,aadigita5.ssn.xxx.com,aadigital6.ssn.xxx.com
https_proxy=http://ssnproxy.ssn.xxx.com:80/
http_proxy=http://ssnproxy.ssn.xxx.com:80/
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
HTTP_PROXY=http://ssnproxy.ssn.xxx.com:80/

Kubernetes POD - 未设置 ENV 参数

上面用作 Kubernetes POD 的同一个 docker 镜像没有代理环境参数(同一台机器 aadigital1):
aadigital1:~ # kubectl get pod -o wide
NAME                       READY     STATUS    RESTARTS   AGE       IP          NODE
busybox-6d4df8f8b7-m62m2   1/1       Running   3          2d        10.0.0.16   aadigital3
busybox-curl               1/1       Running   0          16m       10.0.1.59   aadigital1
busybox-dns                1/1       Running   9          6h        10.0.1.53   aadigital1
aadigital1:~ # kubectl exec -it busybox-curl -- ash
/ # printenv
KUBERNETES_PORT=tcp://10.0.128.1:443
NGINX_NODEPORT_PORT=tcp://10.0.204.167:80
KUBERNETES_SERVICE_PORT=443
NGINX_NODEPORT_SERVICE_PORT=80
HOSTNAME=busybox-curl
SHLVL=1
HOME=/root
NGINX_NODEPORT_PORT_80_TCP_ADDR=10.0.204.167
NGINX_NODEPORT_PORT_80_TCP_PORT=80
NGINX_NODEPORT_PORT_80_TCP_PROTO=tcp
TERM=xterm
NGINX_NODEPORT_PORT_80_TCP=tcp://10.0.204.167:80
KUBERNETES_PORT_443_TCP_ADDR=10.0.128.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.0.128.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.0.128.1
NGINX_NODEPORT_SERVICE_HOST=10.0.204.167

我们如何配置 Kubernetes/Docker 以便为 POD 正确设置代理环境参数?

非常感谢!

最佳答案

这种状态的原因是带有代理的环境变量是 docker 客户端的特性。 Docker 分为 2 部分:由 docker daemon 和 docker 客户端 CLI 在套接字上公开的 API,您可以使用它运行容器 docker run.... 以便该命令将命中 docker daemon API 制作“东西”。遗憾的是,Kubernetes 是另一个 API 客户端,这意味着 Kubernetes 不使用 docker 客户端来调度容器(Kubernetes 直接使用 SDK 访问 API),这就是为什么您看不到预期的环境变量的原因。

要解决该问题,我建议使用该代理值创建 ConfigMap,例如

apiVersion: v1
kind: ConfigMap
metadata:
  name: your-config-map-name
  labels:
    app: your-best-app
data:
  HTTPS_PROXY: http://ssnproxy.ssn.xxx.com:80/
  HTTP_PROXY: http://ssnproxy.ssn.xxx.com:80/

并将它们安装到部署中作为环境变量使用
envFrom:
  - configMapRef:
      name: your-config-map-name

关于docker - 代理背后的 Kubernetes Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52191439/

相关文章:

c++ - 在docker中编译不同内核的代码会受到什么影响?

powershell - 在 windowsservercore 中使用 powershell 挂载 ISO 镜像失败

python - 从本地机器(外部)提交在 Docker 内运行的 Python 脚本时出现问题

node.js - 让 Node.js 使用 http_proxy、https_proxy 和 no_proxy 环境变量

networking - 有没有办法将 ping (icmp) 数据包转换为 TCP 数据包?

web-applications - Node.js:可用/创建 Web 代理

kubernetes - 在 prometheus 中,所有目标服务器均显示为已关闭,并出现此错误 : dial tcp 10. 7.17.11:9100: getsockopt: 连接超时

Docker for Windows - 无法列出节点 : Get https://kubernetes. docker.internal:6443/api/v1/nodes: Forbidden

linux - 从不在 docker 容器和另一台机器中的其他应用程序调用或与一台机器上的 docker 容器通信

Kubernetes Nginx-Ingress oauth_proxy 如何将信息/ token 传递给服务