背景

Harbor高可用解决单点故障的问题,由于较高的go版本,基于传统的证书签发会有问题,需要基于SAN的证书签发;本文将介绍基于开源软件Haproxy实现负载均衡并且通过Keepalived实现高可用的配置方法。

主机规划

组件名称

角色

主机名

IP

Harbor1

node1

ubuntu01

192.168.2.131

Harbor2

node2

ubuntu02

192.168.2.132

haproxy+keepalived

master

ubuntu03

192.168.2.133

haproxy+keepalived

backup

ubuntu03

192.168.2.134

VIP

192.168.2.188

拓扑结构

Harbor 安装 升级 多架构_Harbor 安装 升级 多架构


说明:两种方案实现harbor高可用,本文将以第二种方式实现harbor的高可用

部署步骤

环境准备

安装docker(已安装请忽略)

Ubuntu 14.04/16.04(使用 apt-get 进行安装)

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

CentOS 7(使用 yum 进行安装)

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

验证
docker version

安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #下载docker-compose
验证:
docker-compose version

安装harbor

cd /usr/local/src
wget https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-installer-v2.5.3.tgz
tar xvf harbor-offline-installer-v2.5.3.tgz -C /app/
cd /app/harbor
cp harbor.yml.tmpl harbor.yml

#基于SAN的证书签发
参考地址:https://goharbor.io/docs/2.4.0/install-config/configure-https/
cd /app/harbor
mkdir certs
cd certs
#执行以下生成证书的命令
openssl genrsa -out ca.key 4096	

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=zhangjw132.com" \
 -key ca.key \
 -out ca.crt
 
openssl genrsa -out zhangjw.com.key 4096

openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=zhangjw.com" \
    -key zhangjw.com.key \
    -out zhangjw.com.csr
	
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=zhangjw.com
DNS.2=reg.zhangjw.com
DNS.3=ubuntu02
EOF

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in zhangjw.com.csr \
    -out zhangjw.com.crt
证书签发完成后,编辑harbor配置文件
vim harbor.yml
hostname: reg.zhangjw.com  #修改访问harbor的域名,也可以使ip
#证书签发配置
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /app/harbor/certs/zhangjw.com.crt
  private_key: /app/harbor/certs/zhangjw.com.key

harbor_admin_password: 123456   #admin访问密码
一般修改这三处,即可开始安装

./install.sh --with-trivy --with-chartmuseum #开启镜像扫描和chart存储功能

等待安装完成之后,使用docker ps命令查看harbor各组件处于healthy状态表示安装成功
如出现某些组件不是healthy状态,使用docker logs container 查看具体的错误原因

FAQ
Can't load /root/.rnd into RNG
140590831669696:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd
解决方式: 
 cd /root
 openssl rand -writerand .rnd

docker客户端配置认证

mkdir /etc/docker/certs.d/reg.zhangjw.com -p #注意:创建的目录一定要与域名保持一致
scp /certs/zhangjw.com.crt ip:/etc/docker/certs.d/reg.zhangjw.com/

vim /etc/hosts #添加host文件解析
ip reg.zhangjw.com
#重启服务
systemctl daemon-reload
systemctl restart docker

#使用https的方式访问仓库,账号admin
docker login https://reg.zhangjw.com

登录成功后,测试验证
docker pull busybox:latest
docker tag busybox:latest reg.zhangjw.com/library/busybox:latest
docker push reg.zhangjw.com/library/busybox:latest
推送镜像到仓库成功后,表示客户端认证成功

同上132节点上执行同样的步骤,注意两个节点的域名要不一致

安装配置keepalived和haproxy

内核优化
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1:表示允许服务绑定一个本机不存在的 ipv4 的 IP地址,适用于服务需要绑定 vip 的场景。
net.ipv6.ip_nonlocal_bind = 1:表示允许服务绑定一个本机不存在的 ipv6 的 IP地址。适用于服务需要绑定 vip 的场景。
net.ipv4.ip_forward = 1: 表示允许内核路由转发功能
net.ipv6.ip_forward = 1: 表示允许内核路由转发功能

apt intall -y haproxy keepalived
cp  /usr/share/doc/keepalived/samples/keepalived.conf.vrrp  /etc/keepalived/keepalived.conf
keepalived关键配置
    virtual_ipaddress {
        # optional label. should be of the form "realdev:sometext" for
        # compatibility with ifconfig.
        192.168.2.188 dev ens33 label ens33:1
        192.168.2.189 dev ens33 label ens33:2
    }
	track_script {
	        chk_haproxy
	    }
	vrrp_script chk_haproxy {
		script  "killall -0 haproxy" 
		interval  2    
		weight  -2
		fall  3
		rise  1
	}
systemctl restart keepalived.service && systemctl enable keepalived.service #重启并设置开机自启动

haproxy关键配置
listen harbor-80
  bind 192.168.2.188
  mode tcp
  balance source #注意负载均衡调度算法一定要选择源地址哈希(source)
  server ubuntu01 192.168.2.131:80 check inter 3s fall 3 rise 1
  server ubuntu02 192.168.2.132:80 check inter 3s fall 3 rise 1

listen harbor-443
  bind 192.168.2.188
  mode tcp
  balance source #注意负载均衡调度算法一定要选择源地址哈希(source)
  server ubuntu01 192.168.2.131:443 check inter 3s fall 3 rise 1
  server ubuntu02 192.168.2.132:443 check inter 3s fall 3 rise 1
systemctl restart haproxy.service && systemctl enable haproxy.service
#重启并设置开机自启动

配置harbor镜像双向同步

仓库管理-新建目标

Harbor 安装 升级 多架构_Harbor 安装 升级 多架构_02


测试连接成功后

复制管理-新建规则创建对应的规则即可