Прокси kubernetes исходящий трафик через Прокси (CNTLM)
Я пытаюсь проксировать весь исходящий трафик kubernetes через CNTLM, который работает на хосте.
Немного контекста: в настоящее время я пытаюсь настроить кластер kubernetes на виртуальной машине, чтобы использовать его в качестве решения для быстрого развертывания проектов. К сожалению, весь исходящий трафик, которого нет в корпоративной сети, должен проходить аутентификацию через NTLM. На хосте, где работает кластер kubernetes, сервер cntlm работает на порту 3128.
Так что я хочу добиться, чтобы весь трафик от модулей перенаправлялся на хост:3128. Я подумала о следующих идеях:
Модификация iptables хоста для перенаправления трафика. Это работало довольно хорошо для контейнеров на основе докера без kubernetes. (См. https://hub.docker.com/r/ncarlier/redsocks/). С контейнером вы можете определить свой прокси и, кроме того, белый список, который не следует применять для прокси. Это также возможно для kubernetes?
Другая идея заключается в том, чтобы запустить модуль, на который будет направляться весь трафик с других модулей. И этот модуль действует как прокси CNTLM. Не уверен, если это возможно.
Настройка машины:
- SLE12 SP2
- Кубернетес через kubeadm (Тут: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/)
- Сетевой аддон: канал
Kubernetes работает как положено в сети без внешнего доступа.
Спасибо за любую помощь:)
ОБНОВИТЬ:
То, что я уже пробовал, как упомянул Артем Голеняев:
- Редактирование в Docker Proxy для использования прокси. (перезагрузка + перезагрузка выполнена)
- Редактирование.bashrc + sourcing для применения прокси-
Содержание .bashrc
export http_proxy=http://d050alapi138:3128
export HTTP_PROXY=$http_proxy
export https_proxy=$http_proxy
export HTTPS_PROXY=$http_proxy
printf -v lan '%s,' 53.190.251.237
printf -v service '%s,' 10.96.0.{1..253}
printf -v pool '%s,' 192.168.0.{1..253}
export no_proxy="${lan%,},${service%,},${pool%,},127.0.0.1";
export NO_PROXY=$no_proxy
Содержание /etc/systemd/system/docker.service.d/http-proxy.conf
:
[Service]
Environment="HTTP_PROXY=http://d050alapi138:3128" "NO_PROXY=localhost,d050alapi138"
Содержание /etc/systemd/system/docker.service.d/https-proxy.conf
:
[Service]
Environment="HTTPS_PROXY=http://d050alapi138:3128" "NO_PROXY=localhost,d050alapi138"
Тестирование прокси работает в bash:
d050alapi138:~ # curl google.de
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.de/">here</A>.
</BODY></HTML>
Теперь скрипт для создания кластера:
kubeadm init --apiserver-advertise-address=53.190.251.237 --service-cidr=10.96.0.0/16 --pod-network-cidr=192.168.0.0/24
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
kubectl taint nodes --all node-role.kubernetes.io/master-
Узел запускается, и я могу развернуть ymls и т. Д., И когда я пытаюсь проверить интернет-соединение внутри модуля:
d050alapi138:~ # kubectl run my-shell2 --rm -i --tty --image ubuntu -- bash
If you don't see a command prompt, try pressing enter.
root@my-shell2-66df6fcdf4-4jhc8:/# apt-get update
0% [Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)] [Connecting to security.ubuntu.com (2001:67c:1560:8001::11)]^C
Не работает Во-первых, когда я вручную установил бы proxy envs внутри контейнера, он работает
root@my-shell2-66df6fcdf4-4jhc8:/# export http_proxy=http://d050alapi138:3128
root@my-shell2-66df6fcdf4-4jhc8:/# export https_proxy=$http_proxy
root@my-shell2-66df6fcdf4-4jhc8:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic/universe Sources [11.5 MB]
0% [3 InRelease gpgv 74.6 kB] [4 Sources 0 B/11.5 MB 0%] [Waiting for headers]^C
Может быть, это помогает понять мою проблему.
2 ответа
Вы можете попробовать использовать общее решение под названием "Kubernetes за корпоративным прокси".
Во-первых, вам нужно добавить настройки прокси-сервера в Docker на всех узлах, чтобы он мог загружать изображения. Создать или изменить /etc/systemd/system/docker.service.d/http-proxy.conf
файл со следующими строками (конечно, вам нужно изменить адреса, порты и сети в следующем примере):
Для HTTP прокси:
[Service] Environment="HTTP_PROXY=<http://proxy.example.com>:<proxy_port>/" "NO_PROXY=localhost,127.0.0.1,<docker-registry.somecorporation.com>"
Для HTTPS прокси
[Service] Environment="HTTPS_PROXY=<https://proxy.example.com>:<proxy_port>/" "NO_PROXY=localhost,127.0.0.1,<docker-registry.somecorporation.com>"
Затем вам нужно перезапустить демон Docker:
systemctl daemon-reload
systemctl restart docker
Во-вторых, вам нужно добавить настройки прокси на всех ваших узлах в .bashrc
для пересылки необходимого трафика с этих узлов на прокси. Вот пример:
export http_proxy=<http://proxy.example.com>:<proxy_port>/
export HTTP_PROXY=$http_proxy
export https_proxy=<https://proxy.example.com>:<proxy_port>/
export HTTPS_PROXY=$http_proxy
printf -v lan '%s,' localip_of_machine
printf -v pool '%s,' 192.168.0.{1..253}
printf -v service '%s,' 10.96.0.{1..253}
export no_proxy="${lan%,},${service%,},${pool%,},127.0.0.1";
export NO_PROXY=$no_proxy
Кроме того, вам нужно использовать свои собственные настройки для http_proxy, https_proxy и no_proxy.
Для получения дополнительной информации вы можете посетить следующие ссылки:
Установка прокси внутри
Что вам нужно для установки прокси внутри работающего контейнера. Как вы упомянули, после экспорта http-прокси внутри контейнера соединение работает.
Вам нужно создать внутренний домашний каталог, чтобы он автоматически экспортировал http-прокси внутри контейнера.
~/.docker/config.json
{
"proxies": {
"default": {
"httpProxy": "<http://proxy.example.com>:<proxy_port>",
"httpsProxy": "<https://proxy.example.com>:<proxy_port>",
"noProxy": "${lan%,},${service%,},${pool%,},127.0.0.1"
}
}
}