在DCOS中搭建私有DOCKER鏡像倉庫
在DCOS中管理和使用鏡像的方式有多種,各有優劣。但是,在DCOS集群內部維護一個私有容器倉庫仍然是值得推薦的。它有兩個主要優勢:
它僅限於你的DCOS集群範圍內,安全可控。
DCOS集群對容器鏡像依賴較重且鏡像文件都比較大,可以節省帶寬,減少鏡像拉取和推送的時間,加快部署速度。
私有容器倉庫的選擇
從容器倉庫的實現產品來講,當前支持容器倉庫的產品包括:
Docker Trusted Registry(Docker)
Registry(Docker)
Artifactory
Gitlab
Nexus3
從安全形度,因Docker守護程序默認強制要求倉庫處於可信的環境,在具體實踐時,根據環境的可信度,通常有三種方案:
可信證書頒發機構
自簽名證書
非安全
容器倉庫服務作為DCOS集群內部的一個服務,必須很容易的供內部訪問,同時也可能面臨來自部分集群外部的訪問(如推送部分外部基礎鏡像到容器倉庫)。在DCOS中,服務命名與發現策略有:
Mesos-DNS
Layer 4 Load Balancer
Marathon-LB
本方案的選擇充分結合DCOS集群的特性,採用Docker官方提供的Registry鏡像,自簽名證書和VIPs + Marathon-LB的方式。
主要搭建步驟
集群環境準備。
創建具有正確的公用名和主題備用名的自簽名證書。
使用證書的公鑰和私鑰配置Docker Registry服務。
在所有Agent節點上配置Docker守護程序以信任自簽名證書。
部署Docker Registry服務。
在集群內部使用容器倉庫。
在集群外部訪問容器倉庫。
集群環境準備
為便於後續命令可以同時在所有Agent節點上執行,可根據自己熟悉的方法構建一個運維節點到所有Agent節點之間的可信任的SSH連接。一種方法可參考SSHing into Nodes,也可以選擇在一台Master上配置公私鑰並將公鑰添加到所有Agent節點的authorized_keys列表中。
使用下述配置調整Layer 4負載均衡(放棄對TCP狀態的途中檢測),讓所有節點都能夠從Registry中拉取和推送鏡像。
for i in $(curl -sS master.mesos:5050/slaves | jq ".slaves[] | .hostname" | tr -d """); do ssh "$i" -oStrictHostKeyChecking=no "sudo sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1"; done
使用自簽名證書搭建私有容器倉庫
創建自簽名證書
確保創建自簽名證書的主機上安裝了OpenSSL(本例使用DCOS集群中的一個Master節點,OpenSSL位於/opt/mesosphere/packages/openssl--8042860cf76ca9ef965af9ee6d59acace266356e。
創建一個certs目錄:
注1:本例使用的VIP的名字為192.168.0.1:443
注2:除了直接使用VIP,還可以使用服務的Mesos-DNS名稱或引用第4層負載均衡VIP的名稱創建證書。
使用Mesos DNS:
使用引用VIP的主機名:
拷貝證書和私鑰到所有Agent節點
使用下述命令將證書和私鑰拷貝到集群所有Agent節點。注意,下述命令僅適用於從DCOS集群的Master節點中的當前Leader節點進行操作。
配置所有Agent節點上的Docker守護程序信任為私有容器倉庫創建的自簽名證書。
注1:上述命令重啟Docker引擎服務時會導致當前正在運行的容器服務重啟。 注2:對於Docker in Docker(DnD),可以將容器的/etc/docker/certs.d映射到Agent節點宿主機的相同路徑。
部署Registry到DCOS集群
將上述Marathon APP的JSON定義保存到一個JSON文件(如docker-registry.json),通過調用DCOS的WEB API或者通過DCOS CLI將服務部署到DCOS集群。
WEB API:
或CLI
dcos marathon app add docker-registry.json
在集群內部訪問容器倉庫
如果前述私有容器倉庫搭建過程中採用的是VIP模式,則在集群內部訪問容器倉庫時,需要使用VIP:「192.168.0.1」。
curl -k https://192.168.0.1/v2/_catalog
在Dockerfile中設置基礎鏡像時,也需要進行調整:
FROM 192.168.0.1/base/docker-tomcat-base
另外,除了前述提到的DnD需要映射主機的/etc/docker/certs.d
來使用私有容器的簽名證書外,對於一些由服務動態創建的容器也需要添加映射配置,如Jenkins動態創建的Slave容器主機。否則,可能會碰到類似x509: certificate signed by unknown authority
的異常。
注意,使用自簽名證書時,要在DC/OS集群內部訪問鏡像倉庫,因為Marathon使用CURL拉取鏡像,因此必須將自簽名證書附加到所有Agent節點的:
/opt/mesosphere/active/python-requests/lib/python3.5/site-packages/requests/cacert.pem
注意,解決UCR用CURL訪問採用自簽名證書的私有Registry的另一種方案是將簽名證書放置於:
/var/lib/dcos/pki/tls/certs
在集群外部訪問容器倉庫
因為DCOS集群內部使用VIP「192.168.0.1」來訪問容器倉庫,VIP「192.168.0.1」對集群外部環境來說是無法訪問的,那麼集群外部如何訪問該私有容器倉庫?
從集群外部訪問容器倉庫有兩種途徑。
第一種方案:注意到前述Registry的JSON定義中,我們為APP設置了值為5000的servicePort並且添加了HAPROXY_GROUP標籤,如果DCOS集群中在Public Agent節點上部署了Marathon-LB服務,則可以通過MLB訪問容器倉庫。
假設Public Agent節點的IP地址為192.168.1.50,則
curl -k https://192.168.1.50:5000/v2/_catalog
可以向倉庫推送容器鏡像:
docker push 192.168.1.50:5000/base/docker-tomcat-base
在Dockerfile中設置基礎鏡像時,同樣需要進行調整:
FROM 192.168.1.50:5000/base/docker-tomcat-base
第二種方案是為部署的Registry服務設置固定的hostPort(如5000),並固定到一個Agent節點(如:192.168.1.70)上,則可以用與MLB方案相同的方式訪問容器倉庫。
推薦使用MLB方案。
參考
https://dcos.io/docs/1.9/usage/tutorials/registry
TAG:領域修鍊之路 |
※如何在 Linux 中驗證 ISO 鏡像
※Win10 RS5預覽版ISO鏡像官方下載
※七牛雲CDN鏡像存儲加快圖片/CSS/JS文件訪問速度,支持申請免費SSL
※K8S 分散式構建 Docker 鏡像的一些小技巧
※如何創建定製的 Ubuntu Live CD 鏡像
※谷歌發布Android Q GSI鏡像:小米9/一加6T可刷
※Ubuntu 19.10鏡像將捆綁閉源NVIDIA驅動程序
※歐聯EUNEX鏡像交易解讀
※如何在 Ubuntu Linux 上使用 KVM 雲鏡像
※攻擊Windows PXE 啟動鏡像
※微軟向Slow通道推Win10新版本 ISO鏡像即將上線
※MySQL官方Docker鏡像的數據存儲問題
※Windows 10微軟官方ISO鏡像下載
※Docker 鏡像使用
※LCK春季賽歷史最差戰績出現 JAG戰績「鏡像」榜首GRF
※鏡像治療(Mirror Therapy),作為PT,你所應該知道的
※為JMeter用戶和測試者準備的六種Docker鏡像
※Windows 7(2019版)全補丁集成版鏡像ISO下載
※給Ocelot做一個Docker 鏡像
※10.18 VR掃描:HoloLens更新,增加屏幕鏡像功能;聯合國將舉辦AR展覽,展現饑荒地區現狀