首页 > 其他分享 >Kubernetes环境cert-manager部署与应用

Kubernetes环境cert-manager部署与应用

时间:2023-02-11 14:56:18浏览次数:73  
标签:Kubernetes acme cert manager API ClusterIssuer Issuer

本作品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
    

参考资料

标签:Kubernetes,acme,cert,manager,API,ClusterIssuer,Issuer
From: https://www.cnblogs.com/tiscs/p/notes-cert-manager.html

相关文章

  • Kubernetes初识
    目录:云原生Kubernetes概述1、K8S是什么2、为什么要用K8S3、Kubernetes集群架构与组件K8S的特性核心组件Master组件配置存储中心N......
  • 深入Alertmanager 概念与配置介绍
    原文: https://www.cnblogs.com/gered/p/13496950.html警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的。警报规则在Prometheus定......
  • Kubernetes:分享一个可以展示资源视图的 K8s开源 Web/桌面 客户端工具 Octant
    写在前面博文内容主要为Octant介绍以及桌面/Web端的安装教程涉及Linux/Windows的安装。理解不足小伙伴帮忙指正其实当你什么都经历了,会发现,人生无论你怎么精心......
  • Kubernetes(k8s)控制器(四):ReplicaSet
    目录一.系统环境二.前言三.ReplicaSet概览四.ReplicaSet工作原理五.ReplicaSet使用场景六.创建ReplicaSet七.扩展replicaset副本数一.系统环境服务器版本docker软件......
  • kubernetes(k8s)基础学习-kubernetes是什么?有什么用?
    kubernetes(k8s)基础学习-kubernetes是什么?一、认识DockerDocker是什么先来看看Docker的图标:一条鲸鱼背上驮着四方形块的物品,就像一条海运船上装满集装箱,集装箱里......
  • python中的上下文管理器以及python内建模块contextlib的contextmanager方法
    上下文管理器上下文管理器是实现了上下文管理协议的对象,其特有的语法是“with…as”。主要用于保存和恢复各种全局状态,关闭文件等,并为try…except…finally提供了一个方......
  • kubernetes探针
    LivenessProbe:周期性检测,检测未通过时,kubelet会根据restartPolicy的定义来决定是否会重启该容器;未定义时,kubelet认为容器未终止,即为健康;ReadnessProbe:周期性检测,检测未通......
  • 使用Function定时启用/停止Azure Kubernetes群集
    最近在做AKS相关的测试,测试的过程中发现,虽然在Azure中的AKS群集对用户免费提供,但是多个WorkNode一起运行其实也是一笔不小的费用。因为我只有在工作时间进行测试,所以就开始......
  • 由浅入深学习新模块之window_manager(一)
    作者:王清前言:作为一个开发人员,随着时代和行业的发展,总会不断的接触不同的新任务,新模块,这就需要不断的学习与沉淀。因为工作的需求,笔者需要对一些自己负责模块之外的模块进......
  • kubernetes top查看内存CPU使用情况
    1.top简介k8stop命令我们通常可以基于top命令来查看节点上的资源使用情况,可以带两个参数nodes和pods,通过这个命令分别用于查看节点和pods的资源使用情况,这对于我们快速......