袁党生博客

  • 主页
  • linux基础
  • SHELL
  • WEB
  • 负载
  • 企业级应用
  • 数据库
  • KVM
  • Docker
  • K8S
  • 监控
  • 存储
  • 博客搭建问题
  1. 首页
  2. Docker
  3. 正文

四、docker 仓库之分布式 Harbor

2020年9月8日 1642点热度 0人点赞 0条评论


本章概述

  • Harbor 功能官方介绍
  • 安装harbor
  • 访问harbor验证
  • 使用harbor镜像仓库上传下载镜像
  • harbor镜像扫描
  • 实现harbor高可用

前言
  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服务器规格推荐:
    CPU:8C
    内存:16G以上(包括16G)
    硬盘:越大越好(根据镜像需求而定),做raid10
    网卡:最起码是千兆网卡,最好是万兆网卡

4.1 Harbor 功能官方介绍

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

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高可用,一般会在两个服务器上部署harbor,两个harbor节点之间进行数据同步,一个节点挂掉,不影响harbor的使用

4.2 安装harbor

  由于在1.8版本到1.9版本以后,harbor的配置文件有harbor.cfg变成harbor.yml,因此安装时注意harbor的版本。这里采用最新版本2.8.1的harbor进行安装,如果在生产环境,不建议使用最新版本,可以使用早几个版本的稳定版。

下载地址:https://github.com/vmware/harbor/releases
安装文档:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
harbor官方提供了两种harbor安装方式:
  离线安装:下载的安装包比较大,包括了所有需要的安装包,下载完以后,不需要联网就可以安装harbor
  在线安装:下载的安装包比较小,安装时需要连接互联网在线下载需要的安装包

4.2.1 安装前准备工作

1、环境准备

两台服务器信息如下:
地址:172.31.7.153、172.31.7.154
操作系统:ubuntu 1804
服务器规格:2C4G      #实验环境最低配置,实际环境根据需求而定
硬盘:如果实验使用虚拟机,可以添加一个硬盘作为专门用来存放镜像的存储

2、格式化新添加的硬盘(该硬盘专门用于harbor存放镜像文件)
(1)查看本地硬盘:lsblk

(2)对硬盘进行分区,创建占用所有硬盘的一个分区/dev/sdb1

root@docker_harbor01:/usr/local/src/harbor# fdisk /dev/sdb
Command (m for help): n         #创建新分区
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p          #创建主分区
Partition number (1-4, default 1):           #默认即可
First sector (2048-104857599, default 2048):         #默认即可
Last sector, +sectors or +size{K,M,G,T,P} (2048-104857599, default 104857599):

Created a new partition 1 of type 'Linux' and of size 50 GiB.

Command (m for help): w        #保存创建的分区
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

(3)查看分区

(4)格式化分区,然后df -h查看该分区
mkfs.ext4 /dev/sdb1

(5)创建存放镜像的目录/data/harbordata,然后挂载到新创建的分区

mkdir /data/harbordata -p
vim  /etc/fstab
/dev/sdb1                               /data/harbordata  xfs    defaults       0       0
mount  -a        #将目录挂载

4.2.2 安装docker

安装harbor之前需要先安装docker环境,否则harbor无法启动(要求docker版本在17.06以上版本)

1、为了方便,这里使用以下脚本安装docker:(二进制安装)
或者参考1.2.2章节的操作步骤进行docker二进制安装

#!/bin/bash
#docker-install

docker_version="20.10.24"

#添加清华大学镜像源
cat > /etc/apt/sources.list << EOF
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
EOF
#更新镜像源
apt update

#下载docker二进制安装包并解压
mkdir -p /usr/local/src
cd /usr/local/src/
ls docker-${docker_version}.tgz
if [ $? -eq 0 ];then
    echo "file exist,no need to download"
    tar -xvf docker-${docker_version}.tgz -C /usr/local/src/
    cp /usr/local/src/docker/*  /usr/bin/
else
    wget mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/docker-${docker_version}.tgz
    tar -xvf docker-${docker_version}.tgz -C /usr/local/src/
    cp /usr/local/src/docker/*  /usr/bin/
fi

#编辑containerd.service文件
cat > /lib/systemd/system/containerd.service  << EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

EOF

#编辑docker.service文件
cat > /lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process
OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target

EOF

#编辑docker.socket文件
cat  > /lib/systemd/system/docker.socket << EOF
[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

EOF

#增加docker用户和组(如果不加,docker会启动失败)
groupadd docker 
useradd docker -g docker

#创建普通用户,加入docker组
id -u magedu > /dev/null
if [ $? -eq 0 ];then
    echo "user exist"
else
    useradd magedu  -G docker
fi

#启动containerd服务
systemctl enable containerd.service 
systemctl restart containerd.service

#启动docker服务
systemctl enable docker.service 
systemctl restart docker.service

#启动docker.socket,设置开机自启动
systemctl enable docker.socket
systemctl start docker.socket

#添加镜像加速器
cd /etc/docker
touch daemon.json
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ]
}
EOF

#更改内核参数
cat > /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl -p

#docker安装成功
echo "docker install sucess!!!"

2、执行脚本,安装docker
bash binary-docker_install.sh

3、安装完成以后,执行docker info命令验证

4.2.3 安装docker-compose

harbor安装除了依赖docker之外,还依赖docker-compose这个编排工具,因此docker环境安装完成后,还需要安装docker-compose,否则harbor无法安装(要求docker-compose版本为1.18.0以上版本)

注意:这里我们为了安装harbor,只需安装docker-compose即可,暂时不需要知道docker-compose如何使用,docker-compose的用法,在后面会提到

1、下载docker-compose安装包
github下载:https://github.com/docker/compose/releases
使用命令下载docker-compose(2.16.0版本)二进制文件
cd /usr/local/src
wget https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64
2、为二进制文件赋予可执行权限
chmod a+x docker-compose-linux-x86_64
3、为了便于全局执行命令,把二进制复制到/usr/bin目录下
cp /usr/local/src/docker-compose-linux-x86_64 /usr/bin/docker-compose
4、验证
执行命令确保docker-compose命令可以执行
docker-compose version

4.2.4 安装harbor

1、下载harbor离线安装包
本次安装使用2.7.2版本的harbor,推荐使用离线安装方式
(1)离线安装包下载(推荐这种安装方式)
cd /usr/local/src/
wget https://github.com/goharbor/harbor/releases/download/v2.7.2/harbor-offline-installer-v2.7.2.tgz
(2)在线安装包下载(不推荐的安装方式)
cd /usr/local/src/
wget https://github.com/goharbor/harbor/releases/download/v2.7.2/harbor-online-installer-v2.7.2.tgz
2、解压并编辑harbor配置文件

root@docker_harbor01:~# cd /usr/local/src/
root@docker_harbor01:/usr/local/src# tar -xvf harbor-offline-installer-v2.7.2.tgz
root@docker_harbor01:/usr/local/src# cd harbor/
root@docker_harbor01:/usr/local/src/harbor# cp harbor.yml.tmpl harbor.yml
root@docker_harbor01:/usr/local/src/harbor# vim harbor.yml
#harbor地址,可以写ip,也可以写域名,如果写域名,需要在访问harbor的本地hosts文件添加地址解析。当配置harbor镜像复制时,要将域名修改为主机ip地址,否则会报错
hostname: harbor.magedu.com

#http协议,保持默认即可
# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

#https协议,如果启用,需要配置公钥证书和私钥证书,这里暂时不开启,将以下内容注释掉
# https related config
#https:
  # https port for harbor, default is 443
  #  port: 443
  # The path of cert and key files for nginx
  #  certificate: /your/certificate/path
  #  private_key: /your/private/key/path

#harbor登录密码,默认为Harbor12345,可以自定义密码
harbor_admin_password: 123456

#harbor数据存储目录,默认为/data,这里修改为自定义的/data/harbordata目录,该目录可以挂载到存储或其他地方,专门用来存放harbor数据,即使服务器宕机,数据也不会丢失
data_volume: /data/harbordata

3、安装harbor
cd /usr/local/src/harbor
root@docker_harbor01:/usr/local/src/harbor# ./install.sh --with-trivy #--with-trivy是指开启镜像扫描
出现以下输出说明安装成功

4.3 访问harbor验证

1、在访问harbor的主机本地hosts添加以下地址解析
172.31.7.153 harbor.magedu.com
2、浏览器访问harbor:harbor.magedu.com

3、输入账号密码,访问控制台
账号为admin,密码为harbor配置文件中harbor_admin_password参数的值

4、创建项目,用于存放镜像

项目名称:设置项目名称
访问级别:如果不勾选公开前面的按钮,是私有仓库,这里勾选上
存储容器:-1是指不限量,如果需要限量,可根据需求进行配置
镜像代理:保持默认即可

创建完成后,如下所示:

4.4 使用harbor镜像仓库上传下载镜像

4.4.1 上传前准备工作

要想在客户端使用harbor镜像仓库,需要准备以下工作:
1、在客户端本地hosts文件中添加地址解析

root@docker_server01:~# vim /etc/hosts
172.31.7.153 harbor.magedu.com

2、在客户端添加非安全镜像仓库(注意:如果镜像仓库使用域名,则daemon.json文件中添加非安全仓库也需要添加域名,如果镜像仓库是ip地址,daemon.json文件中添加非安全仓库也需要添加ip地址,否则上传镜像会报错)

root@docker_server01:~# vim /etc/docker/daemon.json   #如果存在多个镜像,可以同时列出,用逗号隔开
{
  "registry-mirrors": ["https://3lvei2wk.mirror.aliyuncs.com"],
  "insecure-registries":[ "http://172.31.7.151:5000","http://harbor.magedu.com"]
}

重启docker服务,使配置生效
root@docker_server01:~# systemctl daemon-reload && systemctl restart docker
查看docker info信息中的非安全仓库:

4.4.2 上传下载镜像

4.4.2.1 上传镜像
1、为本地镜像打tag(tag格式:镜像仓库域名/项目名称/镜像名称:tag号)
root@docker_server01:~# docker tag nginx:1.18.0 harbor.magedu.com/harbor2023/nginx:1.18.0
2、登录harbor镜像仓库,然后上传镜像
登录账号密码就是登录web页面harbor的账号密码
root@docker_server01:~# docker login harbor.magedu.com

上传镜像
root@docker_server01:~# docker push harbor.magedu.com/harbor2023/nginx:1.18.0

3、在harbor镜像仓库控制台查看镜像已存在,说明上传成功

4.4.2.2 下载镜像并启动容器
1、在其他服务器下载下载harbor镜像仓库中的镜像
注意:在下载前要添加hosts地址解析,以及添加非安全镜像仓库
root@docker_server02:~# docker pull harbor.magedu.com/harbor2023/nginx:1.18.0

2、启动镜像为容器
root@docker_server02:~# docker run -it -p 8088:80 harbor.magedu.com/harbor2023/nginx:1.18.0

4.5 harbor镜像扫描

4.5.1 开启镜像扫描

harbor镜像扫描器可以扫描镜像文件,检查镜像文件中是否存在安全漏洞,因此一般情况下都会开启扫描器
1、开启扫描器方法:

方法1:在安装时开启
在安装harbor时,添加--with-trivy参数,即:
cd /usr/local/src/
root@docker_harbor01:/usr/local/src/harbor# ./install.sh --with-trivy
备注:harbor 早期版本开启扫描器使用--with-clair参数,2.2版本以后已经丢弃该参数,使用--with-trivy参数开启扫描器

方法2:在安装后开启
如果已经harbor已经安装完成,可以执行以下命令开启镜像扫描器
cd /usr/local/src/
root@docker_harbor01:/usr/local/src/harbor#  ./prepare --with-trivy

2、在harbor控制台查看扫描器(扫描器状态是健康状态说明扫描器可以正常使用)

3、查看镜像扫描
找到项目下的镜像文件,点击扫描器

4.5.2 手动对镜像进行扫描

1、点击项目-项目仓库harbor2023,进入下一页面

2、点击镜像harbor2023/nginx

3、勾选镜像,然后点击扫描

4、查看扫描结果

5、查看漏洞内容
点击镜像,进入下一页面

把页面拉到最下面,查看漏洞内容

4.5.3 开启镜像自动扫描

上传镜像到harbor,harbor镜像仓库不会自动扫描镜像,需要人为手动扫描。可以开启自动扫描,镜像一旦上传,harbor就会自动进行镜像扫描。
1、登录harbor,点击项目-镜像仓库

2、点击配置管理,勾选自动扫描镜像

4.6 实现harbor高可用

高可用实现方式:
  方法1:使用共享存储,harbor将镜像存储到共享存储,node节点下载镜像时,harbor将存储中的数据返回给客户端
  方法2:如果没有共享存储,可以基于镜像复制的方式,实现高可用。即几台harbor服务器之间进行数据同步,使得数据保持一致

  Harbor 支持基于策略的 Docker 镜像复制功能,这类似于 MySQL 的主从同步,其可以实现不同的数据中心、不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作,已经有用很多互联网公司使用harbor 搭建内网 docker 仓库的案例,并且还有实现了双向复制的案列,本文将实现单向复制的部署。

逻辑架构图

备注:正常情况下,为了实现高可用,应部署两台harbor服务器,开启镜像复制实现数据同步。由haproxy负载两台harbor服务器,然后在两台haproxy服务器上启用keepalive保证haproxy的高可用。

环境准备:
  harbor01:172.31.7.153
  harbor02:172.31.7.154
  负载均衡harproxy01:172.31.7.152
  负载均衡harproxy02:172.31.7.155
  keepalive vip地址:172.31.7.188

4.6.1 部署harbor

1、要实现harbor的镜像复制,需要两台harbor服务器。
  具体操作步骤可以操作4.2章节,这里不在复述。(如果复用4.2章节部署的harbor服务器,注意要将harbor配置文件中的hostname参数的值修改为harbor服务器ip地址)
注意:在部署harbor过程中,修改harbor配置文件harbor.yaml时,hostname参数需要配置为当前harbor服务器的ip地址,而不能配置为域名,如果配置为域名,在仓库管理-新建目标时会出现新建连接失败的报错。
2、在两台harbor服务器(172.31.7.153/172.31.7.154)的控制台上分别创建存放基础镜像的镜像仓库baseiamges

3、上传镜像进行验证
(1)在客户端添加非安全镜像仓库(将两台harbor服务器地址均添加到非安全仓库列表中)

vim  /etc/docker/daemon.json
{
  "registry-mirrors": ["https://3lvei2wk.mirror.aliyuncs.com"],
  "insecure-registries":["http://172.31.7.153","http://172.31.7.154"]
}

root@docker_server01:~# systemctl daemon-reload && systemctl restart docker
(2)给本地镜像打tag
docker tag nginx:1.18.0 172.31.7.154/harbor2023/nginx:1.18.0
(3)登录harbor仓库,然后上传镜像
root@docker_server01:~# docker login 172.31.7.154
root@docker_server01:docker push 172.31.7.154/harbor2023/nginx:1.18.0

4、在控制台查看镜像

4.6.2 配置镜像复制

在两台harbor控制台上执行以下操作:
4.6.2.1 配置仓库管理
1、在172.31.7.153 harbor控制台上进行以下操作步骤:
(1)登录harbor控制台,点击系统管理-仓库管理-新建目标

(2)新建目标

参数说明:
提供者:选择harbor即可
目标名:同步的镜像仓库名称,两边保持一致,这里填写baseimages
描述:可以添加描述信息
目标URL:同步镜像的目标harbor服务器的url,这里填写http://172.31.7.154
访问ID:目标harbor服务器的登录账号,这里填写admin
访问密码:目标harbor服务器的登录密码,这里填写admin账号的密码
验证远程证书:是否启用https,如果启用,勾选该选项,如果没有启动,使用的是自签名证书或者非信任证书,则无需勾选

(3)配置完成后,点击测试连接,出现测试连接成功才可以创建

注意:如果新建目标失败,提示测试连接失败,报错如下:

解决方法:将harbor配置文件harbor.yml中hostname参数的值需要修改为harbor服务器的ip地址

2、在172.31.7.154 harbor控制台上进行以下操作步骤:
(1)登录harbor控制台,点击系统管理-仓库管理-新建目标

(2)新建目标

参数说明:
提供者:选择harbor即可
目标名:同步的镜像仓库名称,两边要保持一致,这里填写baseimages
描述:可以添加描述信息
目标URL:同步镜像的目标harbor服务器的url,这里填写http://172.31.7.153
访问ID:目标harbor服务器的登录账号,这里填写admin
访问密码:目标harbor服务器的登录密码,这里填写admin账号的密码
验证远程证书:是否启用https,如果启用,勾选该选项,如果没有启动,使用的是自签名证书或者非信任证书,则无需勾选

(3)配置完成后,点击测试连接,出现测试连接成功才可以创建

4.6.2.2 配置复制管理
1、在172.31.7.153 harbor控制台上:
(1)登录harbor控制台,系统管理-复制管理-新建规则

(2)配置规则

参数说明:
名称:镜像复制的名称,可自定义,这里填baseiamges-sync
描述:镜像复制的描述信息,可自定义
复制模式:建议选择Push-based,因此选择拉取的话,我们不知道目标何时上传镜像,因此选择推送更合适
Push-based:把镜像从本地向目标推送
Pull-based:把镜像从目标拉向本地
目标仓库:点击下拉列表选择刚才创建的仓库,这里为baseimages-http://172.31.7.154
目标:可不填,选择默认即可
触发模式:分为手动、定时、事件驱动,建议选择事件驱动,并勾选下方删除本地资源时同时也删除远程的资源
手动:人为手动触发同步,不建议
定时:指定同步时间,在某个时间点进行同步
事件驱动:一旦出现镜像上传或删除的事件就会触发同步。
带宽:-1是指不做限制
选项:保持默认即可

2、在172.31.7.154 harbor控制台上:
(1)登录harbor控制台,系统管理-复制管理-新建规则

(2)配置规则

参数说明:
名称:镜像复制的名称,可自定义,这里填baseiamges-sync
描述:镜像复制的描述信息,可自定义
复制模式:建议选择Push-based,因此选择拉取的话,我们不知道目标何时上传镜像,因此选择推送更合适
Push-based:把镜像从本地向目标推送
Pull-based:把镜像从目标拉向本地
目标仓库:点击下拉列表选择刚才创建的仓库,这里为baseimages-http://172.31.7.153
目标:可不填,选择默认即可
触发模式:分为手动、定时、事件驱动,建议选择事件驱动,并勾选下方删除本地资源时同时也删除远程的资源
手动:人为手动触发同步,不建议
定时:指定同步时间,在某个时间点进行同步
事件驱动:一旦出现镜像上传或删除的事件就会触发同步。
带宽:-1是指不做限制
选项:保持默认即可

4.6.3 镜像同步验证

1、在客户端向主harbor 172.31.7.153上传镜像
root@docker_server01:~# docker tag centos:7.9.2009 172.31.7.153/baseimages/centos:7.9.2009
root@docker_server01:~# docker push 172.31.7.153/baseimages/centos:7.9.2009
2、在harbor 172.31.7.153控制台上查看镜像

3、在harbor 172.31.7.154 控制台上查看镜像,已经同步成功

4、在控制台查看同步日志,系统管理-复制管理-勾选创建的规则,点击下方复制任务的id

点击右侧日志

查看镜像复制的日志内容

5、在一台主机下载从172.31.7.153上同步过来的镜像(要在一台没有该镜像的主机上下载)
注意:在同步之前要在客户端配置非安全镜像仓库
root@docker_server02:~# docker pull 172.31.7.154/baseimages/centos:7.9.2009

4.6.4 通过负载均衡下载镜像

4.6.4.1 配置haproxy
1、在172.31.7.152和172.31.7.155上安装haproxy并配置

vim /etc/haproxy/haproxy.cfg
listen docker_harbor_80
    bind 172.31.7.188:80
    mode tcp
    balance source
    server harbor01 172.31.7.153:80 check inter 3s fall 3 rise 1
    server harbor02 172.31.7.154:80 check inter 3s fall 3 rise 1

注意:由于没有使用共享存储,这里建议将负载策略设置为source,即源地址hash,确保上传镜像时同一台服务器得请求能访问到相同的目标服务器。如果使用轮询,万一请问过程中被转发到其他服务器,会导致镜像上传到不同服务器,造成镜像不完整
2、重启服务
systemctl enable haproxy && systemctl restart haproxy
如果第二台haproxy重启服务器报错,提示无法绑定,添加以下内容:
增加内核参数:允许绑定非本机的IP

vim   /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1

4.6.4.2 配置keepalived
1、在172.31.7.152上安装keepalived并配置

apt install -y keepalived
cp  /usr/share/doc/keepalived/samples/keepalived.conf.vrrp  /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER       #该节点作为主
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.31.7.188 dev eth0 label eth0:0       #添加vip
    }
}

重启服务
systemctl enable keepalived && systemctl restart keepalived
2、在172.31.7.155上安装keepalived并配置

apt install -y keepalived
cp  /usr/share/doc/keepalived/samples/keepalived.conf.vrrp  /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP      #该节点作为备
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.31.7.188 dev eth0 label eth0:0      #添加vip
    }
}

重启服务
systemctl enable keepalived && systemctl restart keepalived
4.6.4.3 镜像上传下载验证
1、在客户端主机添加非安全镜像仓库172.31.7.188

vim  /etc/docker/daemon.json
{
  "registry-mirrors": ["https://3lvei2wk.mirror.aliyuncs.com"],
  "insecure-registries":["harbor.magedu.com","http://172.31.7.153","http://172.31.7.154","http://172.31.7.188"]
}

2、上传镜像
root@docker_server02:~# docker login 172.31.7.188
root@docker_server02:~# docker tag nginx:1.18.0 172.31.7.188/baseimages/nginx:1.18.0
root@docker_server02:~# docker push 172.31.7.188/baseimages/nginx:1.18.0

在harbor控制台查看镜像

3、下载镜像
root@docker_server02:~# docker pull 172.31.7.188/baseimages/centos:7.9.2009

标签: docker
最后更新:2023年6月8日

袁党生

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 linux学习. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备18039507号-1