gpt4 book ai didi

docker - 代理 kubernetes 通过代理 (CNTLM) 输出流量

转载 作者:行者123 更新时间:2023-12-04 15:23:49 24 4
gpt4 key购买 nike

我正在尝试通过在主机上运行的 CNTLM 代理所有传出的 kubernetes 流量。

一点上下文:目前我正在尝试在 VM 上设置一个 kubernetes 集群,以用作项目的快速部署解决方案。遗憾的是,所有不在公司网络中的出站流量都必须通过 NTLM 进行身份验证。在运行 kubernetes 集群的主机上,cntlm 服务器运行在端口 3128 上。

所以我想要实现的是来自 pod 的所有流量都重定向到主机:3128。我想到的是以下想法:

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

  • 机器设置:
  • SLE12 SP2
  • Kubernetes 通过 kubeadm (Tut: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/)
  • 网络插件:canal

  • Kubernetes 在网络中按预期工作,无需外部访问。

    谢谢你的帮助 :)

    更新:

    我已经尝试过像 Artem Golenyaev 提到的:
  • 编辑 docker 代理的东西以使用代理。 (重新加载 + 重启完成)
  • 编辑 .bashrc + 采购以应用代理-
  • .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 内的互联网连接时:
    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

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

    最佳答案

    您可以尝试使用称为“企业代理背后的 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/HTTPS proxy in Docker
  • Example of configuring Kubernetes behind the corporate proxy
  • 关于docker - 代理 kubernetes 通过代理 (CNTLM) 输出流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51855847/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com