6

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

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

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

我的示例 dockerfile 如下所示:

FROM abc:123
RUN yum update

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

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

需要建议。

相关问题:Kubernetes 中 Docker 容器内的 Internet 连接

4

3 回答 3

11

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

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

希望这可以帮助。:D

于 2018-03-21T14:10:14.237 回答
1

作为构建工作的一部分,您可以尝试动态附加编织网络。是否可以通过编织更改航班上的活动容器网络。

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

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

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

于 2018-03-15T15:20:27.110 回答
0

你是对的 - 该docker build过程在不同的上下文中运行,并且 Weave Net 不会自动附加它们。

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

也许看看一些不使用 Docker 构建图像的方法

于 2018-03-15T16:17:12.640 回答