從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/