我有一个在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
答案 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。我相信可以在同一台机器上同时使用这两种机器,但相当复杂。