代理服务器kubernetes通过代理服务器(CNTLM)传出流量

nr9pn0ug  于 2022-11-28  发布在  Kubernetes
关注(0)|答案(2)|浏览(294)

我正在尝试通过运行在主机上的CNTLM代理所有传出的Kubernetes流量。
一点背景:目前,我正尝试在VM上设置一个kubernetes集群,以用作项目的快速部署解决方案。遗憾的是,所有不在企业网络中的出站流量都必须通过NTLM进行身份验证。在运行kubernetes集群的主机上,cntlm服务器运行在端口3128上。
因此,我想实现的是将所有来自pod的流量重定向到host:3128。我想到的是以下想法:

  • 修改主机的iptables来重新路由流量。这对于基于docker的容器没有kubernetes的情况下效果很好。(参见https://hub.docker.com/r/ncarlier/redsocks/)。使用容器,您可以定义您的代理和一个不应用于代理的白名单。这也可以用于kubernetes吗?
  • 另一个想法是启动一个pod,所有来自其他pod的流量都将被路由到这个pod。这个pod充当CNTLM代理。不确定这是否可行。

机器设置:

Kubernetes在没有外部访问的网络中按预期工作。
感谢您的帮助:)
最新消息:
我已经尝试过的像阿尔特姆Golenyaev提到的:

  • 在Docker代理中编辑使用代理的内容。(重新加载+重新启动完成)
  • 编辑.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等,当我尝试测试pod内的Internet连接时:

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

它不起作用。首先,当我手动设置容器内的代理环境时,它起作用

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

也许这有助于理解我的问题。

c0vxltue

c0vxltue1#

您可以尝试使用名为“企业代理背后的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设置。
有关详细信息,请访问以下链接:

ubby3x7f

ubby3x7f2#

/etc/systemd/system/docker.service.d/http-proxy.conf内的代理设置是Docker的代理设置。
你需要在运行的container中设置代理。正如你提到的,在你导出container中的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"
                }
        }
}

相关问题