本作品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环境cert-manager部署与应用的更多相关文章

  1. Kubernetes环境Traefik部署与应用

    本作品由Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可.由原作者转载自个人站点. 概述 本文用于整理基于Kubernetes环境的Traefik部署与应用, ...

  2. GitLab Runner部署(kubernetes环境)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. kubernetes环境部署单节点redis

    kubernetes部署redis数据库(单节点) redis简介 Redis 是我们常用的非关系型数据库,在项目开发.测试.部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存.这里介绍 ...

  4. Docker Kubernetes 环境搭建

    Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...

  5. Kubernetes环境下如何运行Coherence缓存集群

    Oracle官方出了一个如何在Docker环境下运行Coherence的技术文档,大家可以参考: https://github.com/oracle/docker-images/tree/master ...

  6. Kubernetes V1.15 二进制部署集群

    1. 架构篇 1.1 kubernetes 架构说明              1.2 Flannel网络架构图 1.3 Kubernetes工作流程             2. 组件介绍 2.1 ...

  7. Kubernetes 企业级集群部署方式

    一.Kubernetes介绍与特性 1.1.kubernetes是什么 官方网站:http://www.kubernetes.io • Kubernetes是Google在2014年开源的一个容器集群 ...

  8. linux运维、架构之路-Kubernetes离线集群部署-无坑

    一.部署环境介绍 1.服务器规划 系统 IP地址 主机名 CPU 内存 CentOS  7.5 192.168.56.11 k8s-node1 2C 2G CentOS  7.5 192.168.56 ...

  9. linux运维、架构之路-Kubernetes离线、二进制部署集群

    一.Kubernetes对应Docker的版本支持列表 Kubernetes 1.9 <--Docker 1.11.2 to 1.13.1 and 17.03.x Kubernetes 1.8 ...

  10. 测试环境docker-swarm安装部署

    测试环境swarm安装部署 部署前增加监听docker2375端口 centos 增加tcp监听端口 修改/lib/systemd/system/docker.service sed -i ‘s/Ex ...

随机推荐

  1. vue3中的defineProps,watch,computed

    在vue3的setup语法糖中,defineProps不需要引入了 <script setup> import { computed } from '@vue/reactivity'; i ...

  2. <二>掌握构造函数和析构函数

    构造函数 和类名相同,可以带参数,参数可以有多个 构造函数执行完成后,内存开辟完成,同时可以完成初始化工作. 析构函数 ~Test(); 析构函数可以自己调用,析构函数调用后,对象不存在了.自己调了析 ...

  3. [leetcode] 994. Rotting Oranges

    题目 You are given an m x n grid where each cell can have one of three values: 0 representing an empty ...

  4. css文字垂直展示的方法

    一.使用writing-mode(推荐使用) writing-mode:翻译过来是"写字 - 模式",文本在水平或垂直方向上如何排布 有以下几个属性值: horizontal-tb ...

  5. FIXMAP内存管理器

    fixed map是被linux kernel用来解决一类问题的机制,这类问题的共同特点是: (1)在很早期的阶段需要进行地址映射,而此时,由于内存管理模块还没有完成初始化,不能动态分配内存,也就是无 ...

  6. 【RocketMQ】顺序消息实现原理

    全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用 ...

  7. redisson分布式锁原理剖析

    redisson分布式锁原理剖析 ​ 相信使用过redis的,或者正在做分布式开发的童鞋都知道redisson组件,它的功能很多,但我们使用最频繁的应该还是它的分布式锁功能,少量的代码,却实现了加锁. ...

  8. ubuntu等debian系linux系统添加人脸识别howdy

    准备 proxychains proxychains是用来给终端走代理的软件,因为下载howdy的时候有一部分的文件的服务器在国外,且被墙了. 安装proxychains sudo apt insta ...

  9. 1. PyQt5开发环境的搭建

    专栏地址 ʅ(‾◡◝)ʃ 因为我个人使用的是 Linux 还有之前用过Windows 没用过 Mac 所以这里我简单结束 Linux 和 Windows 开发环境的搭建 Windows 开发PyQt5 ...

  10. 《HelloGitHub》第 80 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...