前提条件

  • k8s集群<1.19

  • cert-manager

  • ingress-nginx

安装cert-manager

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,使用文档在官网,修改一下地址即可。

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

查看ingressclass

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

##

启动一个http服务

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)

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory #生产证书地址
    email: example@vsoul.cn # 接收证书申请信息邮箱
    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)。

签发证书

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)