ceph+harbor构建docker registry

7 4月前 274

一、背景

·容器化需求越来越高,没有统一管理的docker镜像仓库。

·Docker原生的私有镜像仓库无法做到权限管理和高可用方案。

 

二、Harbor简介

Harbor是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker registry服务。它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based AccessControl),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。


作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。


Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中,确保数据和知识产权在公司内部网络中管控。另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

Harbor 是由 VMware 中国研发团队负责开发的开源企业级 Docker Registry,不仅解决了我们直接使用 Docker Registry 的功能缺失,更解决了我们在生产使用 Docker Registry 面临的高可用、镜像仓库直接复制、镜像仓库性能等运维痛点。

 

三、Ceph简介

 Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务(这里我们采用文件系统服务)。在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目里,Ceph的块设备存储可以对接OpenStack的cinder后端存储、Glance的镜像存储和虚拟机的数据存储,比较直观的是Ceph集群可以提供一个raw格式的块存储来作为虚拟机实例的硬盘。


Ceph相比其它存储的优势点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响。

 

四、Harbor架构图

Proxy:

主要为harbor其他组件提供的一个入口反向代理,接收来自客户端的所有请求。

Registry:

负责存储docker镜像并且处理docker pull/push请求,因为harbor强制的权限控制,registry指引客户端为每一次pull或者push获取一个有效的token。

UI:

整个架构的核心服务。该容器是Harbor工程的主要部分,webhock:harbor使用webhock来更新日志,初始化复制或者触发其他方法。Token service:负责为每一次pull或者push发行一个token,如果请求中未携带token,registry会直接代理请求到token service。Database:用于存储项目,用户,角色,复制规则等的数据库。

Job services:

用于镜像复制,本地仓库中的镜像可以同步到其他harbor实例中。

Log collector:

负责收集其他组件的日志到统一的地方。


五、Ceph + Harbor架构图

harbor原生支持双实例的镜像数据同步,并且harbor支持多实例共享后端存储。这里我们采用多harbor实例共享后端存储的方法:即harbor + cephfs

 

六、cephfs集群部署

1. 准备4台服务器1台作为admin节点,3台node节点:

admin-node:  10.148.14.80

node1:  10.148.14.39

node2:  10.148.14.95

node3:  10.148.14.76


2. 在所有节点上配置yum源:

sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rp
cat << EOM > /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-{ceph-stable-release}/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOM

*注意{ceph-stable-release}需要改成对应的ceph版本

3. admin节点上安装ceph-deploy

sudo yum update
sudo yum -y install ceph-deploy

4. node节点上安装ceph

sudo yum update
sudo yum install ceph –y

5. 配置ssh免密钥登录

#在ssh-keygen
ssh-keygen
#复ssh key到node节点
ssh-copy-id {username}@node1
ssh-copy-id {username}@node2
ssh-copy-id {username}@node3

6. 配置集群环境

#在admin节点上创建集群目录
mkdir my-cluster
cd my-cluster
#初始化node节点
ceph-deploy new node1
ceph-deploy new node2
ceph-deploy new node3

#部署监视器并收集密钥
ceph-deploy mon create-initial

当前目录会生成以下keyring文件:

  • ceph.client.admin.keyring
  • ceph.bootstrap-mgr.keyring
  • ceph.bootstrap-osd.keyring
  • ceph.bootstrap-mds.keyring
  • ceph.bootstrap-rgw.keyring
  • ceph.bootstrap-rbd.keyring
  • ceph.bootstrap-rbd-mirror.keyring

#创建osd
ceph-deploy --overwrite-conf osd  prepare node1:/dev/sdb
ceph-deploy --overwrite-conf osd  prepare node2:/dev/sdb
ceph-deploy --overwrite-conf osd  prepare node3:/dev/sdb

检查osd创建是否成功:


#创建mds
ceph-deploy mds create tjtx-125-29.58os.org

node节点上会启动mds进程

#创建两个存储池。MDS需要使用两个pool 一个pool用来存储数据,一poo用来存储元数据 node节点上执行
ceph osd pool create test_data 32
ceph osd pool create test_metadata 32
#查看是否创建成功
rados lspools

#创建cephfs 在node节点上
ceph fs new cephfs test_metadata test_data
#查看是否创建成功
ceph fs ls


七、cephfs挂载使用

推荐使用ceph-fuse 挂载,安装ceph-fuse

yum -y install ceph-fuse

将ceph node节点中/etc/ceph/ceph.client.admin.keyring 文件内容拷贝至客户端的/etc/ceph/目录中,使用如下命令挂载:

ceph-fuse -m 10.148.14.39,10.148.14.76,10.148.14.95:6789 /data2


八、Harbor高可用集群搭建

1. 下载Harbor离线安装包https://github.com/goharbor/harbor/releases 选择对应版本的离线包,注意这里我们使用1.5.3版本


2. 解压文件进入harbor目录中,修改harbor.cfg配置文件:

   1) 修改hostname字段

   2) 填入正确的mysqlredis信息


3. 修改docker-compose.yml文件:

 1) 由于我们已经配置好mysql和redis,不需要使用容器的mysql和redis,需将docker-compose.yml文件中关于mysql和redis的配置注释掉,并将各个组件存储位置修改到挂载cephfs集群的目录,使用nginx代理的ssl及证书配置,harbor端口只走80即可,可将其他端口配置注释掉,详细配置如下:

version: '2'
services:
  log:
    image: vmware/harbor-log:v1.5.3
    container_name: harbor-log 
    restart: always
    volumes:
      - /data2/harbor_data/log/harbor/:/var/log/docker/:z
      - ./common/config/log/:/etc/logrotate.d/:z
    ports:
      - 127.0.0.1:1514:10514
    networks:
      - harbor
  registry:
    image: vmware/registry-photon:v2.6.2-v1.5.3
    container_name: registry
    restart: always
    volumes:
      - /data2/harbor_data/registry:/storage:z
      - ./common/config/registry/:/etc/registry/:z
    networks:
      - harbor
    environment:
      - GODEBUG=netdns=cgo
    command:
      ["serve", "/etc/registry/config.yml"]
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "registry"
#  mysql:
#    image: vmware/harbor-db:v1.5.3
#    container_name: harbor-db
#    restart: always
#    volumes:
#      - /data2/harbor_data/database:/var/lib/mysql:z
#    networks:
#      - harbor
#    env_file:
#      - ./common/config/db/env
#    depends_on:
#      - log
#    logging:
#      driver: "syslog"
#      options:  
#        syslog-address: "tcp://127.0.0.1:1514"
#        tag: "mysql"
  adminserver:
    image: vmware/harbor-adminserver:v1.5.3
    container_name: harbor-adminserver
    env_file:
      - ./common/config/adminserver/env
    restart: always
    volumes:
      - /data2/harbor_data/config/:/etc/adminserver/config/:z
      - /data2/harbor_data/secretkey:/etc/adminserver/key:z
      - /data2/harbor_data/:/data/:z
    networks:
      - harbor
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "adminserver"
  ui:
    image: vmware/harbor-ui:v1.5.3
    container_name: harbor-ui
    env_file:
      - ./common/config/ui/env
    restart: always
    volumes:
      - ./common/config/ui/app.conf:/etc/ui/app.conf:z
      - ./common/config/ui/private_key.pem:/etc/ui/private_key.pem:z
      - ./common/config/ui/certificates/:/etc/ui/certificates/:z
      - /data2/harbor_data/secretkey:/etc/ui/key:z
      - /data2/harbor_data/ca_download/:/etc/ui/ca/:z
      - /data2/harbor_data/psc/:/etc/ui/token/:z
    networks:
      - harbor
    depends_on:
      - log
      - adminserver
      - registry
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "ui"
  jobservice:
    image: vmware/harbor-jobservice:v1.5.3
    container_name: harbor-jobservice
    env_file:
      - ./common/config/jobservice/env
    restart: always
    volumes:
      - /data2/harbor_data/job_logs:/var/log/jobs:z
      - ./common/config/jobservice/config.yml:/etc/jobservice/config.yml:z
    networks:
      - harbor
    depends_on:
     # - redis
      - ui
      - adminserver
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "jobservice"
#  redis:
#    image: vmware/redis-photon:v1.5.3
#    container_name: redis
#    restart: always
#    volumes:
#      - /data2/harbor_data/redis:/data
#    networks:
#      - harbor
#    depends_on:
#      - log
#    logging:
#      driver: "syslog"
#      options:  
#        syslog-address: "tcp://127.0.0.1:1514"
#        tag: "redis"
  proxy:
    image: vmware/nginx-photon:v1.5.3
    container_name: nginx
    restart: always
    volumes:
      - ./common/config/nginx:/etc/nginx:z
    networks:
      - harbor
    ports:
      - 80:80
    # - 443:443
    # - 4443:4443
    depends_on:
      #- mysql
      - registry
      - ui
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"
networks:
  harbor:
    external: false

4.以上配置完毕后执行如下命令启动harbor:

./install.sh

浏览器打开harbor地址:http://nginx代理地址:80 或者直接访问 harbor部署所在机器的ip+80 端口即可 初始用户名:admin 初始密码:Harbor12345

5.配置多个harbor节点:在多个服务器上重复以上cephfs挂载,并在相同目录下启动harbor实例,然后在代理层配置多后端realserver,

 

九、遇到的问题

1. nginx代理层要配置文件上传大小client_max_body_size,这里根据常使用镜像大小配置即可。

2. cephfs挂载,低版本内核尽量使用ceph-fuse挂载,笔者遇到过使用mount挂载导致push镜像的时候出现长时间卡顿的现象。

3. nginx缓冲区优化,拉取镜像失败,这个需要在harbor的nginx上增加配置:proxy_max_temp_file_size 0; 。

 

参考文档:

http://docs.ceph.com/docs/master/

https://www.colabug.com/120001.html

https://github.com/goharbor/harbor

最后于 4月前 被愚人乙编辑 ,原因:
最新回复 (0)
    • 运维开源项目互助社区—致敬开源
      2
        立即登录 立即注册 
返回