Kubernetes之Harbor仓库


Kuternetes 企业级 Docker 私有仓库 Harbor 工具

当然,我们这里也可以使用 Docker 官方提供的 registry 镜像!

$ docker run -d -p 5000:5000 --restart=always --name registry registry:2

Kuternetes私有仓库Harbor


1. Harbor 基本组件

企业级环境中基于 Harbor 搭建自己的安全认证仓库

Docker 容器应用的开发和运行离不开可靠的镜像管理,虽然 Docker 官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的 Registry 也是非常必要的。Harbor 是由 VMware 公司开源的企业级的 Docker Registry 管理项目,它包括权限管理(RBAC)、AD/LDAP集成、日志审核、管理界面、自我注册、镜像复制和中文支持等功能,在新版本中还添加了Helm仓库托管的支持。

Kuternetes私有仓库Harbor

Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。用于部署 HarborDocker Compose 模板位于 /Deployer/docker-compose.yml 中,其由 5 个容器组成,这几个容器通过 Docker link 的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露 Proxy(即Nginx) 的服务端口即可。

  • Proxy
    • Nginx服务器构成的反向代理
  • Registry
    • Docker官方的开源官方的开源Registry镜像构成的容器实例
  • UI
    • 即架构中的core services服务,构成此容器的代码是Harbor项目的主体
  • MySQL
    • 由官方MySQL镜像构成的数据库容器
  • Log
    • 运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志

2. Harbor 特性解释

主要介绍 Harbor 工具的特性和优点

Kuternetes私有仓库Harbor

  • [1] 基于角色控制
    • 用户和仓库都是基于项目进行组织的,而用户基于项目可以拥有不同的权限
  • [2] 基于镜像的复制策略
    • 镜像可以在多个Harbor实例之间进行复制实例之间进行复制
  • [3] 支持 LDAP
    • Harbor的用户授权可以使用已经存在LDAP用户
  • [4] 镜像删除&垃圾回收
    • Image可以被删除并且回收Image占用的空间
  • [5] 用户 UI
    • 用户可以轻松的浏览、搜索镜像仓库以及对项目进行管理
  • [6] 轻松的部署功能
    • Harbor提供了提供了online/offline/virtualappliance安装
  • [7] Harbor 和 docker registry 关系
    • Harbor实质上是对docker registry做了封装,扩展了自己的业务模块

3. Harbor 认证过程

认证过程是理解其精髓的核心知识点

Harbor 最核心的功能就是给 docker registry 添加上一层权限保护的功能,要实现这个功能,就需要我们在使用 docker loginpullpush 等命令的时候进行拦截,先进行一些权限相关的校验再进行操作,其实这一系列的操作 docker registry v2 就已经为我们提供了支持,v2 版本集成了一个安全认证的功能,将安全认证暴露给外部服务,让外部服务去实现。

Harbor整体架构

下述就是完整的授权过程,当用户完成下述过程以后便可以执行相关的pull/push操作,认证信息会每次都带在请求头中。

  • [a] docker daemondocker registry拉取镜像。
  • [b] 如果docker registry需要进行授权时,registry将会返回401响应,同时在响应中包含了docker client如何进行认证的信息。
  • [c] docker client根据registry返回的信息,向auth server发送请求获取认证token信息。
  • [d] auth server则根据自己的业务实现去验证提交的用户信息是否存符合业务要求。
  • [e] 用户数据仓库返回用户的相关信息。
  • [f] auth server将会根据查询的用户信息,生成token令牌,以及当前用户所具有的相关权限信息。
  • [g] docker client端接收到返回的200状态码说明操作成功,在控制台上打印Login Succeeded的信息。

整个登录过程

Harbor认证流程


4. Harbor 配置要求

配置要求主要受限于硬件要求

  • [1] Hardware
Resource Minimum Recommended
CPU 2 CPU 4 CPU
Mem 4 GB 8 GB
Disk 40 GB 160 GB
  • [2] Software
Software Version Description
Docker engine version 17.06.0-ce+ or higher For installation instructions, see docker engine doc
Docker Compose version 1.18.0 or higher For installation instructions, see docker compose doc
Openssl latest is preferred Used to generate certificate and keys for Harbor
  • [3] Network ports
Port Protocol Description
443 HTTPS Harbor portal and core API accept HTTPS requests on this port. You can change this port in the configuration file.
4443 HTTPS Connections to the Docker Content Trust service for Harbor. Only required if Notary is enabled. You can change this port in the configuration file.
80 HTTP Harbor portal and core API accept HTTP requests on this port. You can change this port in the configuration file.
  • [4] Harbor Components
Number Component Version
1 Postgresql 9.6.10-1.ph2
2 Redis 4.0.10-1.ph2
3 Clair 2.0.8
4 Beego 1.9.0
5 Chartmuseum 0.9.0
6 Docker/distribution 2.7.1
7 Docker/notary 0.6.1
8 Helm 2.9.1
9 Swagger-ui 3.22.1

5. Harbor 安装步骤

Harbor 的官方用户指南手册

  • [1] 官网主页
https://github.com/goharbor/harbor/releases
  • [2] 选择合适的资源包
# Online installer
harbor-offline-installer-v1.9.2.tgz       605 MB
harbor-offline-installer-v1.9.2.tgz.asc   833 Bytes

# Online installer
harbor-online-installer-v1.9.2.tgz        8.2 KB
harbor-online-installer-v1.9.2.tgz.asc    833 Bytes
  • [3] 解压对应安装包
# Online installer
$ tar xvf harbor-online-installer-version.tgz

# Offline installer
$ tar xvf harbor-offline-installer-version.tgz

# Mv to /usr/local dir
$ sudo mv harbor /usr/local
  • [4] 修改 harbor.cfg 配置文件
# Harbor版本
_version = 1.5.0

# 设置访问地址; 可以使用IP/域名(必须)
hostname = docker.escaplife.site

# 默认服务是走http协议,当然也可以设置为https协议(必须)
# 如果设置https协议的话,则nginx ssl选项也是需要设置on的
ui_url_protocol = https

# Job最大进程数; 默认值为3
max_job_workers = 50

# 是否创建证书,创建证书将会在下面的路径下生成(必须)
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key

# 私钥存储路径
secretkey_path = /data

# 设置日志大小
admiral_url = NA
log_rotate_count = 50
log_rotate_size = 200M

# 是否使用代理
http_proxy = xxx
https_proxy = xxx
no_proxy = 127.0.0.1,localhost,ui

# 邮箱设置,发送重置密码邮件时使用
email_identity = xxx
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false

# 安装Harbor后管理员UI登陆的密码,默认是Harbor12345
harbor_admin_password = Harbor12345

# 认证方式;比如LDAP、数据库认证,默认是db_auth方式
auth_mode = db_auth

# LDAP认证时配置项
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid
ldap_scope = 2
ldap_timeout = 5
ldap_verify_cert = true
ldap_group_basedn = ou=group,dc=mydomain,dc=com
ldap_group_filter = objectclass=group
ldap_group_gid = cn
ldap_group_scope = 2

#是否开启自动注册
self_registration = on

# Token有效时间,默认30分钟
token_expiration = 30

# 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(管理员)
project_creation_restriction = everyone

# Mysql数据库root用户默认密码root123,根据实际时使用来进行修改
db_host = mysql
db_password = root123
db_port = 3306
db_user = root

# Redis配置
redis_url = redis:6379
clair_db_host = postgres
clair_db_password = password
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert = true
uaa_ca_cert = /path/to/ca.pem
registry_storage_provider_name = filesystem
registry_storage_provider_config = xxx
  • [5] 创建 https 证书以及配置相关目录权限
# 创建证书目录
$ sudo mkdir /data/cert

# 生成私钥
$ sudo openssl genrsa -des3 -out server.key 2048

# 创建证书请求
$ sudo openssl req -new -key server.key -out server.csr

# 备份私钥
$ sudo cp server.key server.key.org

# 私钥去除密码
$ sudo openssl rsa -in server.key.org -out server.key

# 签名证书
$ sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

# 赋值权限
$ sudo chmod -R 777 /data/cert
  • [6] 运行脚本进行安装
$ sudo cd /usr/local/harbor
$ sudo ./install.sh
  • [7] 访问测试
# 各节点配置/etc/hosts文件
192.168.3.23    reg.escaplife.com

# 访问自己配置的域名地址
https://reg.escaplife.com

# 默认管理员用户密码
admin/Harbor12345
  • [8] 上传和下载镜像进行测试
# 指定Docker信任我们搭建的私有镜像仓库地址
$ sudo vim /etc/docker/daemon.json
{
    ......
    "insecure-registries": ['https://reg.escaplife.com'],
    ......
}

# 下载镜像测试
$ docker pull escape/nginx-test:v1

# 推送镜像测试
$ docker tag escape/nginx-test:v1 reg.escaplife.com/library/nginx-test:v1
$ docker pull reg.escaplife.com/library/nginx-test:v1

# 用户登录测试
$ docker login https://reg.escaplife.com

# 启动容器测试
$ kubectl run nginx-deployment \
    --image=reg.escaplife.com/library/nginx-test:v1 \
    --port=80 --replicas=1

# 通过IPVS查看对应规则
$ sudo ipvsadm -Ln

Harbor认证流程

Harbor认证流程

Harbor认证流程


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录