harbor单机部署及ssl开启及containerd配置

本次安装为单机版离线安装,部署在一台虚拟机中。

之所以做vm部署,没有直接部署到k8s中,是因为刚刚部署的k8s还没有做存储,而做存储(rook-ceph)又需要拉取镜像仓库中的镜像,因为rook-ceph中的部分镜像因为墙的原因pull不下来的,试过替换为阿里的源,发现阿里的google_containers中还没有同步rook-ceph的部分镜像(rook-ceph 1.11.9版本)。所以在vm中单独搭一个仓库,供后续使用。

todo 后期改为高可用。

准备机器

host hostname os hardware
10.20.24.50 10-20-24-50 centos7.9 cpu:4c 内存: 8G 硬盘:500G

# 1. 安装docker最新版及docker-compose

harbor要求docker版本不低于1.17 要下载高版本,直接装最新的。

yum remove docker \
  docker-common\
  docker-selinux \
  docker-engine
  
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2  
  
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  

yum install docker-ce -y

systemctl enable docker
systemctl start docker

docker version
docker version
Client: Docker Engine - Community
 Version:           24.0.4
 API version:       1.43
 Go version:        go1.20.5
 Git commit:        3713ee1
 Built:             Fri Jul  7 14:54:21 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.4
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.5
  Git commit:       4ffc614
  Built:            Fri Jul  7 14:53:26 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# 关闭防火墙 内网直接关比较省事,要暴露到公网的话要开启安全组
systemctl stop firewalld
systemctl disable firewalld
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 安装docker-compose
wget https://github.com/docker/compose/releases/download/v2.19.1/docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod 777 /usr/local/bin/docker-compose

docker-compose --version
Docker Compose version v2.19.1
1
2
3
4
5
6
7

# 2. 下载安装包

# 下载离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz
tar zxvf harbor-offline-installer-v2.8.2.tgz

ls
harbor-offline-installer-v2.8.2.tgz    harbor

cp harbor/harbor.yml.tmpl harbor/harbor.yml 
1
2
3
4
5
6
7
8

# 3. 生成ssl证书

生成证书颁发机构证书

mkdir harborssl/

ls
harbor-offline-installer-v2.8.2.tgz    harbor  harborssl

cd harborssl

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=10.20.24.50" -key ca.key -out ca.crt #CN写harbor仓库的ip,如果要域名访问的话就写域名。

ls -l
-rw-r--r--. 1 root root 2025 7月  10 01:11 ca.crt
-rw-r--r--. 1 root root 3243 7月  10 01:10 ca.key
1
2
3
4
5
6
7
8
9
10
11
12
13
14

生成服务器证书

openssl genrsa -out 10.20.24.50.key 4096  
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.20.24.50" -key 10.20.24.50.key -out 10.20.24.50.csr	#CN写harbor仓库的ip,如果要域名访问的话就写域名。

ls -l
-rw-r--r--. 1 root root 1704 7月  10 01:12 10.20.24.50.csr
-rw-r--r--. 1 root root 3243 7月  10 01:11 10.20.24.50.key
-rw-r--r--. 1 root root 2025 7月  10 01:11 ca.crt
-rw-r--r--. 1 root root 3243 7月  10 01:10 ca.key
1
2
3
4
5
6
7
8

生成x509 v3文件

# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:10.20.24.50 #如果是域名访问就写于明
EOF

ls -l
-rw-r--r--. 1 root root 1704 7月  10 01:12 10.20.24.50.csr
-rw-r--r--. 1 root root 3243 7月  10 01:11 10.20.24.50.key
-rw-r--r--. 1 root root 2025 7月  10 01:11 ca.crt
-rw-r--r--. 1 root root 3243 7月  10 01:10 ca.key
-rw-r--r--. 1 root root  203 7月  10 01:16 v3.ext
1
2
3
4
5
6
7
8
9
10
11
12
13
14

使用刚生成的v3.ext文件生成证书

openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in 10.20.24.50.csr -out 10.20.24.50.crt # 如果是域名访问替换成域名

ls -l
-rw-r--r--. 1 root root 2049 7月  10 01:17 10.20.24.50.crt
-rw-r--r--. 1 root root 1704 7月  10 01:12 10.20.24.50.csr
-rw-r--r--. 1 root root 3243 7月  10 01:11 10.20.24.50.key
-rw-r--r--. 1 root root 2025 7月  10 01:11 ca.crt
-rw-r--r--. 1 root root 3243 7月  10 01:10 ca.key
-rw-r--r--. 1 root root   17 7月  10 01:17 ca.srl
-rw-r--r--. 1 root root  203 7月  10 01:16 v3.ext
1
2
3
4
5
6
7
8
9
10

# 4. 为Harbor和docker提供证书

为docker提供证书

openssl x509 -inform PEM -in 10.20.24.50.crt -out 10.20.24.50.cert # 如果是域名访问替换成域名

mkdir -p /etc/docker/certs.d/10.20.24.50/ # 如果是域名访问替换成域名

cp 10.20.24.50.cert /etc/docker/certs.d/10.20.24.50/
cp 10.20.24.50.key /etc/docker/certs.d/10.20.24.50/
cp ca.crt /etc/docker/certs.d/10.20.24.50

[root@10-20-24-50 harborssl]# ll /etc/docker/certs.d/10.20.24.50/
总用量 16
-rw-r--r--. 1 root root 2049 7月  10 01:19 10.20.24.50.cert
-rw-r--r--. 1 root root 3243 7月  10 01:20 10.20.24.50.key
-rw-r--r--. 1 root root 2025 7月  10 01:20 ca.crt

# 重启docker
systemctl restart docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

为harbor提供证书

mkdir -p /data/cert/
cp 10.20.24.50.crt /data/cert/
cp 10.20.24.50.key /data/cert/

cd ../harbor

vi harbor.yaml
1
2
3
4
5
6
7

编辑内容

hostname: 10.20.24.50  # 修改为harbor的ip

http:  
  port: 80

https:
  port: 443
  certificate: /data/cert/10.20.24.50.crt  # 指定证书位置
  private_key: /data/cert/10.20.24.50.key  # 指定证书位置
1
2
3
4
5
6
7
8
9

安装

# 安装
./install.sh

# 开启ssl
./prepare

# 重启harbor
docker-compose down -v
docker-compose up -d
1
2
3
4
5
6
7
8
9

# 5. 为k8s的containerd配置证书

不配置的话在pull镜像时会报x509: certificate signed by unknown authority

cd ../harborssl
vi copy_cert.sh

# 写入一下内容

#!/bin/bash
# file name: copy_cert.sh

if [ $# -eq 0 ]
then
    echo "No arguments supplied. Please provide IP addresses."
    exit 1
fi

for IP in "$@"
do
    scp ca.crt root@$IP:/etc/containerd/10.20.24.50
done

# 保存后赋予执行权限
chmod +x copy_cert.sh

# 运行脚本
./copy_cert.sh 10.20.24.51 10.20.24.54 10.20.24.55 10.20.24.56
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

登陆到k8s的每个节点中

vi /etc/containerd/config.toml

# 找到registry配置部分,修改为以下内容

    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = ""

      [plugins."io.containerd.grpc.v1.cri".registry.auths]


      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.20.24.50"]
           endpoint = ["https://10.20.24.50"]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."10.20.24.50".tls]
           ca_file = "/etc/containerd/10.20.24.50/ca.crt"
        [plugins."io.containerd.grpc.v1.cri".registry.configs."10.20.24.50".auth]
           username = "admin"
           password = "Harbor12345"

    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
      tls_cert_file = ""
      tls_key_file = ""
      
# 保存后重启
systemctl daemon-reload
systemctl restart containerd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

配置crictl用于调试

vi /etc/crictl.yaml

# 添加一下内容
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true

# 保存就可以了,立刻生效

# 测试
crictl pull 10.20.24.50/library/xxxxxx:xxx
1
2
3
4
5
6
7
8
9
10
11
12

完成

上次更新: 2023/7/13 10:22:50