ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

搭建单机版Harbor仓库和升级为高可用版

2021-08-20 21:00:07  阅读:134  来源: 互联网

标签:compose 单机版 Harbor long harbor ubuntu docker root 搭建


Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由vmware
开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了
开源 Docker Distribution。作为一个企业级私有 Registry 服务器,Harbor 提供了更
好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor
支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中,
确保数据和知识产权在公司内部网络中管控,另外,Harbor 也提供了高级的安全
特性,诸如用户管理,访问控制和活动审计等。

vmware 官方开源服务列表地址:https://vmware.github.io/harbor/cn/
harbor 官方 github 地址:https://github.com/vmware/harbor
harbor 官方网址:https://goharbor.io/

Harbor 功能官方介绍:

基于角色的访问控制:用户与 Docker 镜像仓库通过“项目”进行组织管理,
一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制:镜像可以在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,
高可用,混合云和多云的场景。
图形化用户界面:用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管
理项目和命名空间。
AD/LDAP 支:Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。
审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会
添加进来。
RESTful API - RESTful API :提供给管理员对于 Harbor 更多的操控, 使得与其它管
理软件集成变得更容易。
部署简单:提供在线和离线两种安装工具, 也可以安装到 vSphere 平台(OVA 方
式)虚拟设备。

nginx:harbor 的一个反向代理组件,代理 registry、ui、token 等服务。这个代理
会转发 harbor web 和 docker client 的各种请求到后端服务上。
harbor-adminserver:harbor 系统管理接口,可以修改系统配置以及获取系统信
息。
harbor-db:存储项目的元数据、用户、规则、复制策略等信息。
harbor-jobservice:harbor 里面主要是为了镜像仓库之前同步使用的。
harbor-log:收集其他 harbor 的日志信息。
harbor-ui:一个用户界面模块,用来管理 registry。
registry:存储 docker images 的服务,并且提供 pull/push 服务。
redis:存储缓存信息
webhook:当 registry 中的 image 状态发生变化的时候去记录更新日志、复制等
操作。
token service:在 docker client 进行 pull/push 的时候负责 token 的发放。

安装 Harbor:

下载地址:https://github.com/vmware/harbor/releases
安装文档:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

https://github.com/goharbor/harbor/blob/master/docs/README.md

下载docker-compose:
https://github.com/docker/compose/releases

安装docker-compose

harbor 需要docker-17.06或者更高版本,docker-compose-1.18.0以上

# 在线下载
[root@Bj-Ubuntu ~]# wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64

[root@Bj-Ubuntu ~]# cp docker-compose-Linux-x86_64 /usr/bin/docker-compose

授权

[root@Bj-Ubuntu ~]# chmod +x /usr/bin/docker-compose

测试

[root@Bj-Ubuntu ~]# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

docker-compose使用

# 查看Harbor容器的运行状态
[root@ubuntu-1804 harbor]# docker-compose ps
      Name                     Command                  State                 Ports
---------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)
harbor-db           /docker-entrypoint.sh            Up (healthy)
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)
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)
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->8080/tcp
redis               redis-server /etc/redis.conf     Up (healthy)
registry            /home/harbor/entrypoint.sh       Up (healthy)
registryctl         /home/harbor/start.sh            Up (healthy)
trivy-adapter       /home/scanner/entrypoint.sh      Up (healthy)

# 启动Harbor容器
docker-compose start

# 停止Harbor容器
docker-compose stop

# 重启Harbor容器
docker-compose restart

# 停止并删除Harbor容器,加上-v参数可以同时移除挂载在容器上的目录
docker-compose down

# 创建并启动Harbo容器,参数“-d”表示后台运行命令
docker-compose up -d

安装harbor

# 解压
[root@Bj-Ubuntu ~]# tar xf harbor-offline-installer-v2.2.3.tgz

[root@Bj-Ubuntu ~]# cd harbor/

[root@Bj-Ubuntu ~/harbor]# ll
total 502868
drwxr-xr-x 2 root root      4096 Jul 17 11:24 ./
drwx------ 7 root root      4096 Jul 17 11:24 ../
-rw-r--r-- 1 root root      3361 Jul  5 13:39 common.sh
-rw-r--r-- 1 root root 514891405 Jul  5 13:40 harbor.v2.2.3.tar.gz
-rw-r--r-- 1 root root      7840 Jul  5 13:39 harbor.yml.tmpl
-rwxr-xr-x 1 root root      2500 Jul  5 13:39 install.sh*
-rw-r--r-- 1 root root     11347 Jul  5 13:39 LICENSE
-rwxr-xr-x 1 root root      1881 Jul  5 13:39 prepare*

改配置文件

[root@Bj-Ubuntu ~/harbor]# cp harbor.yml.tmpl harbor.yml

[root@Bj-Ubuntu ~/harbor]# vim harbor.yml
hostname: 172.31.0.19
harbor_admin_password: 123456

data_volume: /data/harbor # 这个目录生产环境建议使用挂载的某个单独分区来挂载

启动 (注意:本机不能有启动会占用的端口,harbor会用到的端口,比如80,不然会报错)

[root@Bj-Ubuntu ~/harbor]# ./install.sh

登陆浏览器访问测试
用户:admin
密码:123456

创建新项目

测试打标签上传

[root@long-ubuntu ~]# docker tag centos7.9-base:v1 172.31.0.19/m44/centos7.9-base:v1

# 上传,发现报错,提示没有登录
[root@long-ubuntu ~]# docker push 172.31.0.19/m44/centos7.9-base:v1

# 登录,发现报错,dial tcp 172.31.0.19:443: connect: connection refused
[root@long-ubuntu ~]# docker login 172.31.0.19
Username: admin
Password:

# 解决办法:
在docker.service配置文件添加 --insecure-registry
[root@long-ubuntu ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 172.31.0.19 --insecure-registry harbor.longxuan.vip

# 重新加载
[root@long-ubuntu ~]# systemctl daemon-reload
[root@long-ubuntu ~]# systemctl restart docker

还要在/etc/hosts 文件添加
[root@long-ubuntu ~]# cat /etc/hosts
172.31.0.19 harbor.longxuan.vip

登录发现报错:

unauthorized: unauthorized to access repository: baseimages/jdk-base, action: push: unauthorized to access repository: baseimages/jdk-base, action: push

# 解决方法:重新登录docker login harbor.longxuan.vip
Username: admin
Password:

# 或者重新打标签把域名改成使用IP地址,即可

测试1

# 打标签
[root@long-ubuntu ~]# docker tag tomcat-base:v8.5.54 harbor.longxuan.vip/baseimages/tomcat-base:v8.5.54

# 上传
[root@long-ubuntu ~]# docker push harbor.longxuan.vip/baseimages/tomcat-base:v8.5.54

测试2,其他机器pull镜像试试(前提条件是这台机器安装有docker环境)

[root@long-ubuntu ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 172.31.0.19 --insecure-registry harbor.longxuan.vip

# 重新加载
[root@long-ubuntu ~]# systemctl daemon-reload
[root@long-ubuntu ~]# systemctl restart docker

# 添加域名解析
[root@long-ubuntu ~]# vim /etc/hosts
172.31.0.19 harbor.longxuan.vip

测试登录并拉取镜像

[root@long-ubuntu ~]# docker login harbor.longxuan.vip
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

# 拉取
[root@long-ubuntu ~]# docker pull harbor.longxuan.vip/baseimages/centos7.9-base:v1
v1: Pulling from baseimages/centos7.9-base
2d473b07cdd5: Pull complete
63ef7c9402ed: Pull complete
0b032c9ff74a: Pull complete
Digest: sha256:911d70953b9a281f0bc4da622f88b600c5893057f9e2e3e9dec2fc389f3ab309
Status: Downloaded newer image for harbor.longxuan.vip/baseimages/centos7.9-base:v1
harbor.longxuan.vip/baseimages/centos7.9-base:v1

添加扫描功能

[root@Bj-Ubuntu ~/harbor]# ./prepare --with-trivy

[root@Bj-Ubuntu ~/harbor]# docker-compose up -d

网页刷新即可,如下图就是可以开启扫描功能

基于单机版制作高可用版的harbor仓库

环境:

haproxy + keepalived 172.18.8.18 Centos8
haproxy + keepalived 172.18.8.28 Centos8
harbor  172.18.8.119 Ubuntu1804
harbor  172.18.8.129 Ubuntu1804

两台haproxy一样的操作

[root@localhost ~]# yum install keepalived haproxy psmisc -y

[root@localhost ~]# cat /etc/sysctl.conf
[root@localhost ~]# net.ipv4.ip_nonlocal_bind = 1

改haproxy配置

[root@localhost ~]# cat /etc/haproxy/haproxy.cfg
listen harbor-80
    bind 172.18.8.188:80
    mode http
    #balance source
    balance roundrobin
    server 172.18.8.119 172.18.8.119:80 check inter 3000 fall 2 rise 5
    server 172.18.8.129 172.18.8.129:80 check inter 3000 fall 2 rise 5

改keepalived配置

[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL1 #backup 为数字2
   vrrp_mcast_group4 224.0.100.100
}
vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}

vrrp_instance VI_1 {
    state BACKUP  #如果是非抢占模式都是backup 为BACKUP
    interface eth0
    virtual_router_id 66
    priority 100  #backup 为80
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        172.18.8.188/16 dev eth0 label eth0:1
    }
    track_interface {
        eth0
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    track_script {
        check_haproxy
    }
}

判断haproxy脚本

[root@localhost ~]# cat /etc/keepalived/check_haproxy.sh
#!/bin/bash
# 为0就表示进程存在,否则表示不存在
/usr/bin/killall -0 haproxy || systemctl restart haproxy

keepalived-notify脚本

[root@localhost ~]# cat /etc/keepalived/notify.sh
!/bin/bash
contact='root@localhost'
notify() {
    mailsubject="$(hostname) to be $1:vip floating"
    mailbody="$(date +'%F %T'):vrrp transition,$(hostname) change to be $1"
    echo $mailbody | mail -s "$mailsubject" $contract
}
case $1 in
master)
    notify master
    systemctl start nginx
    ;;
backup)
    notify backup
    systemctl restart nginx
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
esac

授权给两个脚本

[root@localhost ~]# chmod +x /etc/keepalived/*.sh

启动服务

[root@localhost ~]# systemctl restart keepalived haproxy

然后就测试

两台操作一样

[root@long-ubuntu ~]# apt purge ufw lxd lxd-client lxcfs lxc-common -y

[root@long-ubuntu ~]# apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common  lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet  traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev  ntpdate tcpdump telnet traceroute iotop unzip zip

[root@long-ubuntu ~]# apt-get remove docker docker-engine docker.io

[root@long-ubuntu ~]# apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common

[root@long-ubuntu ~]# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

[root@long-ubuntu ~]# sudo add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
    
[root@long-ubuntu ~]# apt install -y docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic

[root@long-ubuntu ~]# sudo mkdir -p /etc/docker
[root@long-ubuntu ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rzd1bb7q.mirror.aliyuncs.com"]
}
EOF
[root@long-ubuntu ~]# sudo systemctl daemon-reload
[root@long-ubuntu ~]# sudo systemctl restart docker

[root@long-ubuntu ~]# wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64

[root@long-ubuntu ~]# ll
[root@long-ubuntu ~]# cp docker-compose-Linux-x86_64 /usr/bin/docker-compose

[root@long-ubuntu ~]# chmod +x /usr/bin/docker-compose
[root@long-ubuntu ~]# docker-compose --version

[root@long-ubuntu ~]# tar xf harbor-offline-installer-v2.2.3.tgz

改配置文件

[root@Bj-Ubuntu ~/harbor]# cp harbor.yml.tmpl harbor.yml

[root@Bj-Ubuntu ~/harbor]# vim harbor.yml
hostname: 172.18.8.119
harbor_admin_password: 123456

data_volume: /data/harbor # 这个目录生产环境建议使用挂载的某个单独分区来挂载

启动安装脚本

[root@ubuntu-1804 harbor]# ./install.sh --with-trivy

停止

[root@ubuntu-1804 harbor]# docker-compose stop

全部启动

[root@ubuntu-1804 harbor]# docker-compose up -d

web界面配置

创建仓库管理时,填写的url是对方的,复制管理才能看到对方的url并选择

测试

# 修改docker.service配置文件
root@ubuntu-1804:~# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 172.18.8.188 --insecure-registry harbor.longxuan.vip

重新加载并重启

root@ubuntu-1804:~# systemctl daemon-reload
root@ubuntu-1804:~# systemctl restart docker

重启docker-compose

# 先停止
[root@ubuntu-1804 harbor]# docker-compose stop

# 启动
[root@ubuntu-1804 harbor]# docker-compose start

# 创建并启动Harbo容器,参数“-d”表示后台运行命
[root@ubuntu-1804 harbor]# docker-compose up -d

登录

[root@ubuntu-1804 ~]# docker login harbor.longxuan.vip
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  # 当看到这个说明登录成功

拉取一个镜像并上传测试

[root@ubuntu-1804 ~]# docker pull nginx:1.18.0

给镜像重新打标签

[root@ubuntu-1804 ~]# docker tag nginx:1.18.0 172.18.8.188/m44/nginx-1.18:v1

上传镜像

[root@ubuntu-1804 ~]# docker push 172.18.8.188/m44/nginx-1.18:v1
The push refers to repository [172.18.8.188/m44/nginx-1.18]
4fa6704c8474: Pushed
4fe7d87c8e14: Pushed
6fcbf7acaafd: Pushed
f3fdf88f1cb7: Pushed
7e718b9c0c8c: Pushed
v1: digest: sha256:9b0fc8e09ae1abb0144ce57018fc1e13d23abd108540f135dc83c0ed661081cf size: 1362

查看web界面应该就会看到两边都有镜像

总结

haproxy使用默认的轮询算法没有办法登录,需要设置成源地址轮询哈希算法(要是mode是http 就可以使用默认轮询算法)

(建议使用非抢占模式)keepalived + HAProxy 配置的监听脚本是判断haproxy是否存在,如果不存在就重启haproxy,同时vip不会飘走,当机器出现两个软件服务都down的时候才会执行权重-30,VIP会飘到backup机器,同时采用了非抢占模式,当原来的master重启恢复,VIP也不会抢回来到原来的master,同时原来的master就会变成backup机器

harbor只能在线实时同步,如果有出现某一台宕机,同时还有操作上传镜像的,另外宕机这台是不能同步的,也就是当启动宕机的这台服务器查看harbor不会看到刚才上传的镜像

真要做到高可用方法:
镜像最好放存储,把harbor的数据目录默认/data 指向存储

标签:compose,单机版,Harbor,long,harbor,ubuntu,docker,root,搭建
来源: https://www.cnblogs.com/xuanlv-0413/p/15168137.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有