Kubernetes DevOps环境搭建(三):安装私有镜像仓库Harbor

前言

Harbor官方文档: https://docs.docker.com/compose/install/

如图所示,harbor 需要依赖docker,docker-compose,openssl, 本文将介绍这些内容的安装和配置

一、docker-compose 安装

Harbor依赖于 docker-compose ,所以要先安装 docker-compose

docker-compose官方文档: https://docs.docker.com/compose/install/

(1)在线安装(不推荐,我试过直接使用官方的安装方法,下载非常慢,不太建议使用在线安装)

# 在线下载最新的稳定版docker-compose,建议打开官方文档直接拷贝官方的链接,不然就自己去GitHub看一下最新的docker-compose的版本,替换一下
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# Apply executable permissions to the binary:
$ sudo chmod +x /usr/local/bin/docker-compose

# 创建软链接
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 测试是否安装成功,输出版本信息则代表安装成功
$ docker-compose --version

(2)离线安装(推荐)

docker-compose Github地址: https://github.com/docker/compose/releases

选择下载 docker-compose-Linux-x86_64 版本

把下载好的安装包上传到服务器,进入上传的安装包目录,然后执行操作

# 先进入上传的docker-compose安装包目录,然后执行如下命令将其移动到 `/usr/local/bin`,并改名为“docker-compose”。
$ sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

# 添加可执行权限
$ sudo chmod +x /usr/local/bin/docker-compose

# 创建软链接
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 测试是否安装成功,输出版本信息则代表安装成功
$ docker-compose --version

二、Harbor 安装

Harbor官方文档: https://docs.docker.com/compose/install/

官方的文档提供两种安装形式:在线下载安装和离线安装,在线安装因为国内网络不是特别好,这里推荐使用离线安装的形式

下载离线安装包

Harbor Github 地址:https://github.com/goharbor/harbor/releases

选择对应的安装包下载 harbor-offline-installer-{version}.tgz , {version} 为版本号

安装包上传到服务器,我这里安装的路径是: /home/lenjor/harbor

# 进入安装的路径,解压安装包
$ tar -xvf harbor-offline-installer-v2.2.0-rc1.tgz
# 复制一份配置文件模板 harbor.yml.tmpl , 并命名为 harbor.yml
$ sudo cp harbor.yml.tmpl harbor.yml

解压以后将看到以下的文件,我这里的已经完成了配置文件的复制操作

配置HTTPS证书

官方操作说明文档地址:https://goharbor.io/docs/2.0.0/install-config/configure-https/

1. 生成证书颁发机构证书

# 生成CA证书私钥
$ openssl genrsa -out ca.key 4096
# 生成CA证书,记得以下的所有命令,都要替换成自己的域名,或者ip地址
$ openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
 -key ca.key \
 -out ca.crt

2. 生成服务器证书

# 1)生成私钥
$ openssl genrsa -out yourdomain.com.key 4096
# 2)生成证书签名请求(CSR)
$ openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key yourdomain.com.key \
    -out yourdomain.com.csr

# 3)生成一个x509 v3扩展文件,这里有个坑,如果是域名配置的,就直接把授信域名配置到下面的列表

## 这个是域名的方式的命令,把授信的域名加到列表里
$ cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF


## 这个是IP的方式,直接把后面的域名列表删掉,添加上自己的IP地址(注意 IP: 是有用的,不能删)
$ cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:192.168.56.105


# 4)为你的Harbor主机生成证书
$ openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in yourdomain.com.csr \
    -out yourdomain.com.crt

3. 把证书配置到Harbor和Docker

# 将服务器证书和密钥复制到Harbor主机上的certficates文件夹中, 需要先创建文件夹
$ mkdir /data/cert/ 
$ cp yourdomain.com.crt /data/cert/
$ cp yourdomain.com.key /data/cert/


# 转换yourdomain.com.crt为yourdomain.com.cert,供Docker使用
$ openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert

# 将服务器证书,密钥和CA文件复制到Harbor主机上的Docker证书文件夹中。 敲黑板重点!!必须首先创建适当的文件夹。
$ mkdir -p /etc/docker/certs.d/yourdomain.com/
$ cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
$ cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
$ cp ca.crt /etc/docker/certs.d/yourdomain.com/

配置 harbor.yml

官方文档地址: https://goharbor.io/docs/2.0.0/install-config/configure-yml-file/

# 配置 hostname
hostname: harbor.lenjor.com

# 打开https注释,配置证书地址,如果是按照官方文档操作的,证书就在 /data/cert/ 目录下
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /data/cert/harbor.lenjor.com.crt
  private_key: /data/cert/harbor.lenjor.com.key


# 修改Harbor admin账号的登陆密码
harbor_admin_password: Lenjor123.

# 修改Mysql数据库密码
database:
  # The password for the root user of Harbor DB. Change this before any production use.
  password: Lenjor123.


重启Docker Engine

systemctl restart docker

运行安装程序脚本

# 执行 .prepare 脚本
$ ./prepare

# 执行安装脚本
$ ./install.sh

浏览器打开配置的 hostname 就能打开harbor的登陆页了

网页提示的不安全,是因为没有安装证书,把之前生成的 ca.crt 这证书安装到浏览器,添加信任即可,但是Chrome检测到签发的时间过长也会提示不安全,暂时忽略吧

输入登陆密码登陆,然后创建一个新的项目,我这里新建的是 k8s 项目

查看一下仓库命令,拷贝一下标记tag的命令,在另外一台机器打一个镜像tag

# 对hello-world的镜像打一个tag
$ docker tag hello-world:latest harbor.lenjor.com/k8s/k8s-hello-world:v1.0

另外一台虚拟机使用docker login命令登陆 我们的仓库

# 登陆docker,这里换成自己harbor配置的hostname (ip,或者域名),输入账号和密码登陆
$ docker login harbor.lenjor.com

这里会因为证书没有不是受信任的证书,提示报错,解决方法是

# 编辑docker配置文件
$ vi /etc/docker/daemon.json

# 在json文件中加入自己的域名或者ip,添加仓库授信
{  
   "insecure-registries":["私库地址/域名"]
}

# 保存退出以后重启docker再登陆就不会报错了
$ systemctl daemon-reload
$ systemctl restart docker

再次登陆,推送镜像到仓库

# 登陆docker,这里换成自己harbor配置的hostname (ip,或者域名),输入账号和密码登陆
$ docker login harbor.lenjor.com

# 从harbor仓库的命令页拷贝一下推送命令,然后修改成自己要推送的镜像,如我刚刚打了一个 k8s-hello-world:v1.0 镜像
$ docker push harbor.lenjor.com/k8s/k8s-hello-world:v1.0

Harbor仓库查看推送结果

可以看到,我们的仓库已经是有我们刚刚推送上去的镜像了

从Harbor的仓库中拉取镜像

# 先把本地的hello-world镜像删除
$ docker rmi harbor.lenjor.com/k8s/k8s-hello-world:v1.0
# 查看删除是否成功
$ docker images

# 从私有仓库拉取镜像
$ docker pull harbor.lenjor.com/k8s/k8s-hello-world:v1.0

三、常用操作命令

# 停止harbor,在harbor的安装目录执行
$ sudo docker-compose stop

# 启动harbor,在harbor的安装目录执行
$ sudo docker-compose start

# 重新配置harbor,在harbor的安装目录执行
$ sudo docker-compose down -v
$ vim harbor.yml
$ sudo prepare
$ sudo docker-compose up -d

# 删除Harbor的容器,同时将镜像数据和Harbor的数据库文件保留在文件系统中:
$ sudo docker-compose down -v

# 删除Harbor的数据库和镜像数据以进行重新安装:
$ rm -r /data/database
$ rm -r /data/registry