前提条件

  • k8s集群<1.19

  • cert-manager

  • ingress-nginx

安装cert-manager

1
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml

官方安装文档

https://cert-manager.io/docs/installation/

安装ingress-nginx

注意安装镜像地址,改为国内地址,建议使用lank8s.cn,使用文档在官网,修改一下地址即可。

1
2
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/cloud/deploy.yaml
kubectl apply -f deploy.yaml

查看ingressclass

1
2
3
kubectl get ingressclass 
NAME   CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       5d

##

启动一个http服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
kind: Service
apiVersion: v1
metadata:
name: demo
spec:
selector:
  app: demo
ports:
  - name: http-port
    port: 80
    protocol: TCP
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
labels:
  app: demo
spec:
replicas: 1
selector:
  matchLabels:
    app: demo
template:
  metadata:
    labels:
      app: demo
  spec:
    containers:
      - name: nginx
        image: nginx:1.21.6
        env:
          - name: TZ
            value: Asia/Shanghai
        ports:
          - containerPort: 80

颁发机构(CA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
  server: https://acme-v02.api.letsencrypt.org/directory #生产证书地址
  email: [email protected] # 接收证书申请信息邮箱
  privateKeySecretRef:
    name: letsencrypt-prod
  solvers:
    - http01:
        ingress:
          class: nginx #填写安装的ingressclass名称

ACME:自动证书管理环境 协议来确定您是否拥有某个域名,进而确定能否被颁发 Let’s Encrypt 证书。对于这个 challenge,需要传递以下参数:

  • metadata.name:ClusterIssuer 名称,在 Kubernetes 安装中需要是唯一的。这个名称将在后面的证书颁发示例中用到。

  • spec.acme.email:这是您为生成证书而使用 Let’s Encrypt 注册的电子邮件地址。这应该是您的电子邮件。

  • spec.acme.privateKeySecretRef:这是您将用来存储私钥的 Kubernetes secret 的名称。

  • spec.acme.solvers:这应保持不变——它指出了您所使用的 challenge 类型(或者 ACME 所说的解析程序)(HTTP-01 或 DNS-01),以及它应该应用于哪种 Ingress 类型(在这种情况下,将是 nginx)。

签发证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
  cert-manager.io/cluster-issuer: letsencrypt-prod  # ClusterIssuer名称
spec:
ingressClassName: nginx
tls:
  - secretName: test-tls # 证书名
    hosts:
      - vsoul.cn # 域名
rules:
  - host: vsoul.cn # 域名
    http:
      paths:
        - path: /
           #pathType: ImplementationSpecific
          pathType: Prefix
          backend:
            service:
              name: demo # 服务名
              port:
                number: 80 # 服务的端口号 service port,非pod port

验证HTTPS

故障排查

Certificate => CertificateRequest => Order => Challenge

以此使用kubectl get、describe查看状态和日志

参考链接:HTTP Validation - cert-manager Documentation验证方式 - Let’s Encrypt - 免费的SSL/TLS证书 (letsencrypt.org)