[英]No internet connectivity inside docker container running inside kubernetes with weave as networking
我有一個在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一些包,並發現此容器中沒有Internet連接。
我懷疑構建docker時會啟動中間容器,而這些容器不能通過編織來管理,因此它們沒有互聯網連接。
需要建議。
好吧,經過多次努力,我找到了解決方案。
因此,當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
您可以嘗試動態地附加編織網絡作為構建作業的一部分。 是否有可能通過編織改變航班上的活動集裝箱網絡。
也許您需要使用Weave Docker Api Proxy的一些額外容器,或者您可以使用不同的方式與節點上的Weave網絡進行通信。
因此,主要的想法是將運行構建的容器附加到Kubernetes pods網絡,在那里您可以進行外部訪問。
此外,也許它會更好,您可以創建另一個Weave虛擬網絡,可以訪問Internet並將您的競爭者附加到它。
你是對的 - docker build
過程在不同的上下文中運行,Weave Net不會自動附加它們。
更復雜的是,Kubernetes將通過CNI連接,而Docker擁有自己的插件API。 我相信可以同時在機器上同時使用,但相當復雜。
也許看看一些不使用Docker構建圖像的方法 ?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.