harbor保姆级教程
原始文档
阅读原始文档获取最佳体验《harbor保姆级教程》
引言
在本地部署Harbor(一个开源的企业级Docker Registry项目)有多个重要原因,这些原因涵盖了安全性、性能优化、成本控制以及对特定需求的支持等方面。下面是一些主要理由:
-
**proxy cache:**harbor本身支持代理缓存,也就是说可以作为一个docker仓库镜像,而且还支持quay.io gcr等等仓库,这对于中国大陆是非常有用的,可以找一台能正常访问dokcer.io和quay.io等等仓库的电脑,然后部署harbor,其它计算机就可以将其作为一个容器仓库镜像了。具体看官方文档Harbor docs | Configure Proxy Cache (goharbor.io)
-
增强安全性:通过在本地部署Harbor,企业可以更好地控制其容器镜像的安全性。这包括实施更严格的身份验证和授权机制、使用HTTPS加密传输数据、以及定期扫描镜像以发现潜在的安全漏洞等措施。此外,本地部署还允许组织根据自己的安全策略来配置环境,比如限制外部访问。
-
提高性能与可靠性:当开发团队频繁地拉取或推送镜像时,在本地拥有一个Registry能够显著减少网络延迟问题,加快构建过程的速度。同时,由于所有操作都在内部网络中完成,因此可以避免因公网不稳定而导致的服务中断情况,从而提高了系统的可靠性和可用性。
-
降低成本:虽然公共云服务提供商如Docker Hub提供了免费的存储空间,但对于大规模使用场景下,可能会产生额外费用(例如超出免费配额后的带宽费用)。而自建私有Registry则可以根据实际需要灵活调整资源分配,长期来看有助于节省成本开支。
-
满足合规要求:对于某些行业来说,可能存在着关于数据存储位置的具体法规限制。在这种情况下,将敏感信息保存在本地服务器上可以帮助企业遵守相关法律法规,确保符合行业标准。
-
支持高级功能:Harbor不仅是一个简单的Registry,它还提供了一些高级特性,比如基于角色的访问控制(RBAC)、多租户支持、图形界面管理等。这些功能使得管理和维护更加便捷高效,同时也为不同部门之间共享资源提供了便利。
总之,在本地部署Harbor能够让企业在享受容器技术带来的灵活性与效率的同时,也能够更好地保护自己的资产,并且根据自身业务特点进行定制化设置。这对于追求高度可控性、安全性和高性能的企业来说是非常重要的。
部署
参考资料:Harbor docs | Configure HTTPS Access to Harbor (goharbor.io)
下载安装包
下载地址:Releases · goharbor/harbor (github.com)
解压:
tar xzvf harbor-offline-installer-v2.11.2.tgz
生成csr
生成一个CSR(certificate signing request)
openssl req -new -sha256 -newkey rsa:4096 -keyout harbor.dltornado2.com.key -out harbor.dltornado2.com.csr -nodes -config <(
cat <<-EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = ZhongShan
L = ZhongShan
O = mingyang
OU = IT
CN = harbor.dltornado2.com
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.dltornado2.com
DNS.2=dltornado2.com
DNS.3=harbor
EOF
)
Microsoft CA颁发证书
在CA服务器上执行操作
scp mywind@192.168.124.12:/home/mywind/harbor.dltornado2.com.csr C:\Users\adm\
运行下行命令后,会自动弹出一个框,选择需要使用的证书颁发机构,然后选择颁发的证书存放路径,得到的是一个harbor.dltornado2.com.cer文件
certreq -submit -attrib "CertificateTemplate:WebServer" "C:\Users\adm\harbor.dltornado2.com.csr"
导出Microsoft CA的root ca供客户端计算机使用
root-ca.cer是一个ca certificate,其作用是为了让客户端计算机信任web服务器上的证书(因为证书就是此root ca颁发的)
将颁发的证书传回linux系统
scp .\harbor.dltornado2.com.cer mywind@192.168.124.12:/home/mywind/harbor.dltornado2.com.cer
将CA颁发的证书转换为pem格式的以供非Windows系统使用
openssl x509 -in harbor.dltornado2.com.cer -outform PEM -out harbor.dltornado2.com.pem
让web服务器信任证书
注意不是安装ca(根ca)证书,只是在web服务器上执行操作,web服务器可以不安装root ca
在harbor所在服务器上执行下列命令:
sudo cp harbor.dltornado2.com.pem harbor.dltornado2.com.key /usr/local/share/ca-certificates/
sudo update-ca-certificates
配置nginx以使用证书,本节以harbor为例演示,harbor是用docker部署的
先要停止harbor,具体可以参考此文《harbor》 nginx需要使用pem格式或者crt格式的证书
编辑harbor.yml,证书路径不要弄错,只需要指定服务器证书和key文件(私钥)即可
sudo cp harbor.dltornado2.com.key harbor.dltornado2.com.pem /data/cert/
修改harbor.yml文件
cd harbor/
cp harbor.yml.tmpl harbor.yml
运行安装脚本
参考资料:Harbor docs | Configure HTTPS Access to Harbor (goharbor.io)
允许https
./prepare
sudo ./install.sh --with-trivy
查看当前正在运行的容器:
配置harbor
用浏览器访问https://harbor.dltornado2.com/ 因为我用的测试电脑已经加入了域,自动就信任ca了,所以没有单独安装root ca
默认用户名是admin 默认密码是Harbor12345
配置proxy cache–docker.io
参考资料:Harbor docs | Configure Proxy Cache (goharbor.io)
创建Replication Endpoints,本节演示的是代理docker hub,harbor也支持代理quay.io等等常用的容器仓库,只需要更改提供者和目标url即可。
新建一个项目
验证proxy cache
另外一台主机安装了docker,用此主机测试从harbor拉取镜像是否正常
首先要在此主机上安装证书,步骤与2.4节一样,否则会报错,如下:
docker pull harbor.dltornado2.com/dockerhub_proxy/busybox:latest
拉取成功
harbor上也显示了相应记录,这说明代理没有问题
再找另外一台主机,用docker拉取同样的容器,观察harbor的行为
这一次拉取镜像非常快
从harbor中可以看出,这一次并没有用到代理,而是直接用缓存提供服务,速度极快。
nerdctl(默认使用containerd作为容器运行时)也是可以从harbor拉取镜像的:
配置proxy cache–registry.k8s.io
在我的实验环境下,部署harbor的主机本身就可以访问registry.k8s.io,然而其它主机无法访问,对于这种情况,可以采用docker registry作为代理提供者,如下图所示:
配置proxy cache–quay.io
参考资料:Harbor docs | Creating Replication Endpoints (goharbor.io)
这个仓库必须要认证才行,否则无法成功添加,先去https://quay.io/网站注册一个账户,其实就是redhat的账户,需要注意的是,注册之后还要进行一个人机验证,这个人机验证的界面在大陆是无法看到的,所以需要用魔法
认证也不是直接填用户名和密码,而是一个json文件,直接把json文件内容粘贴到“访问密码”一栏就可以了
json文件格式如下:
account_name指的是quay.io账户名,docker_cli_password可以在quay官网生成,oauth2_token这个是可选的,如果需要自动创建organization,则需要oauth2_token
创建一个镜像代理类型的项目
ubuntu系统安装root ca
注意:ubuntu系统只支持pem格式的证书(后缀名必须为crt)
参考官方文档:Install a root CA certificate in the trust store - Ubuntu Server documentation
将cer格式转换为crt格式的证书
Microsoft CA导出的证书格式是cer,需要转换为crt格式的
openssl x509 -in root-ca.cer -out root-ca.crt -outform PEM
安装root ca
安装root ca,将root-ca.crt文件拷贝到目标客户端计算机(需要访问web网站的计算机)
sudo scp mywind@192.168.124.12:/home/mywind/root-ca.crt ./
#安装证书root ca
sudo cp root-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
验证
docker pull harbor.dltornado2.com/dockerhub_proxy/redis
重新配置harbor为http而不是https
参考资料:Harbor docs | Reconfigure Harbor and Manage the Harbor Lifecycle (goharbor.io)
重新配置的过程
如果已经部署了harbor,想要修改配置,比如将https改为http,或者是更改yaml文件的配置,也是可以实现的。
先停止harbor
cd ~/harbor
sudo docker compose down -v
修改harbor.yml文件,禁用https,只用http
sudo ./prepare
重新启动harbor
sudo docker compose up -d
验证:docker ps
配置docker以允许从http私有仓库拉取image
默认情况下,docker不运行从http拉取image,更改也很容易
sudo nano /etc/docker/daemon.json
添加下面的内容即可
{
"insecure-registries" : ["harbor.dltornado2.com"]
}
重启docker服务以生效
sudo systemctl restart docker
验证:
故障诊断
microk8s无法从harbor拉取镜像
我安装microk8s时,用了下面的lauch configuration,发现kubelet总是无法正常拉取镜像,ca已经安装了,直接用docker或者nerdctl拉取镜像是正常的
sudo mkdir -p /var/snap/microk8s/common
sudo tee /var/snap/microk8s/common/.microk8s.yaml > /dev/null <<'EOF'
# custom launch configuration for MicroK8s
---
version: 0.1.0
extraKubeletArgs:
--cluster-domain: cluster.local
--cluster-dns: 10.152.183.10
addons:
- name: dns
- name: hostpath-storage
- name: ingress
- name: nvidia
- name: observability
containerdRegistryConfigs:
# Use `https://harbor.dltornado2.com/dockerhub_proxy` as a DockerHub registry mirror.
docker.io: |
[host."https://harbor.dltornado2.com/dockerhub_proxy"]
capabilities = ["pull", "resolve"]
# Use `https://hub.geekery.cn` as a DockerHub registry mirror.
#docker.io: |
# [host."https://hub.geekery.cn"]
# capabilities = ["pull", "resolve"]
# Use `https://harbor.dltornado2.com/quay_proxy` as a quay registry mirror.
quay.io: |
[host."https://harbor.dltornado2.com/quay_proxy"]
capabilities = ["pull", "resolve"]
# Use `https://registry.aliyuncs.com/google_containers` as a gcr registry mirror.
registry.k8s.io: |
[host."https://harbor.dltornado2.com/k8s_proxy"]
capabilities = ["pull", "resolve"]
#registry.k8s.io: |
# [host."https://k8s.m.daocloud.io"]
# capabilities = ["pull", "resolve"]
#registry.k8s.io: |
# [host."https://registry.aliyuncs.com/google_containers"]
# capabilities = ["pull", "resolve"]
#Containerd will use this proxy when pulling images from the upstream repositories
extraContainerdEnv:
http_proxy: http://192.168.124.19:7897
https_proxy: http://192.168.124.19:7897
no_proxy: 10.0.0.0/8,127.0.0.1,192.168.0.0/16,172.16.0.0/12
EOF
报错信息如下:其实下面显示的sha值是错误的,harbor上的值不是这个,不知道什么原因(经过分析,我猜测有可能是低版本的containerd有bug,看了日志,发现MicroK8s v1.31.2版本的containerd版本是1.16,而我用nerdctl测试时,使用的containerd版本是2.0.0,docker的版本用的是最新的)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m49s default-scheduler Successfully assigned kube-system/calico-node-t6wfg to custom-ubuntu2404-server
Normal Pulling 2m1s (x3 over 2m43s) kubelet Pulling image "docker.io/calico/cni:v3.25.1"
Warning Failed 2m1s (x3 over 2m43s) kubelet Failed to pull image "docker.io/calico/cni:v3.25.1": rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/calico/cni:v3.25.1": failed to unpack image on snapshotter overlayfs: unexpected media type text/html for sha256:d8c39dc08ef22a070c56e198bd5c5f6c04a5823c8ed47c83fe4e7c5d45df3df6: not found
Warning Failed 2m1s (x3 over 2m43s) kubelet Error: ErrImagePull
Warning DNSConfigForming 95s (x8 over 2m49s) kubelet Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: 192.168.124.7 223.5.5.5 172.25.0.250
Normal BackOff 95s (x4 over 2m43s) kubelet Back-off pulling image "docker.io/calico/cni:v3.25.1"
Warning Failed 95s (x4 over 2m43s) kubelet Error: ImagePullBackOff
我将harbor配置为了http,仍然报错,报错提示是一样的: