前言
harbor需要上https,可以参考这里,harbor的证书是自签名的,证书需要手动续签,如果只有一个环境还好,但有多个harbor环境,然后证书过期时间不一致时,就需要耗费很多的精力来处理证书过期问题。
现在我环境中的harbor是以docker-compose形式部署的,提供k8s集群服务来拉取镜像。那么可不可以把harbor部署在k8s集群中,再使用cert-manager工具来生成证书,并完成自动续签呢?答案是可以的。
cert-manager部署
这里使用helm方式部署。官方文档地址:https://cert-manager.io/docs/installation/helm/
helm repo add jetstack https://charts.jetstack.io
helm repo update
# 安装CRD。
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.13.2 \
--set installCRDs=true
values.yaml中可以配置项参考:https://artifacthub.io/packages/helm/cert-manager/cert-manager
查看crd和pod。
创建ClusterIssuer
查看ingressclass,在创建ClusterIssuer时需要指定,如果没有指定,有默认的class也可以。
k get ingressclass
创建Issuer或ClusterIssuer对象以连接到证书颁发机构(CA)。ClusterIssuer是一个全局对象,而Issuer是命名空间相关的。yaml如下:
vim ClusterIssuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-harbor
spec:
acme:
# 使用 Let's Encrypt ACME 服务器
server: https://acme-v02.api.letsencrypt.org/directory
email: 1127093900@qq.com
privateKeySecretRef:
name: letsencrypt-harbor
solvers:
- http01:
ingress:
class: nginx
k apply -f ClusterIssuer.yaml
harbor部署
官方部署文档:https://goharbor.io/docs/2.9.0/install-config/harbor-ha-helm/
helm repo add harbor https://helm.goharbor.io
helm search repo harbor
helm pull harbor/harbor
tar xvf harbor-1.13.1.tgz
cd harbor
vim values.yaml
expose:
type: ingress
tls:
enabled: true
certSource: auto
# 这里可以随意填写一个,cert-manager会自动创建并挂载,不写也行
secretName: "harbor-secret-tls"
commonName: ""
ingress:
hosts:
core: harbor.test.com
annotations:
ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/proxy-body-size: "0"
nginx.ingress.kubernetes.io/proxy-body-size: "0"
# 这里添加自动创建tls,并使用上面创建的issuer
kubernetes.io/tls-acme: "true"
certmanager.k8s.io/issuer: letsencrypt-harbor
helm install harbor --create-namespace -n harbor .
这里镜像会拉取超时。到github下载离线包,导入镜像。
wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-offline-installer-v2.9.1.tgz
tar xvf harbor-offline-installer-v2.9.1.tgz
cd harbor
nerdctl -n k8s.io load -i harbor.v2.9.1.tar.gz
查看secret,cert-manager自动创建的secret name为harbor-ingress
,包含了ca.crt
,tls.crt
,tls.key
。
查看证书挂载位置:/etc/core/ca
访问harbor
本地添加hosts后访问 https://harbor.test.com
查看证书有效期
可以看到证书有效期是1年。
echo | openssl s_client -servername harbor.test.com -connect harbor.test.com:443 2>/dev/null | openssl x509 -noout -dates
浏览器导入证书
导入ca.crt到受信任的根证书颁发机构。
拷贝证书
证书是软链接,真实路径是/etc/core/ca/..data/
。
k cp -n harbor harbor-core-6748cd8888-5qnfq:/etc/core/ca/..data/ca.crt ca.crt.
k cp -n harbor harbor-core-6748cd8888-5qnfq:/etc/core/ca/..data/tls.crt tls.crt
k cp -n harbor harbor-core-6748cd8888-5qnfq:/etc/core/ca/..data/tls.key tls.ke
登录harbor
添加解析,直接登录会报错:x509: certificate signed by unknown authority Get https://harbor.wowjoy.com/v2/: x509: certificate signed by unknown authority
解决方法是拷贝上面的ca.crt并导入。
cat ca.crt >> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
docker login
nerdctl login