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

时间:2018-03-15 12:24:21

标签: docker jenkins kubernetes jenkins-plugins weave

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

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

因此,当我在Jenkins中运行任何作业时,它会启动一个奴隶,并在此基础上克隆一个git repo并开始构建repo中存在的Dockerfile。

我的示例dockerfile如下所示:

FROM abc:123
RUN yum update

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

我怀疑构建docker时会启动中间容器,而这些容器不能通过编织来管理,因此它们没有Internet连接。

需要建议。

相关问题:Internet connection inside Docker container in Kubernetes

3 个答案:

答案 0 :(得分:4)

好吧,经过多次努力,我找到了解决办法 因此,当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

答案 1 :(得分:1)

您可以尝试将attach weave networking dynamically作为构建作业的一部分。是否可以通过编织改变航班上的活动集装箱网络。

也许您需要使用Weave Docker Api Proxy的其他容器,或者您可以使用不同的方式与节点上的Weave网络进行通信。

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

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

答案 2 :(得分:0)

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

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

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