1. 简介
随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支。cert-manager 是 Kubernetes 上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 来签发免费证书并自动续期,实现永久免费使用证书。
Cert-Manager 是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期,支持 Let’s Encrypt / HashiCorp / Vault 这些免费证书的签发。在 Kubernetes 中,可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。
架构原理图

解释下几个关键的资源:
Issuer/ClusterIssuer: 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuer 与 Issuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。
Certificate: 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。
2.准备
k3s集群环境
有效的域名(如果是国内云服务器还需要备案)
一个可登录的邮箱
3.开始部署
3.1部署cert-manager
本文直接使用kubectl安装,未使用Helm.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.yaml
运行如下命令可看到创建了3个pod,并STATUS为:Running
kubectl get pods --namespace cert-manager

3.2 配置ClusterIssuer
创建clusterIssuer.yml,内容如下
- apiVersion: cert-manager.io/v1
- kind: ClusterIssuer
- metadata:
- name: letsencrypt-prod
- spec:
- acme:
- email: 【此处修改为你的邮箱】
- privateKeySecretRef:
- name: letsencrypt-prod
- server: https://acme-v02.api.letsencrypt.org/directory
- solvers:
- - http01:
- ingress:
- class: traefik
应用该配置
kubectl apply -f clusterIssuer.yml
至此,基本配置已完成,接下来我们建立一个deployment,service,traefik进行测试
4.测试
4.1创建nginx Deployment
创建一个Deployment资源,nginx.yml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx-deployment
- spec:
- selector:
- matchLabels:
- app: nginx
- replicas: 2 # tells deployment to run 2 pods matching the template
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.14.2
- ports:
- - containerPort: 80
4.2创建Nginx Service
nginxservice.yml
- apiVersion: v1
- kind: Service
- metadata:
- labels:
- app: video-nginx
- name: video-nginx
- namespace: default
- spec:
- ports:
- - port: 8888
- protocol: TCP
- name: nginx
- targetPort: 80
- type: ClusterIP
- selector:
- app: nginx
5.创建Ingress (重点)
workingress.yml
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: work-ingress
- namespace: default
- annotations:
- kubernetes.io/ingress.class: traefik
- cert-manager.io/cluster-issuer: letsencrypt-prod # letsencrypt-prod为ClusterIssuer名称
- spec:
- tls:
- - secretName: test-tls # 证书名
- hosts:
- - your domain # 域名
- rules:
- - host: your domain # 域名
- http:
- paths:
- - path: /
- pathType: ImplementationSpecific
- backend:
- service:
- name: video-nginx # 服务名
- port:
- number: 80 # 服务的端口号 service port,非pod port
至此,测试程序已经部署完成,接下来,在浏览器输入https://你的域名,即可看到你的网站已经使用HTTPS协议了。
6.Http自动重定向到Https
6.1创建一个Middleware
- apiVersion: traefik.containo.us/v1alpha1
- kind: Middleware
- metadata:
- name: redirect-https
- spec:
- redirectScheme:
- scheme: https
- permanent: true
6.2在Ingress中添加注解traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd注意default是命名空间,redirect-https为Middleware的name

免费在线流程图、思维导图、专业强大的作图工具,支持多人实时在线协作,可用于原型图、UML、BPMN、网络拓扑图等多种图形绘制 感觉真不错推荐给大家!
