一、介绍
本文解释了如何在 Vultr Kubernetes 引擎上安装通配符 Let’s Encrypt SSL 证书。
通配符 SSL 证书是可以保护无限子域的单个 SSL 证书。Let’s Encrypt是一个免费的证书颁发机构,提供免费的SSL证书。
示例应用程序是一个 Nginx Web 服务器,它通过 Kubernetes 服务在端口 80 上提供 HTTP 流量。Nginx 入口控制器使用通配符 Let’s Encrypt SSL 证书通过 Vultr 负载均衡器处理 HTTPS 流量。
二、准备工作
在开始之前,您应该:
- 部署 Vultr Kubernetes 集群。
- 配置,,并在您的计算机中。
kubectl
helm
git
- 有一个域名。
三、安装 Nginx 入口控制器
- 安装 NGINX 入口控制器
helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace
- 转到负载均衡器仪表板并获取新创建的负载均衡器的 IP 地址。这是为 NGINX 入口控制器创建的负载均衡器。
- (可选)使用以下命令获取负载均衡器的 IP 地址。IP 地址位于“外部 IP”列中。
kubectl get services/ingress-nginx-controller -n ingress-nginx
四、将域名服务器更改为 Vultr DNS
- 访问https://www.vultr.com/docs/vultr-dns-servers/ 以获取最新的 Vultr 名称服务器,例如 sand。
ns1.vultr.com
ns2.vultr.com
- 转到域提供商并将域的名称服务器更改为 Vultr 名称服务器。
- 转到https://my.vultr.com/dns/add/。在域字段中输入您的域,并在新 IP 地址字段中输入负载均衡器的IP 地址。
五、获取个人访问令牌 API
- 访问https://my.vultr.com/settings/#settingsapi
- 单击启用 API。
- 复制 API 密钥。在下一步中需要此 API 密钥。
- 单击允许所有 IPv4以允许所有 IP 地址访问 API。为了提高安全性,您可以在 Kubernetes 集群中添加每个节点的 IP 地址。
六、安装 cert-manager 和 cert-manager-webhook-vultr
本节介绍如何安装证书管理器以使用“加密”处理 SSL 证书。
- 安装证书管理器以管理 SSL 证书
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.0/cert-manager.yaml
- 使用以下命令创建名为的密钥。替换为上一节中的 API 密钥。
vultr-credentials
<YOUR_API_KEY>
kubectl create secret generic "vultr-credentials" --from-literal=apiKey=<YOUR_API_KEY> --namespace=cert-manager
- 从 GitHub 下载cert-manager-webhook-vultr
git clone https://github.com/vultr/cert-manager-webhook-vultr cd cert-manager-webhook-vultr
- 安装 Vultr 证书管理器 Webhook
helm install --namespace cert-manager cert-manager-webhook-vultr ./deploy/cert-manager-webhook-vultr
七、创建 Let’s Encrypt ClusterIssuer
此示例使用“让我们加密”生产环境。对于过渡环境,替换为
https://acme-v02.api.letsencrypt.org/directory
https://acme-staging-v02.api.letsencrypt.org/directory
- 创建名为以下内容的清单文件。替换为您的电子邮件地址
issuer.yaml
<YOUR_EMAIL_ADDRESS>
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-issuer spec: acme: # You must replace this email address with your own. # Let's Encrypt will use this to contact you about expiring # certificates, and issues related to your account. email: <YOUR_EMAIL_ADDRESS> server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: # Secret resource that will be used to store the account's private key. name: letsencrypt-issuer solvers: - dns01: webhook: groupName: acme.vultr.com solverName: vultr config: apiKeySecretRef: key: apiKey name: vultr-credentials --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: cert-manager-webhook-vultr:secret-reader namespace: cert-manager rules: - apiGroups: [""] resources: ["secrets"] resourceNames: ["vultr-credentials"] verbs: ["get", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: cert-manager-webhook-vultr:secret-reader namespace: cert-manager roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: cert-manager-webhook-vultr:secret-reader subjects: - apiGroup: "" kind: ServiceAccount name: cert-manager-webhook-vultr
- 部署使用 Kubectl
issuer.yaml
kubectl apply -f issuer.yaml
八、创建通配符证书
本部分创建一个免费的通配符让我们加密 SSL 证书。此证书可以保护 的任何子域。名为存储通配符证书的机密。*.example.com
example.com
wildcard-example-com-tls
- 创建名为以下内容的清单文件。替换为您的域。
certificate.yaml
example.com
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: wildcard-example-com-tls namespace: default spec: commonName: "*.example.com" dnsNames: - "*.example.com" issuerRef: name: letsencrypt-issuer kind: ClusterIssuer secretName: wildcard-example-com-tls
- 部署使用 Kubectl
certificate.yaml
kubectl apply -f certificate.yaml
- 检查状态
kubectl describe certificate wildcard-example-com-tls
- 等待挑战
$ kubectl get challenges -w NAME STATE DOMAIN AGE wildcard-example-com-tls-4rwk7-1141133851-2526175681 pending YOUR_DOMAIN 103s wildcard-example-com-tls-4rwk7-1141133851-2526175681 valid YOUR_DOMAIN 2m33s
- (可选)描述查找问题的挑战。将质询名称替换为上一步中的值。
kubectl describe challenge wildcard-example-com-tls-4rwk7-1141133851-2526175681
九、部署 Nginx Web 服务器
本节部署一个 Nginx Web 服务器,并通过 Kubernetes 服务在端口 80 上公开它。nginx-service
- 创建具有以下内容命名的文件
nginx.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: ports: - name: http port: 80 selector: name: nginx
- 部署使用 Kubectl
nginx.yaml
kubectl apply -f nginx.yaml
十、为 Nginx 服务器部署入口
本部分部署一个入口,该入口通过域公开上述 Kubernetes 服务。您可以在此部分中使用域的任何子域。此子域的证书来自上一节中的机密。nginx-service
nginx.example.com
wildcard-example-com-tls
- 创建具有以下内容命名的文件。替换为您的域。
ingress.yaml
nginx.example.com
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-issuer name: nginx-example-com namespace: default spec: tls: - hosts: - nginx.example.com secretName: wildcard-example-com-tls rules: - host: nginx.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80
- 部署使用 Kubectl
ingress.yaml
kubectl apply -f ingress.yaml
- 导航到访问您的 Nginx 服务器。
https://<YOUR_DOMAIN>
- (可选)查看日志。
kubectl logs deploy/ingress-nginx-controller --namespace ingress-nginx