Cert-Manager自动化Harbor HTTPS证书签发

📌 前言

在使用 Harbor 时,建议启用 HTTPS 以确保安全性。然而,配置 HTTPS 证书可能较为繁琐。本文记录了如何通过 Cert-Manager 快速实现证书的自动签发。

🧱 环境

  • Kubernetes v1.10.11
  • Harbor v1.7.0
  • Nginx Ingress Controller v0.21.0
  • Helm v2.11.0

Harbor 通过 Helm Chart 部署在 Kubernetes 集群中。Nginx Ingress Controller 使用 Deployment + NodePort 方式暴露 80 和 443 端口。如果集群内的 NodePort 端口受限,无法使用 80 和 443,可采用 DaemonSet + hostNetwork 方式进行负载均衡。

⚙️ 安装步骤

1.安装 Cert-Manager

使用 Helm 从官方 Chart 仓库安装 Cert-Manager:

1
2
3
helm install --name cert-manager --namespace kube-system \
--set ingressShim.defaultIssuerName=letsencrypt-prod \
--set ingressShim.defaultIssuerKind=ClusterIssuer stable/cert-manager

此命令指定默认使用名为 letsencrypt-prod 的 ClusterIssuer 来自动签发证书。

2.创建ClusterIssuer

创建名为 cluster-issuer.yaml 的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: lusyoe@163.com
privateKeySecretRef:
name: letsencrypt-prod
http01: {}

应用配置:

kubectl apply -f cluster-issuer.yaml

至此,Cert-Manager 已成功安装并配置完成。

🚢 安装 Harbor

1.下载 Harbor Helm Chart

从官方 GitHub 仓库下载 Harbor Helm Chart 的 Release 版本

2.修改 values.yaml 配置

在下载的 Harbor Helm Chart 目录中,编辑 values.yaml 文件,进行如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
expose:
type: ingress
tls:
enabled: true
secretName: "harbor-secret-tls"
notarySecretName: "notary-secret-tls"
commonName: ""
ingress:
hosts:
core: harbor.lusyoe.com
notary: notary.lusyoe.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"
kubernetes.io/tls-acme: "true"
certmanager.k8s.io/issuer: letsencrypt-prod

上述配置启用了 Ingress,并通过注解指定使用 Cert-Manager 的 letsencrypt-prod Issuer 自动签发 TLS 证书。

3. 安装 Harbor

在 Harbor Helm Chart 目录中,执行以下命令进行安装:

helm install --name harbor .
安装完成后,Cert-Manager 自动签发的证书将挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 路径下。

🔚 后记

安装完成后,可通过浏览器访问来验证配置是否成功。