暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货分享】Harbor镜像仓库部署实践(二)

稻壳编程 2019-11-20
511

作者简介

211工程院校贵州大学管理学院硕士研究生、互联网金融行业资深DevOps研发工程师. 曾在国内多家知名互联网公司 平安科技、微众银行、顺丰科技、魅族任职. 具有多年国内一线互联网公司自动化运维平台设计与开发经验。



Harbor高可用集群解决方案--理论篇

在上一篇文章中我们介绍了单机版本harbor的安装与配置,但是这种单机部署显然无法满足在实际生产环境中的需求,因为在生产环境中是必须要保证应用服务的高可用性的,以下我为大家提供两种Habor高可用解决方案。

  • 双主复制

  • 多harbor实例共享后端存储

 1 

Harbor镜像推拉

在上节内容中我们已经成功的部署了单机版的Harbor并可以正常对外提供容器镜像仓库服务, 我们现在开始向Harbor中推拉镜像
1.1    推送镜像到Harbor
1.1.1 在Harbor WEB控制台中创建项目os_base(过程略)
1.1.2 将要推送的镜像标签更改为HarborIP/projectName/imageName:version形式
[root@localhost ~]# docker tag docker.io/centos:latest 172.16.70.91/os_base/centos:latest

1.1.3 尝试登录Harbor可能会出现如下错误
[root@localhost ~]# docker login 172.16.70.91
解决方法:
步骤1: 查看docker进程启动参数
    需要在docker启动参数中加入 --insecure-registry参数, 将该参数的值置为Harbor仓库的地址。默认情况下Docker未配置该参数, 如下图所示:

步骤2: 寻找docker启动配置文件查看其中配置信息
[root@localhost ~]# find -name docker.service
[root@localhost ~]# cat usr/lib/systemd/system/docker.service 


[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer


[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --init-path=/usr/libexec/docker/docker-init-current \
          --seccomp-profile=/etc/docker/seccomp.json \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY \
          $REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process


[Install]
WantedBy=multi-user.target


在配置文件中可以看出docker在启动过程中会关联OPTIONS、DOCKER_STORAGE_OPTIONS等变量,这些变量均来自EnvironmentFile中,如/etc/sysconfig/docker、/etc/sysconfig/docker-storage等. 


步骤3. 修改/etc/sysconfig/docker 配置文件,在OPTIONS变量值尾部加入insecure-registry参数,如下所示:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry=172.16.70.91'


步骤4. 保存并重启docker

此时docker进程的启动项中新增了insecure-registry配置参数. 重新docker login登录Harbor,登录成功!


1.1.4 推送镜像至Harbor
[root@localhost ~]# docker push  172.16.70.91/os_base/centos  
1.2 从Harbor拉取镜像
[root@localhost ~]# docker pull 172.16.70.91/os_base/centos    


 2 

Harbor高可用部署

2.1 双主复制

Harbor官方默认提供主从复制的方案来解决镜像同步问题,通过复制的方式,我们可以实时将harborA仓库的镜像同步到harborB仓库中,在实际生产运维的中,往往需要把镜像发布到几十或上百台集群节点上。此时单个Harbor是无法满足大量节点的下载需求的,因此要配置多个Harbor实例做负载均衡。但是手工维护多个Harbor实例上的镜像是十分繁琐的事情。Harbor可以支持一主多从的镜像发布模式,可以解决大规模镜像发布的难题。镜像同步架构图如下所示:

但是仅仅单靠主从同步,仍然解决不了harbor主节点的单点问题。


2.2 多harbor实例共享后端存储

共享后端存储就是多个Harbor实例共享同一个后端存储(NFS、DB、Redis),任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置的负载均衡器(HAPROXY、LVS、F5等)将进来的请求分流到不同的实例中去处理,这样既实现了负载均衡又避免了单点故障。架构图如下所示:

使用共享后端存储方案需要注意以下几个问题:

  • 共享存储的选取: Harbor支持多种类型的后端存储包括AWS S3、Openstack Swift, Ceph等;在我们的演示环境中采用NFS作为共享存储解决方案。

  • Session在不同的实例上共享: 在Harbor中,默认session会存放在redis中,我们搭建一台独立的Redis服务器即可。

  • Harbor多实例数据库共享问题: 可以将harbor中的数据库拆出来独立部署,修改配置文件让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。


在下一篇文章中,我们仍然是秉持可操作、能落地的原则来介绍Harbor的高可用集群的详细部署过程。


 3 

结束语

如果本文可以对您的工作学习带来帮助,请扫描左侧赞赏码以资鼓励作者;文章勘误请扫描右侧二维码联系作者。


文章转载自稻壳编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论