Cert-manager自动管理k8s https证书
  DNI8muXYHdAm 2023年11月02日 33 0

Cert-manager自动管理K8S https证书 Cert-manager对接华为云HUAWEI DNS certmanager对接华为云 HUAWEI DNS

Cert-manager自动管理https证书

Cert-manager自动管理K8S https证书

Cert-manager对接华为云HUAWEI DNS

certmanager对接华为云 HUAWEI DNS

certmanager自动管理K8S https证书 华为云

参考链接

官网

certtficate资源定义

Certmanager简介

cert-manager 是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期,默认情况下证书有效期是3个月,支持 Let’s Encrypt, HashiCorp Vault 这些免费证书的签发。在Kubernetes集群中,我们可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。

cert-manager提供了两种资源对象,clusterissuer 和 Certificate;

Clusterissuer是证书颁发过程中指定颁发的机构和做域名验证的提供商,在颁发的过程中需要验证域名所属人,Clusterissuer提供两种方式的认证HTTP-01DNS-01, HTTP01验证方式类似放一个txt认证文件到网站根目录下方式时文件里面的内容或者是特定的文件名称。DNS01就是创建txt类型的DNS解析记录。

Certificate声明申请的证书里面包含要申请的域名,自动维护域名的过期时间,申请人注册到颁发机构的邮箱地址。Certificate成功申请到证书之后会根据资源定义的信息在指定的命名空间下创建用于网站指定的tls secret且状态为True

安装Cert-manager

K8s版本支持说明。

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

安装ClusterIssuer

使用华为云web-hook

在得到证书申请后ClusterIssuer会根据配置中提供的认证信息在华为云DNS中添加DNS txt验证记录。在颁发机构认证完之后又会把txt记录删除。

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: <email>          # 需要有效邮箱地址用户颁发证书机构的注册。
    preferredChain: ''
    privateKeySecretRef:
      name: letsencrypt-prod
    server: https://acme-v02.api.letsencrypt.org/directory    # 默认提供的api地址
    solvers:
      - dns01:                                                # 域名认证方式dns01
          webhook:
            config:
              appKey: <appKey>                                # iam用户AK
              appSecret: <appSecret>                          # iam用户SK
              region: <region>  # 域名所在 region,比如华南广州cn-south-1。
              zoneId: <zoneId>  # 域名Id,需要调用华为云的API获得。                 
            groupName: acme.innoai.tech
            solverName: huawei-dns

华为云获取域名zoneId的方式。

查询公网域名id (zoneId) API Explorer (huaweicloud.com)

在API Explorername字段填你要查询的域名。

Cert-manager自动管理k8s https证书_nginx

创建证书资源(Certificate)

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: cqailinjt-ty    # cert的名称
  namespace: default     # 创建在哪个命名空间
spec:
  dnsNames:
    - '*.test.cqailin.com.cn'     # 申请的证书域名
  issuerRef:
    group: cert-manager.io
    kind: ClusterIssuer
    name: letsencrypt-prod         # 指定clusterissuer
  secretName: cqailinjt-ty        # 证书tls secret名称
  renewBefore: 360h                # 证书多久过期前,重新申请证书
  usages:
    - digital signature
    - key encipherment

申请成功之后状态为True

Cert-manager自动管理k8s https证书_DNS_02

证书详情

kubectl get cert cqailinjt-ty -o yaml
.......
spec:
  dnsNames:
  - '*.test.cqailin.com.cn'     # 证书颁发的域名
  issuerRef:
    group: cert-manager.io
    kind: ClusterIssuer
    name: letsencrypt-prod
  renewBefore: 360h0m0s          # 证书更新时间
  secretName: cqailinjt-ty      # 创建的secret名称
  usages:
  - digital signature
  - key encipherment
status:
  conditions:
  - lastTransitionTime: "2023-10-25T06:07:16Z"
    message: Certificate is up to date and has not expired
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: Ready
  notAfter: "2024-01-23T05:07:13Z"     # 过期时间
  notBefore: "2023-10-25T05:07:14Z"
  renewalTime: "2024-01-08T05:07:13Z"  # 重新更新时间 
  revision: 1

使用证书

]# kubectl get ingress nginx -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress/hsts: "false"
    nginx.ingress/hsts-max-age: "600"
    nginx.ingress/ssl-redirect: "false"
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: bba.test.cqailin.com.cn
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - bba.test.cqailin.com.cn
    secretName: cqailinjt-ty

华为云添加解析记录

*.test.cqailin.com.cn	->192.168.21.88    # A记录

Cert-manager自动管理k8s https证书_DNS_03

Cert-manager自动管理k8s https证书_nginx_04

在Ingress中直接声明tls

cat xyz.test.cqailin.com.cn.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod   # 添加这个注释
    cert-manager.io/renew-before: 168h                 # 证书过期前多久更新证书
    nginx.ingress/hsts: "false"
    nginx.ingress/hsts-max-age: "600"
    nginx.ingress/ssl-redirect: "false"
  labels:
    app: nginx
  name: nginx
spec:
  ingressClassName: nginx
  rules:
  - host: xyz.test.cqailin.com.cn
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - "*.test.cqailin.com.cn"    # 这种方式可以直接申请泛域名证书
    secretName: cqailinjt-xyz

Cert-manager自动管理k8s https证书_nginx_05

tls使用下面的方式可以使用泛域名证书。

tls:
  - hosts:
    - "*.test.cqailin.com.cn"    # 这种方式可以直接省请泛域名证书
    secretName: cqailinjt-xyz

如果tls中写的是单独的域名则颁发的是单域名证书。

Cert-manager自动管理k8s https证书_API_06

Cert-manager自动管理k8s https证书_DNS_07

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  1m9rJBpbaLoS   2023年11月30日   26   0   0 gitDNSHTTPHTTPgitDNS
DNI8muXYHdAm