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
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
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
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
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
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
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
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
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
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
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
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
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
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
2
3
4
5
6
7
8
9
10
11
12
完成