從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 = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM