在之前的文章 使用 Helm 安装 harbor 中,我已经详细描述了安装 Ingress 、Harbor ,最后成功推送镜像的步骤。其中的域名是公网可以访问的,证书是认证机构签发的。但是在内网环境下,我们需要使用内网域名进行访问。本文主要解决使用自签证书通过 Https 访问 Harbor 的问题。
1. 生成自签证书
这里以 *.harbor.dev.chenshaowen.com
域名为例。
1.1 创建 CA 证书
1
| openssl genrsa -out ca.key 4096
|
1
2
3
4
| openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=dev.chenshaowen.com" \
-key ca.key \
-out ca.crt
|
1.2 创建域名证书
1
| openssl genrsa -out harbor.dev.chenshaowen.com.key 4096
|
1
2
3
4
| openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=*.harbor.dev.chenshaowen.com" \
-key harbor.dev.chenshaowen.com.key \
-out harbor.dev.chenshaowen.com.csr
|
1
2
3
4
5
6
7
8
9
10
11
12
| cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.dev.chenshaowen.com
DNS.2=*.harbor.dev.chenshaowen.com
DNS.3=hostname
EOF
|
1
2
3
4
5
| openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.dev.chenshaowen.com.csr \
-out harbor.dev.chenshaowen.com.crt
|
- 将 crt 转换为 cert ,以供 Docker 使用
1
| openssl x509 -inform PEM -in harbor.dev.chenshaowen.com.crt -out harbor.dev.chenshaowen.com.cert
|
最终在目录下得到如下文件:
1
2
3
| ls
ca.crt ca.key ca.srl harbor.dev.chenshaowen.com.cert harbor.dev.chenshaowen.com.crt harbor.dev.chenshaowen.com.csr harbor.dev.chenshaowen.com.key v3.ext
|
2. 部署 Harbor
1
| helm install --name nginx-ingress --set "rbac.create=true,controller.service.externalIPs[0]=192.168.13.20" stable/nginx-ingress
|
1
| kubectl create ns harbor
|
1
| kubectl create secret tls harbor.dev.chenshaowen.com --key harbor.dev.chenshaowen.com.key --cert harbor.dev.chenshaowen.com.crt -n harbor
|
1
2
| helm repo add harbor https://helm.goharbor.io
helm repo update
|
1
2
3
4
5
6
7
| helm install --name harbor --namespace harbor harbor/harbor \
--set expose.ingress.hosts.core=core.harbor.dev.chenshaowen.com \
--set expose.ingress.hosts.notary=notary.harbor.dev.chenshaowen.com \
--set expose.tls.secretName=harbor.dev.chenshaowen.com \
--set persistence.enabled=true \
--set externalURL=https://core.harbor.dev.chenshaowen.com \
--set harborAdminPassword=Harbor12345
|
如果没有默认的 storageClass 可以将 persistence.enabled 设置为 false ,不使用持久化存储。
如果需要使用持久化存储可以参考文档,使用 StorageClass 提供 PV 动态存储。
3. 配置及使用
3.1 页面访问
配置 hosts 之后,通过 https://core.harbor.dev.chenshaowen.com 访问:
这是因为自签的证书不被信任。我们需要将 harbor.dev.chenshaowen.com.crt 证书导入系统,下面以 OS X 系统为例:
将证书保存一份到本地,拖拽到 Keychain 中,然后双击证书,设置为 Always Trust 。如下图:
再次访问时,就可以正常打开页面登陆。
3.2 Docker 访问
1
2
3
4
| mkdir -p /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
cp harbor.dev.chenshaowen.com.cert /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
cp harbor.dev.chenshaowen.com.key /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
cp ca.crt /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
|
这里的 core.harbor.dev.chenshaowen.com 目录一定要与服务保持一致,如果有端口,也应该用 :
连接带上。
- 登陆 core.harbor.dev.chenshaowen.com
1
2
3
4
5
6
7
8
| docker login core.harbor.dev.chenshaowen.com -u admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
|
1
| docker tag nginx core.harbor.dev.chenshaowen.com/library/nginx
|
1
2
3
4
5
6
7
| docker push core.harbor.dev.chenshaowen.com/library/nginx
The push refers to repository [core.harbor.dev.chenshaowen.com/library/nginx]
be91fceb796e: Pushed
919b6770519b: Pushed
b60e5c3bcef2: Pushed
latest: digest: sha256:6b3b6c113f98e901a8b1473dee4c268cf37e93d72bc0a01e57c65b4ab99e58ee size: 948
|
由于推送之后,我又删除本地镜像,再次拉取,这里的下载次数为 1 。