一、概述
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仓库。