本作品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: '<REDACTED>' # 这里的值为[配置API Token]一节中创建的API Token值 ---
    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
    name: cloudflare-acme-issuer
    namespace: apps-choral
    spec:
    acme:
    email: '<REDACTED>'
    # 配置证书目录,演练环境使用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: '<REDACTED>' # 这里的值为[配置API Token]一节中创建的API Token值 ---
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
    name: cloudflare-acme-cluster-issuer
    spec:
    acme:
    email: '<REDACTED>'
    # 配置证书目录,演练环境使用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

参考资料

最新文章

  1. KVC &amp; KVO
  2. Bootstrap &lt;基础五&gt;表格
  3. 如何让Chrome浏览器可以加载本地XML文件?
  4. web api 处理发送过来的文件(图片)
  5. Core Java - 流(Stream) - 字节流和字符流(一)
  6. devexpress表格控件gridcontrol设置隔行变色、焦点行颜色、设置(改变)显示值、固定列不移动(附源码)
  7. EventBus框架在Android多Pane(Fragment)中的应用
  8. MATLAB信号与系统分析(五)&mdash;&mdash;连续时间信号的频谱分析
  9. shopnc2014年11版数据库字典
  10. pow(x,n) leecode
  11. 转载,crtmpserver文件夹结构分析
  12. iOS-OC-基础-NSNumber常用方法
  13. 一个简单二叉树的C++实现(一)
  14. 《PHP内核剖析 - 变量/内存管理》
  15. 分析logfilter+session
  16. 终于解决了用JAVA写窗口程序在不同的windows界面下的显示保持一致。
  17. Xampp PHPStorm XDebug配置
  18. 获取AFP共享的文件夹及其权限
  19. GO注释
  20. Docker基础入门

热门文章

  1. 手记系列之三 ----- 关于使用Nginx的一些使用方法和经验
  2. golang内置包管理工具go mod简明教程
  3. 篇(16)-Asp.Net Core入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二)
  4. .NET性能优化-使用内存+磁盘混合缓存
  5. 重学c#系列——订阅发布与事件[二十六]
  6. 树莓派蓝牙rfcomm协议通信
  7. 树莓派编译opencv4
  8. 更改grub2背景图片
  9. go slice不同初始化方式性能&amp;数组比较
  10. 1.5.6 NN与2NN-hadoop-最全最完整的保姆级的java大数据学习资料