Контейнеры Kubernetes Docker за прокси

мы развернули кластер 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 установлены правильно

Параметры среды для контейнеров докеров, которые развертываются вручную, установлены, как определено:

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 - не заданы параметры ENV

Тот же образ докера, который использовался выше в качестве Kubernetes POD, не имеет параметров прокси-среды (тот же компьютер 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?

Большое спасибо!


person mbecker    schedule 05.09.2018    source источник


Ответы (1)


Причина такого состояния в том, что переменные окружения с прокси являются функцией докер-клиента. Docker разделен на 2 части: API, предоставляемый в сокете демоном докера, и интерфейс командной строки клиента докера, с помощью которого вы можете запустить контейнер docker run .... так что эта команда попадет в API демона докера, создавая «что-то». К сожалению, Kubernetes - еще один клиент API, что означает, что Kubernetes не использует клиент докера для планирования контейнера (Kubernetes получает доступ к API напрямую с помощью SDK), поэтому вы не видите ожидаемых переменных среды.

Чтобы обойти эту проблему, я бы предложил создать 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
person Jakub Bujny    schedule 05.09.2018