harbor保姆级教程

harbor保姆级教程

1747658818412_edit_1291360527219098.png

原始文档

阅读原始文档获取最佳体验《harbor保姆级教程》

引言

在本地部署Harbor(一个开源的企业级Docker Registry项目)有多个重要原因,这些原因涵盖了安全性、性能优化、成本控制以及对特定需求的支持等方面。下面是一些主要理由:

  1. **proxy cache:**harbor本身支持代理缓存,也就是说可以作为一个docker仓库镜像,而且还支持quay.io  gcr等等仓库,这对于中国大陆是非常有用的,可以找一台能正常访问dokcer.io和quay.io等等仓库的电脑,然后部署harbor,其它计算机就可以将其作为一个容器仓库镜像了。具体看官方文档Harbor docs | Configure Proxy Cache (goharbor.io)

  2. 增强安全性:通过在本地部署Harbor,企业可以更好地控制其容器镜像的安全性。这包括实施更严格的身份验证和授权机制、使用HTTPS加密传输数据、以及定期扫描镜像以发现潜在的安全漏洞等措施。此外,本地部署还允许组织根据自己的安全策略来配置环境,比如限制外部访问。

  3. 提高性能与可靠性:当开发团队频繁地拉取或推送镜像时,在本地拥有一个Registry能够显著减少网络延迟问题,加快构建过程的速度。同时,由于所有操作都在内部网络中完成,因此可以避免因公网不稳定而导致的服务中断情况,从而提高了系统的可靠性和可用性。

  4. 降低成本:虽然公共云服务提供商如Docker Hub提供了免费的存储空间,但对于大规模使用场景下,可能会产生额外费用(例如超出免费配额后的带宽费用)。而自建私有Registry则可以根据实际需要灵活调整资源分配,长期来看有助于节省成本开支。

  5. 满足合规要求:对于某些行业来说,可能存在着关于数据存储位置的具体法规限制。在这种情况下,将敏感信息保存在本地服务器上可以帮助企业遵守相关法律法规,确保符合行业标准。

  6. 支持高级功能:Harbor不仅是一个简单的Registry,它还提供了一些高级特性,比如基于角色的访问控制(RBAC)、多租户支持、图形界面管理等。这些功能使得管理和维护更加便捷高效,同时也为不同部门之间共享资源提供了便利。

总之,在本地部署Harbor能够让企业在享受容器技术带来的灵活性与效率的同时,也能够更好地保护自己的资产,并且根据自身业务特点进行定制化设置。这对于追求高度可控性、安全性和高性能的企业来说是非常重要的。

部署

参考资料:Harbor docs | Configure HTTPS Access to Harbor (goharbor.io)

下载安装包

下载地址:Releases · goharbor/harbor (github.com)

image.png

解压:

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供客户端计算机使用

image.png

image.png

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

image.png

运行安装脚本

参考资料:Harbor docs | Configure HTTPS Access to Harbor (goharbor.io)

允许https

./prepare
sudo ./install.sh --with-trivy

image.pngimage.png

查看当前正在运行的容器:

image.png

配置harbor

用浏览器访问https://harbor.dltornado2.com/  因为我用的测试电脑已经加入了域,自动就信任ca了,所以没有单独安装root ca

默认用户名是admin  默认密码是Harbor12345

image.png

image.png

配置proxy cache–docker.io

参考资料:Harbor docs | Configure Proxy Cache (goharbor.io)

创建Replication Endpoints,本节演示的是代理docker hub,harbor也支持代理quay.io等等常用的容器仓库,只需要更改提供者和目标url即可。

image.png

新建一个项目

image.png

验证proxy cache

另外一台主机安装了docker,用此主机测试从harbor拉取镜像是否正常

首先要在此主机上安装证书,步骤与2.4节一样,否则会报错,如下:

image.png

docker pull harbor.dltornado2.com/dockerhub_proxy/busybox:latest

拉取成功

image.png

harbor上也显示了相应记录,这说明代理没有问题

image.png

image.png

再找另外一台主机,用docker拉取同样的容器,观察harbor的行为

这一次拉取镜像非常快

image.png

从harbor中可以看出,这一次并没有用到代理,而是直接用缓存提供服务,速度极快。

image.png

nerdctl(默认使用containerd作为容器运行时)也是可以从harbor拉取镜像的:

image.png

配置proxy cache–registry.k8s.io

在我的实验环境下,部署harbor的主机本身就可以访问registry.k8s.io,然而其它主机无法访问,对于这种情况,可以采用docker registry作为代理提供者,如下图所示:

image.png

image.png

配置proxy cache–quay.io

参考资料:Harbor docs | Creating Replication Endpoints (goharbor.io)

这个仓库必须要认证才行,否则无法成功添加,先去https://quay.io/网站注册一个账户,其实就是redhat的账户,需要注意的是,注册之后还要进行一个人机验证,这个人机验证的界面在大陆是无法看到的,所以需要用魔法

认证也不是直接填用户名和密码,而是一个json文件,直接把json文件内容粘贴到“访问密码”一栏就可以了

image.png

json文件格式如下:

account_name指的是quay.io账户名,docker_cli_password可以在quay官网生成,oauth2_token这个是可选的,如果需要自动创建organization,则需要oauth2_token

image.pngimage.png

创建一个镜像代理类型的项目

image.png

image.png

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

image.png

重新配置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

image.png

sudo ./prepare

重新启动harbor

sudo docker compose up -d

验证:docker ps

image.png

配置docker以允许从http私有仓库拉取image

默认情况下,docker不运行从http拉取image,更改也很容易

sudo nano /etc/docker/daemon.json

添加下面的内容即可

{
  "insecure-registries" : ["harbor.dltornado2.com"]
}

重启docker服务以生效

sudo systemctl restart docker

验证:

image.png

故障诊断

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,仍然报错,报错提示是一样的:

image.png

关注微信公众号“AI发烧友”,获取更多IT开发运维实用工具与技巧,还有很多AI技术文档!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值