本文所指的”合體”是從技術層面将Nutanix超融合基礎架構和Harbor開源鏡像倉庫基于企業級需求進行的一次部署實踐,旨在開源熱潮中抛磚引玉似的分享一些新的嘗試。
企業級
标題中提到的企業級這個詞,并非誇大其詞博人眼球,而是Nutanix和Harbor都是這麼說的…
Nutanix:實作隐形資料中心基礎架構的企業級雲計算公司。
The enterprise cloud company making datacenter infrastructure invisible.
注:Nutanix雖為企業提供商業化的服務,但是也很良心的釋出了NCE(Nutanix Community Edition)社群版,同步商業版的主要功能且可免費長期使用,本文中的實踐環境就是基于該版本。
參考:next.nutanix.com
Harbor:存儲和分發Docker鏡像的企業級注冊服務。
An enterprise-class registry server that stores and distributes Docker images.
注:Harbor是由VMware中國研發團隊負責開發的開源Docker容器鏡像倉庫,可幫助使用者迅速搭建Registry服務。
參考:https://github.com/vmware/harbor
說到企業級,也談一下個人淺薄的認識,也算是為此篇文章交代一下背景。
個人對企業級(特别是傳統企業IT)需求的了解,離不開三點:安全、穩定和高效。這三點在企業級IT的需求中都有着舉足輕重的地位,且相對而言的優先級是從前到後依次遞減的。安全永遠排在企業級IT需求的第一位,其次是穩定,然後是高效。
對于本次實踐中,企業級需求的實作如下:
安全層面
應用安全
Harbor作為最後傳遞的應用/服務,使用如下方式比對安全層面的考量:
- 使用SSL協定在傳輸層對網絡連接配接進行加密,實作應用通路的安全及資料的完整。
- 自有的管理者、開發者和訪客三種角色,對鏡像倉庫的通路實行嚴格的控制。
資料安全
Nutanix作為底層的基礎架構,使用如下方式比對安全層面的考量:
- 利用Nutanix ACS的Volume Plugin功能,将容器中的關鍵資料存放到ABS提供的存儲池中,進而實作資料的持久化。
穩定層面
應用高可用
Harbor應用自身可通過多執行個體共享存儲的方式實作高可用部署。
基礎架構高可用
Nutanix的AHV虛拟化平台HA功能可實作VM層面的高可用。
PS:以上功能因環境受限(單節點),在後續的内容中沒有示範。
高效層面
Harbor應用自身以容器的形式運作在Docker主控端上,整個環境的部署基于Docker Compose來完成。在對配置檔案進行定制化的修改後,可以使用一條簡單的指令直接完成Harbor應用的部署和啟動。
Nutanix ACS的Docker Machine Driver可實作标準化Docker主控端的快速部署。同樣也是使用一條簡單的指令即可在自身的虛拟化平台或者雲環境中生成一台Docker主控端。
前戲略長,下面我們基于以上描述的功能在Nutanix的超融合環境中高效的部署出一套安全的Harbor容器鏡像倉庫服務。
環境準備
Docker Host
使用Nutanix Docker Machine Driver生成一台Docker主控端
[[email protected]-machine ~]# docker-machine -D create -d nutanix \
--nutanix-username admin \
--nutanix-password Admin4NCE \
--nutanix-endpoint 192.168.2.21:9440 \
--nutanix-vm-image docker \
--nutanix-vm-network Bridge \
--nutanix-vm-cores 1 \
--nutanix-vm-mem 2048 \
reg.docanix.com
可以從Nutanix Prism控制台中可看到名為reg.docanix.com的虛拟機已建立成功并啟動。
Docker Engine
在Docker Host生成的同時會自動安裝Docker釋出的最新穩定版Engine
[[email protected] ~]# docker version
Client:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built:
OS/Arch: linux/amd64
Server:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built:
OS/Arch: linux/amd64
Docker Engine 1.12.1已成功安裝并運作。
Docker Compose
安裝Harbor部署所需要的Docker Compose
[[email protected] ~]# curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
[[email protected] ~]# chmod +x /usr/local/bin/docker-compose
[[email protected] ~]# docker-compose -v
docker-compose version 1.8.0, build f3628c7
Docker Compose的版本為1.8.0
Python
安裝Harbor部署所需要的Python 2.7或更高版本(預設已安裝)
[[email protected] ~]# python --version
Python 2.7.5
Harbor Repo
從Github擷取安裝Harbor所需要的檔案
[[email protected] ~]# git clone https://github.com/vmware/harbor
Cloning into 'harbor'...
remote: Counting objects: 11888, done.
remote: Total 11888 (delta 0), reused 0 (delta 0), pack-reused 11888
Receiving objects: 100% (11888/11888), 9.04 MiB | 24.00 KiB/s, done.
Resolving deltas: 100% (7514/7514), done.
[[email protected] harbor]# pwd
/root/harbor
[[email protected] harbor]# ls -l
total 144
drwxr-xr-x. 3 root root 4096 Aug 26 02:27 api
drwxr-xr-x. 4 root root 49 Aug 26 02:27 auth
-rw-r--r--. 1 root root 1034 Aug 26 02:27 AUTHORS
drwxr-xr-x. 4 root root 4096 Aug 26 02:27 contrib
drwxr-xr-x. 2 root root 4096 Aug 26 02:27 controllers
drwxr-xr-x. 2 root root 4096 Aug 26 02:27 dao
drwxr-xr-x. 10 root root 4096 Sep 8 02:07 Deploy
drwxr-xr-x. 3 root root 4096 Aug 26 02:27 docs
-rw-r--r--. 1 root root 7455 Aug 26 02:27 favicon.ico
drwxr-xr-x. 5 root root 4096 Aug 26 02:27 job
drwxr-xr-x. 2 root root 36 Aug 26 02:27 jobservice
-rw-r--r--. 1 root root 74372 Aug 26 02:27 LICENSE
drwxr-xr-x. 3 root root 4096 Aug 26 02:27 migration
drwxr-xr-x. 2 root root 4096 Aug 26 02:27 models
-rw-r--r--. 1 root root 501 Aug 26 02:27 NOTICE
-rw-r--r--. 1 root root 5530 Aug 26 02:27 README.md
-rw-r--r--. 1 root root 2347 Aug 26 02:27 ROADMAP.md
drwxr-xr-x. 5 root root 64 Aug 26 02:27 service
drwxr-xr-x. 5 root root 85 Aug 26 02:27 static
drwxr-xr-x. 3 root root 103 Aug 26 02:27 tests
drwxr-xr-x. 2 root root 36 Aug 26 02:27 ui
drwxr-xr-x. 4 root root 77 Aug 26 02:27 utils
drwxr-xr-x. 4 root root 58 Aug 26 02:27 vendor
drwxr-xr-x. 3 root root 4096 Aug 26 02:27 views
本文中harbor的路徑為/root/harbor,compose和相關配置檔案的路徑為/root/harbor/Deploy
Docker Images
拉取Harbor所需要的Docker基礎鏡像
[[email protected] ~]# docker images
REPOSITORY TAG SIZE
mysql 5.6 328.8 MB
ubuntu 14.04 187.9 MB
registry 2.5.0 33.28 MB
golang 1.6.2 753.5 MB
nginx 1.9 182.7 MB
PS:因在國内經常遇到網絡抽風的問題,個人推薦使用業界良心的DaoCloud加速器來拉取鏡像。
https://www.daocloud.io/mirror.html
附:Harbor架構簡單介紹
Harbor的應用基于6個重要元件來工作,如下圖:
Proxy——Harbor的registry, UI, token等服務,通過一個前置的反向代理統一接收浏覽器、Docker用戶端的請求,并将請求轉發給後端不同的服務。
運作容器proxy: 由Nginx伺服器構成的反向代理。
基礎鏡像: library/nginx:1.9
Registry——負責儲存Docker鏡像,并處理docker push/pull 指令。由于我們要對使用者進行通路控制,即不同使用者對Docker image有不同的讀寫權限,Registry會指向一個token服務,強制使用者的每次docker pull/push請求都要攜帶一個合法的token,Registry會通過公鑰對token進行解密驗證。
運作容器registry: 由Docker官方的開源registry鏡像構成的容器執行個體
基礎鏡像: library/registry:2.5.0
Core services——這是Harbor的核心功能,主要提供以下服務:
UI:提供圖形化界面,幫助使用者管理registry上的鏡像(image), 并對使用者進行授權。
webhook:為了及時擷取registry上image狀态變化的情況,在Registry上配置webhook,把狀态變化傳遞給UI子產品。
token服務:負責根據使用者權限給每個push/pull請求簽發token。Docker用戶端向Registry服務發起的請求,如果不包含token,會被重定向到這裡,獲得token後再重新向Registry進行請求。
運作容器ui: 即架構中的core services, 構成此容器的代碼是Harbor項目的主體。
基礎鏡像: library/golang:1.6.2
Database——為coreservices提供資料庫服務,負責儲存使用者權限、審計日志、Docker image分組資訊等資料。
運作容器mysql: 由官方MySql鏡像構成的資料庫容器。
基礎鏡像: library/mysql:5.6
Job Services——提供鏡像遠端複制功能,可以把本地鏡像同步到其他Harbor執行個體中。
運作容器job services: 通過狀态機機制實作遠端鏡像複制功能,包括鏡像删除也可以同步到遠端Harbor執行個體。
基礎鏡像: library/golang:1.6.2
Log collector——為了幫助監控Harbor運作,負責收集其他元件的log,供日後進行分析。
運作容器log: 運作着rsyslogd的容器,通過log-driver的形式收集其他容器的日志。
基礎鏡像: library/ubuntu:14.04
配置準備
Volume Plugin
激活Nutanix Volume Plugin
[[email protected] ~]# ./start-volume-plugin.sh
Starting Nutanix volume plugin container...
...
Enter prism ip address: 192.168.2.21
Enter Dataservices ip address: 192.168.2.23
Enter prism username: admin
Enter prism password:
Enter nutanix container where you want persistent volumes: docker_vol01
...
84d093518ac075416c8c05a81877bf437f633844139fdd2a1b4e870650074b5b
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84d093518ac0 orionapps/vol-plugin "/code/scripts/docker" 4 minutes ago Up 4 minutes NutanixVolumePlugin
NutanixVolumePlugin作為一個容器運作在Docker主控端。在應用相關的容器需要使用Nutanix提供外接Volume的時候則會調用該容器并在Nutanix的ABS存儲池中建立需要的Volume。
SSL證書
生成自簽發的SSL證書
[[email protected] ~]# openssl req \
> -newkey rsa:4096 -nodes -sha256 -keyout ca.key \
> -x509 -days 365 -out ca.crt
Generating a 4096 bit RSA private key
...
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Hubei
Locality Name (eg, city) [Default City]:Wuhan
Organization Name (eg, company) [Default Company Ltd]:Docanix
Organizational Unit Name (eg, section) []:DevOps
Common Name (eg, your name or your server's hostname) []:reg.docanix.com
Email Address []:[email protected]
[[email protected] ~]# ls -l
total 16
-rw-r--r--. 1 root root 2114 Aug 26 03:26 ca.crt
-rw-r--r--. 1 root root 3272 Aug 26 03:26 ca.key
證書相關資訊按需填寫,需要注意server’s hostname
Harbor配置
激活SSL
激活Harbor的SSL功能
[[email protected] Deploy]# pwd
/root/harbor/Deploy
[[email protected] Deploy]# vi harbor.cfg
hostname = reg.docanix.com
ui_url_protocol = https
激活Proxy的SSL功能
[[email protected] cert]# pwd
/root/harbor/Deploy/config/nginx/cert
[[email protected] cert]# cp ~/ca.crt ~/ca.key .
[[email protected] cert]# ls
ca.crt ca.key
(以上為拷貝證書到nginx的證書目錄)
[[email protected] nginx]# pwd
/root/harbor/Deploy/config/nginx
[[email protected] nginx]# ls
cert nginx.conf nginx.https.conf
[[email protected] nginx]# mv nginx.conf nginx.conf.bak
[[email protected] nginx]# cp nginx.https.conf nginx.conf
[[email protected] nginx]# ls
cert nginx.conf nginx.conf.bak nginx.https.conf
(以上為備份并生成nginx配置檔案)
[[email protected] nginx]# vi nginx.conf
server {
listen 443 ssl;
server_name reg.docanix.com;
# SSL
ssl_certificate /etc/nginx/cert/ca.crt;
ssl_certificate_key /etc/nginx/cert/ca.key;
server {
listen 80;
server_name reg.docanix.com;
rewrite ^/(.*) https://$server_name:443/$1 permanent;
nginx的配置檔案中需要修改server_name和ssl_certificate相關的參數
為Docker用戶端配置證書
(本例Docker用戶端和Harbor服務端為同一台Docker主控端)
[[email protected] ~]# mkdir /etc/docker/certs.d/reg.docanix.com
[[email protected] ~]# cp ~/ca.crt /etc/docker/certs.d/reg.docanix.com
[[email protected] reg.docanix.com]# pwd
/etc/docker/certs.d/reg.docanix.com
[[email protected] reg.docanix.com]# ls
ca.crt
如果不配置證書則在登入Harbor Registry的時候會出現如下報錯:
Error response from daemon: Get https://reg.docanix.com/v1/users/: x509: certificate signed by unknown authority
配置證書後就不需要在Docker Daemon裡面添加insecure-registry參數了。
修改Compose檔案
Harbor的Compose檔案為v2版本,預設會将核心服務的資料放到本地,我們需要将資料放到Nutanix提供的存儲池中。
[[email protected] Deploy]# pwd
/root/harbor/Deploy
[[email protected] Deploy]# vi docker-compose.yml
registry:
volumes:
- harborreg:/storage
mysql:
volumes:
- harbordb:/var/lib/mysql
jobservice:
volumes:
- harborjob:/var/log/jobs
(以上為registry、mysql和jobservice三個核心容器需要挂載的harborreg、harbordb和harborjob三個外部卷)
volumes:
harbordb:
driver: nutanix
harborreg:
driver: nutanix
harborjob:
driver: nutanix
(以上為volumes聲明,指定driver為nutanix來實作voulume在Nutanix ABS存儲池上的建立)
注: 由于Compose v2在啟動的時候會預設在每個對象(容器、網絡、資料卷等)前面打上一個以目前執行路徑命名的字首,而且該字首後面還會加上”_”符号(本例為”deploy_”),但是NutanixVolumePlugin建立的iSCSI目标端不識别”_”這類字元。
本人也暫時沒有找到指定外部的Volume不加這個字首的辦法,是以将docker-compose.yml用v1的文法重寫了一遍。
[[email protected] Deploy]# vi docker-compose.yml
jobservice:
volume_driver: nutanix
volumes:
- harborjob:/var/log/jobs
- /root/harbor/Deploy/config/jobservice/app.conf:/etc/jobservice/app.conf
mysql:
volume_driver: nutanix
volumes:
- harbordb:/var/lib/mysql
registry:
volume_driver: nutanix
volumes:
- harborreg:/storage
- /root/harbor/Deploy/config/registry/:/etc/registry/
以上僅截取了volume相關的内容,需要注意的是本地檔案系統的目錄或者檔案需要以絕對路徑的形式挂載。
配置準備
完成部署準備
綁定安裝Harbor需要的環境變量配置
[[email protected] Deploy]# ./prepare
Generated configuration file: ./config/ui/env
Generated configuration file: ./config/ui/app.conf
Generated configuration file: ./config/registry/config.yml
Generated configuration file: ./config/db/env
Generated configuration file: ./config/jobservice/env
Clearing the configuration file: ./config/ui/private_key.pem
Clearing the configuration file: ./config/registry/root.crt
Generated configuration file: ./config/ui/private_key.pem
Generated configuration file: ./config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
啟動Harbor
基于編輯完成的compose yml檔案直接啟動Harbor
[[email protected] Deploy]# docker-compose up -d
Creating deploy_log_1
Creating deploy_mysql_1
Creating deploy_ui_1
Creating deploy_registry_1
Creating deploy_jobservice_1
Creating deploy_proxy_1
(第一次啟動會build鏡像,時間上面會略微長一點)
[[email protected] Deploy]# docker ps
CONTAINER ID IMAGE NAMES
7a4b29047c27 library/nginx:1.9 deploy_proxy_1
14baedbd5e94 deploy_jobservice:latest deploy_jobservice_1
08924e20090f library/registry:2.5.0 deploy_registry_1
3c184808a93f deploy_ui:latest deploy_ui_1
4b3825bf1935 deploy_mysql:latest deploy_mysql_1
82c6a21afeed deploy_log:latest deploy_log_1
可以看到前面提到Harbor服務需要的6個容器已經成功啟動(為友善觀看僅截取了部分輸出)
功能測試
Volume驗證
檢視定義的Nutanix Volume是否建立成功
可以看到我們之前定義的harborreg(registry),harborjob(jobservice)和harbordb(mysql)三個外部的volume已自動建立成功。這意味着三個核心服務的資料将存放到Nutanix ABS的存儲池中,進而實作了關鍵資料的持久化。
UI通路測試
通路Harbor的Web UI,本例為https://reg.docanix.com
UI登入測試
嘗試登入到Harbor UI,預設使用者名和密碼為admin/Harbor12345
UI倉庫清單
Harbor在部署完成後會自動建立一個名為library的鏡像倉庫,Harbor裡的命名為Project
Registry登入測試
[[email protected] ~]# docker login reg.docanix.com
Username: admin
Password:
Login Succeeded
鏡像推送測試
以推送一個busybox鏡像為例
[[email protected] ~]# docker tag busybox:latest reg.docanix.com/library/busybox:1.0
[[email protected] ~]# docker images |grep busybox
reg.docanix.com/library/busybox 1.0 2b8fd9751c4c 10 weeks ago 1.093 MB
[[email protected] ~]# docker push reg.docanix.com/library/busybox:1.0
The push refers to a repository [reg.docanix.com/library/busybox]
8ac8bfaff55a: Pushed
latest: digest: sha256:1359608115b94599e5641638bac5aef1ddfaa79bb96057ebf41ebc8d33acf8a7 size: 527
通過UI可以看到busybox在推送成功後已在library中存在
鏡像拉取測試
以拉取之前所推送的busybox鏡像為例
[[email protected] ~]# docker rmi reg.docanix.com/library/busybox:1.0
Untagged: reg.docanix.com/library/busybox:latest
[[email protected] ~]# docker pull reg.docanix.com/library/busybox:1.0
latest: Pulling from library/busybox
Digest: sha256:1359608115b94599e5641638bac5aef1ddfaa79bb96057ebf41ebc8d33acf8a7
Status: Downloaded newer image for reg.docanix.com/library/busybox:latest
[[email protected] ~]# docker images |grep busybox
reg.docanix.com/library/busybox 1.0 2b8fd9751c4c 10 weeks ago 1.093 MB
删除後的busybox鏡像在經過再次拉取後已在本地存在
至此基于企業級IT需求在Nutanix超融合基礎架構部署Harbor開源Docker鏡像倉庫的一次簡單實踐已經完成。
本文:企業級|Harbor鏡像倉庫合體Nutanix超融合