今天實現harbor 對鏡像的管理,參考的:https://www.cnblogs.com/wdliu/p/10250385.html
一、概述
harbor是什麼呢?英文單詞的意思是:港灣。港灣用來存放集裝箱(貨物的),而docker的由來正是借鑑了集裝箱的原理,所以harbor是用於存放docker的鏡像,作爲鏡像倉庫使用。官方的說法是:Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器。
harbor鏡像倉庫是由VMware開源的一款企業級鏡像倉庫,它包括權限管理(RBAC)、LDAP、日誌審覈、管理界面、自我註冊、鏡像複製等諸多功能。
二、harbor安裝部署
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 = 192.168.122.31
默認的 harbor_admin_password = Harbor12345
我安裝的時候,是harbor.cfg 文件中hostname 變了一下,其他的不用動,ldap 設置要變的話,安裝會不成功。下面看一下安裝的結果:
[root@test3 harbor]# ./install.sh
。。。。。
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registryctl ... done
Creating harbor-db ... done
Creating harbor-adminserver ... done
Creating redis ... done
Creating registry ... done
Creating harbor-core ... done
Creating harbor-portal ... done
Creating harbor-jobservice ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://192.168.122.1.
For more details, please visit https://github.com/goharbor/harbor .
[root@test3 harbor]# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Up (health: starting)
harbor-core /harbor/start.sh Up (health: starting)
harbor-db /entrypoint.sh postgres Up (health: starting) 5432/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up (health: starting) 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up (health: starting) 80/tcp
nginx nginx -g daemon off; Up (health: starting) 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 (health: starting) 5000/tcp
registryctl /harbor/start.sh Up (health: starting)
登陸hostname中修改的地址,即可登陸到harbor,如果你配置的是域名,請修改host文件,默認登陸用戶名密碼是:admin/Harbor12345
我是登入的安裝harbor 的地址: 192.168.122.31, 成功了,我的harbor.cfg 裏設置的地址是:192.168.122.1 ,具體原因我再來研究一下。
注意: 要是重起docker 引起 harbor 服務不能用,可以重起一下harbor:
docker-compose down
docker-compose up -d
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 login, 需要先去https://hub.docker.com/ 註冊一個id, 再登入: docker login: (這次實驗是登入到192.168.122.31),不一樣。
[root@test3 docker]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: shenghp
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
下面試登入到主機: 192.168.122.31:
[root@test3 docker]# docker login 192.168.122.31
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
查看本地鏡像:
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/