• Kubernetes环境cert-manager部署与应用


    本作品Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。由原作者转载自个人站点

    概述

    本文用于整理基于Kubernetes环境的cert-manager部署与应用,实现证书管理和Ingress启用TLS配置。

    随着各相关组件版本的更新,笔者将在验证通过后对本文进行补充和更新,请参考更新记录

    本次演练环境为Kubernetes集群环境,环境配置可参考笔者另一篇笔记《Kubernetes集群部署笔记》。

    本次演练使用Traefik作为Ingress Controller实现,环境配置可参考笔者另一篇笔记《Kubernetes环境Traefik部署与应用》。

    本次演练使用Cloudflare提供的DNS解析服务,并假定读者已经注册了Cloudflare并正确配置了网站。有关Cloudflare的配置和使用,请参考Cloudflare帮助中心或相关文档。

    组件版本

    配置过程

    安装cert-manager

    • 参考官方文档,使用kubectl安装cert-manager,所有参数使用默认值,这将会把cert-manager安装至cert-manager命名空间。

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

    配置Issuer和ClusterIssuer

    • 配置API Token

      本次演练使用Cloudflare提供的DNS解析服务,实现通过DNS-01质询方式申请证书,可根据需要替换为其他支持的DNS-01验证程序,或通过Webhook方式扩展cert-manager对其他DNS解析服务的支持。

      首先,登录Cloudflare控制面板,打开API Tokens页面,按照cert-manager文档中的说明,创建一个API Token,记录该API Token的值用于后续操作。

      - Permissions
        - Zone - DNS - Edit
        - Zone - Zone - Read
      - Zone Resources:
        - Include - All Zones
      
    • 创建IssuerClusterIssuer

      cert-manager提供两种用于签发证书的对象:IssuerClusterIssuer,简单地说,Issuer是命名空间级别的资源,无法用于处理跨命名空间的证书签发请求;ClusterIssuer是集群级别的资源,可以用于处理跨命名空间的证书签发请求。

      创建一个Issuer对象。

      cat <<EOF | kubectl apply -f -
      apiVersion: v1
      kind: Secret
      metadata:
        name: cloudflare-api-token-secret
        namespace: apps-choral
      type: Opaque
      stringData:
        api-token: '' # 这里的值为[配置API Token]一节中创建的API Token值
      
      ---
      apiVersion: cert-manager.io/v1
      kind: Issuer
      metadata:
        name: cloudflare-acme-issuer
        namespace: apps-choral
      spec:
        acme:
          email: ''
          # 配置证书目录,演练环境使用Staging环境
          # server: https://acme-v02.api.letsencrypt.org/directory
          server: https://acme-staging-v02.api.letsencrypt.org/directory
          privateKeySecretRef:
            name: acme-issuer-account-key
          solvers:
          - dns01:
              cloudflare:
                apiTokenSecretRef:
                  name: cloudflare-api-token-secret # 引用当前文档中创建的Secret名称
                  key: api-token
      EOF
      

      创建一个ClusterIssuer对象。

      cat <<EOF | kubectl apply -f -
      apiVersion: v1
      kind: Secret
      metadata:
        name: cloudflare-api-token-secret
        namespace: cert-manager # 这里配置为安装cert-manager资源的命名空间
      type: Opaque
      stringData:
        api-token: '' # 这里的值为[配置API Token]一节中创建的API Token值
      
      ---
      apiVersion: cert-manager.io/v1
      kind: ClusterIssuer
      metadata:
        name: cloudflare-acme-cluster-issuer
      spec:
        acme:
          email: ''
          # 配置证书目录,演练环境使用Staging环境
          # server: https://acme-v02.api.letsencrypt.org/directory
          server: https://acme-staging-v02.api.letsencrypt.org/directory
          privateKeySecretRef:
            name: acme-issuer-account-key
          solvers:
          - dns01:
              cloudflare:
                apiTokenSecretRef:
                  name: cloudflare-api-token-secret # 引用当前文档中创建的Secret名称
                  key: api-token
      EOF
      

    配置Ingress TLS

    可以通过手动创建或基于注解自动创建Certificate资源,cert-manager会自动管理签发证书并保存至指定的Secret对象中,并自动管理续期

    • 手动创建Certificate资源

      首选,创建一个Certificate对象,这会触发spec.issuerRef字段指定的IssuerClusterIssuer签发TLS证书,并保存至spec.secretName字段指定的Secret对象中。

      cat <<EOF | kubectl apply -f -
      apiVersion: cert-manager.io/v1
      kind: Certificate
      metadata:
        name: cert-local-choral-io
        namespace: apps-choral
      spec:
        dnsNames:
        - 'local.choral.io'
        - '*.local.choral.io'
        issuerRef:
          kind: ClusterIssuer
          name: cloudflare-acme-cluster-issuer
        secretName: cert-local-choral-io
      EOF
      

      证书签发成功后,配置Ingress使用指定的Secret实现TLS。

      cat <<EOF | kubectl apply -f -
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: whoami
        namespace: apps-choral
        annotations:
          traefik.ingress.kubernetes.io/router.entrypoints: websecure
      spec:
        tls:
          - secretName: cert-local-choral-io
        rules:
          - host: whoami.local.choral.io
            http:
              paths:
                - path: /
                  pathType: Prefix
                  backend:
                    service:
                      name: whoami
                      port:
                        number: 80
      EOF
      
    • 配置Ingress注解自动创建Certificate资源

      配置Ingress注解,使用cert-manager.io/issuer指定Issuer,或使用cert-manager.io/issuer指定ClusterIssuer,这会触发指定的IssuerClusterIssuer签发TLS证书,并保存至spec.tls[*].secretName字段指定的Secret对象中。

      cat <<EOF | kubectl apply -f -
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: whoami
        namespace: apps-choral
        annotations:
          cert-manager.io/issuer: cloudflare-acme-issuer
          traefik.ingress.kubernetes.io/router.entrypoints: websecure
      spec:
        tls:
          - hosts:
              - whoami.local.choral.io
            secretName: cert-local-choral-io
        rules:
          - host: whoami.local.choral.io
            http:
              paths:
                - path: /
                  pathType: Prefix
                  backend:
                    service:
                      name: whoami
                      port:
                        number: 80
      EOF
      

    参考资料

  • 相关阅读:
    2—10岁女童羽绒服,黑色长款也太好看了吧
    ubuntu下yolov5 tensorrt模型部署
    Java线程周期
    深入解析Laravel框架:目录结构全解析
    IEJoin: 提高 Databend range join 性能
    统计假设检验
    IntelliJ IDEA中有什么让你相见恨晚的好用插件?
    C++进阶之哈希
    Netty 学习:通信协议和编解码
    19. 删除链表的倒数第 N 个结点
  • 原文地址:https://www.cnblogs.com/tiscs/p/notes-cert-manager.html