在 kubernetes 中 docker 容器 运行 内没有互联网连接,编织作为网络

No internet connectivity inside docker container running inside kubernetes with weave as networking

我有一个 kubernetes 集群 运行 在 AWS EC2 实例上运行并编织为网络 (cni)。我禁用了 docker 网络(ipmask 和 iptables),因为它由 weave 管理(以避免网络冲突)。

我已经将我的 Jenkins 作为 K8s pod 部署在这个集群上,这个 jenkins 使用 jenkins kubernetes 插件根据我定义的 pod 和容器模板生成动态从站。这些从容器中有 docker 客户端,它通过 docker.sock 连接到主机 docker 引擎

因此,当我在 Jenkins 中 运行 任何作业时,它都会启动一个从站,并在此克隆一个 git 存储库并开始构建存储库中存在的 Dockerfile。

我的示例 docker 文件如下所示:

FROM abc:123
RUN yum update

因此,当容器开始构建它时,它会尝试连接到 redhat 存储库以更新本地存储库,但在这里失败了。为了调试,我登录到这个容器并尝试 wget/CURL 一些包,发现这个容器中没有互联网连接。

我怀疑在构建 docker 时会启动中间容器,而这些容器不受 weave 管理,因此它们没有互联网连接。

需要建议。

相关问题:

您可以尝试 attach weave networking dynamically 作为构建工作的一部分。是否可以用 weave 更改航班上容器的活动网络。

也许您需要使用一些额外的容器 Weave Docker Api Proxy 或者您可以使用不同的方式与节点上的 Weave 网络通信。

因此,主要思想是将您 运行 构建的容器附加到 Kubernetes pods 网络,您可以在其中进行外部访问。

此外,也许更好的是,您可以创建另一个可以访问 Internet 的 Weave 虚拟网络,并将您的竞争者附加到该网络。

你是对的 - docker build 进程在不同的上下文中运行,Weave Net 不会自动附加那些。

更复杂的是,Kubernetes 将通过 CNI 连接,而 Docker 有自己的插件 API。我相信可以同时在一台机器上安装两者,但相当复杂。

也许看看一些 ways to build images without using Docker ?

好吧,经过一番努力,我终于找到了解决方案。
因此,每当 K8s 启动一个 pod 时,它都会启动一个 sidecart 容器,其作用基本上是为 pod 容器提供网络。
因此,在 运行 docker 构建时,如果我将它的容器 ID 作为网络传递,那么我的中间上下文将开始通过此容器获得互联网连接。 所以变化看起来像这样:

docker build -t "some name" --network container:$(docker ps | grep $(hostname) | grep k8s_POD | cut -d\" \" -f1) -f infra/docker/Dockerfile .

希望这对您有所帮助。 :D