起因
- 在最開始學(xué)習(xí)openstack的過程中一直希望有更方便的openstack部署方法钟鸵,無論在單機(jī)測試還是生產(chǎn)環(huán)境
- 現(xiàn)在經(jīng)過openstack社區(qū)的蓬勃發(fā)展兢哭,出現(xiàn)了一系列openstack on k8s以及openstack on docker部署項(xiàng)目
- 然而無論是部署kubernetes(k8s.gcr.io)還是部署openstack(quay.io/docker.io)所需的鏡像都來自海外
- 此外在生產(chǎn)環(huán)境中集群化部署時(shí)每臺節(jié)點(diǎn)都需要拉取所需的鏡像聋亡,不過其中的絕大部分都是重復(fù)的
- 以及若要部署相同版本openstack的多個(gè)集群時(shí)汰蓉,也會(huì)涉及鏡像需要重新拉取耗時(shí)耗力的問題
- 因此本文的多鏡像倉庫緩存代理方案主要目的有以下三點(diǎn):
- 鏡像拉取加速
- 拉取同時(shí)緩存
- 同時(shí)可將緩存拷貝遷移重復(fù)使用
- 一站式支持多個(gè)常用的鏡像倉庫珊佣,如
- registry-1.docker.io
- k8s.gcr.io
- gcr.io
- quay.io
- 方案地址:https://github.com/ohmyadd/mirror
鏡像加速功能
- 不用我多說了
- 方案選擇上有兩個(gè)點(diǎn):
- 從哪來
- 其實(shí)就是配置在OUTPUT 還是 PREROUTING的問題
- 最后因?yàn)槿萜骶W(wǎng)絡(luò)的特殊性和方案簡潔性,選擇了OUTPUT惯退,所有容器共用同一個(gè)網(wǎng)絡(luò)namespace
- 怎么走:
- TCP可以走REDIRECT赌髓,但不能走TPROXY
- UDP可以走TUNNEL,也可以走TPROXY催跪,但不能走REDIRECT
- 最后綜合選擇了TCP(REDIRECT) + UDP(TUNNEL)
鏡像緩存功能
- 鏡像緩存功能由docker官網(wǎng)提供的registry鏡像提供
- 官網(wǎng)registry鏡像的使用和配置锁蠕,在docker官方文檔中都詳細(xì)介紹
- registry的配置文件就是一個(gè)yaml格式的文件,想要修改其配置有兩種方式
- 寫好整個(gè)yaml然后掛載進(jìn)容器
- 通過環(huán)境變量配置單個(gè)配置項(xiàng)懊蒸,如
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
配置如下代碼塊中的配置項(xiàng)- 可以看出規(guī)則是以REGITRY_開頭荣倾,后面配置項(xiàng)的路徑以
_
替換.
,并寫英文全部大寫
- 可以看出規(guī)則是以REGITRY_開頭荣倾,后面配置項(xiàng)的路徑以
storage:
filesystem:
rootdirectory: /var/lib/registry
- 有關(guān)鏡像緩存代理的配置非常簡單榛鼎,只有三項(xiàng):
-
remoteurl
: 想要代理的鏡像倉庫的地址逃呼,必填 -
username
password
:連接本代理使用的用戶名密碼鳖孤,可選 - 根據(jù)上面的配置項(xiàng)轉(zhuǎn)換規(guī)則者娱,只需要把目標(biāo)倉庫地址寫在REGISTRY_PROXY_REMOTEURL環(huán)境變量即可
-
多庫集成功能
- 方案中的鏡像緩存代理都沒有使用ssl,因此四個(gè)倉庫代理都會(huì)開在80端口
- 因此我們需要一個(gè)根據(jù)url路徑選擇反代對象的功能苏揣,這個(gè)是nginx本行
- 所以寫好一個(gè)nginx反代配置黄鳍,掛在進(jìn)官方nginx鏡像就好了
- 最后如果需要添加新的倉庫代理的話,記得在nginx.conf里面也添加相應(yīng)的配置
How-To說明
-
如何使用鏡像緩存代理
- 本節(jié)指當(dāng)鏡像代理啟動(dòng)好后平匈,內(nèi)網(wǎng)其他主機(jī)如何使用本機(jī)提供的服務(wù)
- 因此本節(jié)配置都是寫在其他使用本機(jī)服務(wù)的主機(jī)上
- docker官方倉庫:
- 內(nèi)容:
"registry-mirrors": ["http://10.122.1.164"]
- 路徑:
/etc/docker/daemon.json
- 內(nèi)容:
- 其他倉庫:
- 內(nèi)容:
"insecure-registries": ["k8s.gcr.io", "quay.io", "gcr.io"]
- 路徑:
/etc/docker/daemon.json
- 需要在集群DNS或本機(jī)hosts文件中把這三個(gè)域名指向緩存代理的IP地址
- 內(nèi)容:
- 記得把IP替換成你的IP
- 修改配置后需要重啟docker
- 最后daemon.json可以總結(jié)為
{"mtu": 1350, "registry-mirrors": ["http://10.122.1.164"], "insecure-registries": ["k8s.gcr.io", "quay.io", "gcr.io"]}
-
如何遷移鏡像的緩存
- 本文方案的所有registry的數(shù)據(jù)文件全部掛載在
/var/lib/registry
- 因此無論是備份還是復(fù)制遷移框沟,只需要操作
/var/lib/registry
,再啟動(dòng)新的compose增炭,就可以使用之前緩存好的鏡像文件了
- 本文方案的所有registry的數(shù)據(jù)文件全部掛載在
Finally
- docker-compose中的bridge類型network是可選的
- 之所以添加是因?yàn)槲覀兊讓泳W(wǎng)絡(luò)的mtu不是1500忍燥,而是由于底層是overlay的網(wǎng)絡(luò)而mtu減小的網(wǎng)絡(luò)
- 因此必須在容器網(wǎng)絡(luò)中配置mtu相應(yīng)的減小,不然傳輸大文件時(shí)會(huì)丟數(shù)據(jù)包
- 底層網(wǎng)絡(luò)是物理以太網(wǎng)絡(luò)時(shí)就不是必須修改mtu隙姿,但配置的小一點(diǎn)也沒有問題
- 如果要?jiǎng)h除這個(gè)network的話梅垄,記得把容器連接網(wǎng)絡(luò)的配置也刪掉
- 一個(gè)有意思的事情是
- 去年的時(shí)候(2019)quay.io還不支持v2版本的manifest
- 所以其他三個(gè)倉庫使用2.7版本的registry,而quay.io只能用2.3.0版本的
- 當(dāng)時(shí)被quay.io著實(shí)惡心了一下输玷,然而2.3.0版本是proxy功能 與 manifest v1功能的交集版本
- 所以又因?yàn)樽约红`機(jī)一動(dòng)找到了這個(gè)版本作為解決方式很開心哈哈
- 不過都已經(jīng)是過去時(shí)了队丝,現(xiàn)在(2020)quay.io已經(jīng)支持了manifest v2靡馁,只是在這里小小記錄一下
- 再次感謝開源世界