1. 程式人生 > 實用技巧 >從harbor部署到在k8s中使用

從harbor部署到在k8s中使用

從harbor部署到在k8s中使用

一、概述

  harbor是什麼呢?英文單詞的意思是:港灣。港灣用來存放集裝箱(貨物的),而docker的由來正是借鑑了集裝箱的原理,所以harbor是用於存放docker的映象,作為映象倉庫使用。官方的說法是:Harbor是一個用於儲存和分發Docker映象的企業級Registry伺服器。

  harbor映象倉庫是由VMware開源的一款企業級映象倉庫,它包括許可權管理(RBAC)、LDAP、日誌稽核、管理介面、自我註冊、映象複製等諸多功能。

二、harbor安裝部署

1.安裝需求

資源 要求
CPU minimal 2 CPU
Mem minimal 4GB
Disk minimal 40GB
Python >=2.7
Docker engine >=1.10
Docker Compose >=1.6.0

2.安裝Docker、Docker-Compose

docker安裝

#軟體包安裝
yum install -y yum-utils  device-mapper-persistent-data lvm2
#新增yum源
yum-config-manager \
--add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
#檢視可安裝版本
yum list docker-ce --showduplicates | sort -r
#安裝最新穩定版本docker-ce
yum install docker-ce -y
#啟動docker
systemctl start docker
#檢視docker版本
docker version 

安裝docker-compose

#安裝pip

CentOS:
yum install epel-release -y
yum install python-pip -y

Ubuntu:
apt-get install python-pip -y

#安裝docker-compose
pip install docker-compose 

3.harbor離線安裝

  harbor提供線上安裝和離線安裝兩種方式,官方提供的安裝包地址在https://github.com/goharbor/harbor/releases,線上安裝包下載Harbor online installer,離線安裝下載Harbor offline installer,本教程使用離線方式安裝,這裡我使用最新版本v1.7.1。

解壓

tar zxvf harbor-offline-installer-v1.7.1.tgz

預設情況下解壓的目錄下會提供harbor.cfg配置檔案,修改地方:

hostname = 10.1.210.33   # 倉庫地址,主機IP或者域名
harbor_admin_password = Harbor12345   # 預設管理員密碼

一些其他常用引數:

#訪問協議,預設是http,也可以設定https,如果設定https
ui_url_protocol = http

#證書相關配置
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
secretkey_path = /data
admiral_url = NA

# 郵件配置,傳送重置密碼郵件時使用
email_identity = 
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false


# 認證方式,這裡支援多種認證方式,如LADP、資料庫認證,也可以在web控制檯修改
auth_mode = db_auth

# LDAP認證時配置
#ldap_url = ldaps://ldap.mydomain.com
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
#ldap_search_pwd = password
#ldap_basedn = ou=people,dc=mydomain,dc=com
#ldap_filter = (objectClass=person)
#ldap_uid = uid 
#ldap_scope = 3 
#ldap_timeout = 5

# 是否開啟自注冊
self_registration = on

# Token有效時間,預設30分鐘
token_expiration = 30

# 使用者建立專案許可權控制,預設是everyone(所有人),也可以設定為adminonly(只能管理員)
project_creation_restriction = everyone

#更多參考:https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

安裝:

[root@master harbor]# ./install.sh 

[Step 0]: checking installation environment ...

Note: docker version: 18.09.1
/usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.24.1) or chardet (2.2.1) doesn't match a supported version!
  RequestsDependencyWarning)

Note: docker-compose version: 1.23.2

檢視其安裝元件

[root@master harbor]# docker-compose ps

       Name                     Command                  State                                    Ports                              
-------------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver   /harbor/start.sh                 Up (healthy)                                                                   
harbor-core          /harbor/start.sh                 Up (healthy)                                                                   
harbor-db            /entrypoint.sh postgres          Up (healthy)   5432/tcp                                                        
harbor-jobservice    /harbor/start.sh                 Up                                                                             
harbor-log           /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp                                       
harbor-portal        nginx -g daemon off;             Up (healthy)   80/tcp                                                          
nginx                nginx -g daemon off;             Up (healthy)   0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
redis                docker-entrypoint.sh redis ...   Up             6379/tcp                                                        
registry             /entrypoint.sh /etc/regist ...   Up (healthy)   5000/tcp                                                        
registryctl          /harbor/start.sh                 Up (healthy)               

登陸hostname中修改的地址,即可登陸到harbor,如果你配置的是域名,請修改host檔案,預設登陸使用者名稱密碼是:admin/Harbor12345

4.Harbor的架構

  從安裝元件我們可以看出harbor主要依靠以下幾個元件:

  • Nginx(Proxy):用於代理Harbor的registry,UI, token等服務。
  • db:負責儲存使用者許可權、審計日誌、Dockerimage分組資訊等資料。
  • UI:提供圖形化介面,幫助使用者管理registry上的映象, 並對使用者進行授權。
  • jobsevice:負責映象複製工作的,他和registry通訊,從一個registry pull映象然後push到另一個registry,並記錄job_log。
  • Adminserver:是系統的配置管理中心附帶檢查儲存用量,ui和jobserver啟動時候回需要載入adminserver的配置。
  • Registry:原生的docker映象倉庫,負責儲存映象檔案。
  • Log:為了幫助監控Harbor執行,負責收集其他元件的log,記錄到syslog中。

三、上傳映象

配置docker信任倉庫地址

  docker1.3.2版本開始預設docker registry使用的是https,我們設定Harbor預設http方式,所以當執行用docker login、pull、push等命令操作非https的docker regsitry的都會報錯。

 vi /etc/docker/daemon.json 

#修改為
{"registry-mirrors": ["http://a58c8480.m.daocloud.io"],
"insecure-registries": ["10.1.210.33"]}


#重啟docker
systemctl restart docker

新建專案

  預設harbor只有一個公共的library專案,該專案的許可權和docker hub一樣不需要認證就可以拉取映象,所以在實際的使用需要有許可權認證的,這裡新建立專案project1:

上傳映象

上傳映象之前需要登陸認證,使用docker login

檢視本地映象:

docker images

給要推送的映象打tag(這裡一nginx映象為例子),可以使用docker tag --help檢視使用方式

docker tag nginx:latest 10.1.210.33/project1/nginx:latest

推送映象

docker push 10.1.210.33/project1/nginx:latest

到project1下會看到該映象,並且下載次數是0

四、在k8s中使用harbor倉庫

修改每個node上的docker認證倉庫

  將每個node節點上的docker同樣需要配置可信任倉庫

vi /etc/docker/daemon.json 

#修改為
{"registry-mirrors": ["http://a58c8480.m.daocloud.io"],
"insecure-registries": ["10.1.210.33"]}


#重啟docker
systemctl restart docker

建立認證secret

  由於harbor採用了使用者名稱密碼認證,所以在映象下載時需要配置sercet

#建立
kubectl create secret docker-registry registry-secret --namespace=default  \
--docker-server=10.1.210.33 \
--docker-username=admin \
--docker-password=Harbor12345 


#檢視secret
[root@master demo]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-gdwgn   kubernetes.io/service-account-token   3      2d18h
registry-secret       kubernetes.io/dockerconfigjson        1      116s

#刪除
kubectl delete secret registry-secret

部署示例

以一個部署一個nginx為例子,其中需要把containers中的images映象指定為harbor倉庫映象地址,並且使用建立的的secret。

# kubectl create -f nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels: 
    appname: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
        appname: nginx
  template:
    metadata:
      labels:
        appname: nginx
    spec:
      containers:
      - name: nginx
        image: 10.1.210.33/project1/nginx:latest  #映象地址
        ports:
          - containerPort: 80
      imagePullSecrets:        #使用的secret
       - name: registry-secret 

檢視pod

檢視pod映象拉去日誌,可發現使用的是harbor倉庫。

ref:

https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

https://blog.csdn.net/u010278923/article/details/77941995

https://kubernetes.io/docs/concepts/containers/images/