怎么从自签名的Harbor 容器镜像仓库里拉镜像

992 阅读4分钟

怎么快速部署一个 Harbor

我是通过helm部署的, chart是从 Artifact Hub 仓库里找到的。

现将对应repo添加到本地helm,

helm repo add harbor https://helm.goharbor.io

然后更新本地repo

helm repo update

就可以愉快的安装了

helm install my-harbor harbor/harbor --version 1.11.1 -f ./values.yaml

./values.yaml 是我修改过后的配置, 主要是修改了admin密码, 网络类型和证书名称。

image.png

部署好了后, 需要等待所有的 pod 就绪。

image.png

pod 就绪后, 查看svc, 找到登录 harbor的url地址

image.png

如图所示, 我用的是NodePort方式访问。 前端我配置了 LoadBalancer。

为什么镜像仓库会使用自签名?

由于没有认证的 tls 证书, 所以我只能使用自签名的证书。

自签名的证书最大的问题是公网访问的时候会报tls错误, 而内网使用的时候, 需要自己提前在使用的每个节点配置自签名证书。

自签名的证书在哪里下载?

在 Harbor 的项目列表页面上, 有一个公钥下载的按钮, 可以下载到 ca.crt 证书文件。

怎么在 Docker 上从自签名镜像库拉镜像?

对于使用自签名证书的harbor,要让docker信任该证书并从harbor拉取镜像,有两种方法:

  1. 在docker中配置harbor的CA证书首先需要得到harbor的CA证书,然后执行以下命令将其添加到docker的信任库:
bash
sudo cp harbor_ca.crt /etc/docker/certs.d/harbor.yourdomain.com/

harbor.yourdomain.com是harbor的服务器地址或域名。添加证书后,docker会信任harbor使用的证书,可以正常从harbor拉取镜像。

  1. 在docker daemon.json中配置insecure registries这种方法不推荐在生产环境使用,会有安全风险。但可以用于测试环境。编辑/etc/docker/daemon.json文件,添加如下配置:
json
{
  "insecure-registries":["harbor.yourdomain.com"] 
}

这样会跳过harbor的证书校验(http服务同样适用该方法),让docker可以直接从harbor拉取镜像。重新启动docker后生效。

所以,对于使用自签名证书的harbor,推荐的方式是将harbor的CA证书配置到docker中,这样可以让docker信任harbor使用的证书,同时也不会引入安全漏洞。

怎么使用 Podman 从自签名镜像库拉镜像?

对于podman,可以通过两种方式跳过registry的证书验证来pull镜像:

  1. 使用--tls-verify=false参数:
bash
podman pull harbor.yourdomain.com/library/ubuntu:latest --tls-verify=false

这个参数会让podman忽略registry的证书校验,直接pull镜像。

  1. 修改registries.conf配置文件,添加insecure_registries配置:
unqualified-search-registries = ["harbor.yourdomain.com"] 

然后重启podman服务:

bash 
sudo systemctl restart podman

这个方法会让podman总是忽略对harbor的证书校验。registries.conf文件位置:

  • /etc/containers/registries.conf (Linux) 
  • ~/.config/containers/registries.conf (Mac)
  • C:\Users\Username.config\containers\registries.conf (Windows)

以上两种方法都会存在一定安全风险,生产环境下不推荐使用。正确的方式是为registry配置有效的证书,然后podman可以正常验证并pull镜像。

另外,和docker不同的是,目前podman还不支持将CA证书配置到podman中来验证自签证书的registry。所以对于使用自签证书的私有registry,podman只能使用以上两种无需证书验证的方式来pull镜像。

怎么修改 harbor 的访问域名呢?

通过helm部署harbor时,可以通过以下几种方式配置harbor的访问域名:

  1. 在values.yaml文件中配置hostname:
yaml
hostname: harbor.yourdomain.com

这会让harbor使用harbor.yourdomain.com作为访问域名。你需要确保该域名能够解析到harbor所在节点的IP地址。

  1. 在ingress配置中设置host:
yaml
ingress:
  hosts:
    core: harbor.yourdomain.com
  tls: [] 

这和第一种方法类似,也是让harbor使用harbor.yourdomain.com作为域名,需要解析到harbor节点IP。

  1. 使用external URL:如果你有一个外部的、可以访问到harbor的URL,可以配置它作为harbor的external URL:
yaml
externalURL: https://harbor.mycompany.com

这会让harbor在页面显示等使用 harbor.mycompany.com 需要确保这个外部URL能正常访问到harbor。

  1. 在部署harbor的节点上绑定DNS域名当使用helm部署harbor后,可以绑定一个域名比如harbor.yourdomain.com到部署harbor的节点IP地址上。这时候直接访问该域名就可以访问到harbor的服务。

通常在生产环境下,第3种和第4种方式比较推荐,这可以提供一个固定的、容易记住的域名给最终用户访问harbor。