天天看點

企業級|Harbor鏡像倉庫合體Nutanix超融合

本文所指的”合體”是從技術層面将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應用自身可通過多執行個體共享存儲的方式實作高可用部署。

企業級|Harbor鏡像倉庫合體Nutanix超融合

基礎架構高可用

Nutanix的AHV虛拟化平台HA功能可實作VM層面的高可用。

企業級|Harbor鏡像倉庫合體Nutanix超融合

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      
企業級|Harbor鏡像倉庫合體Nutanix超融合

可以從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個重要元件來工作,如下圖:

企業級|Harbor鏡像倉庫合體Nutanix超融合

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是否建立成功

企業級|Harbor鏡像倉庫合體Nutanix超融合

可以看到我們之前定義的harborreg(registry),harborjob(jobservice)和harbordb(mysql)三個外部的volume已自動建立成功。這意味着三個核心服務的資料将存放到Nutanix ABS的存儲池中,進而實作了關鍵資料的持久化。

UI通路測試

通路Harbor的Web UI,本例為https://reg.docanix.com

企業級|Harbor鏡像倉庫合體Nutanix超融合

UI登入測試

嘗試登入到Harbor UI,預設使用者名和密碼為admin/Harbor12345

企業級|Harbor鏡像倉庫合體Nutanix超融合

UI倉庫清單

Harbor在部署完成後會自動建立一個名為library的鏡像倉庫,Harbor裡的命名為Project

企業級|Harbor鏡像倉庫合體Nutanix超融合

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中存在

企業級|Harbor鏡像倉庫合體Nutanix超融合

鏡像拉取測試

以拉取之前所推送的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超融合