K8s 中使用 cert-manager 申请免费 Https 证书

K8s 中使用 cert-manager 申请免费 Https 证书

Intro

最近在尝试将自己的应用从自己用 kind 部署的一个 k8s 集群迁移到 Azure 的 AKS 上,其中一个问题就是 https 证书,原来的 k8s 集群是放在 nginx 后端的并没有直接管理 https 证书,https 证书是放在 nginx 层面的,完全运行在 AKS 上的 k8s 集群中就要解决 https 证书的问题,我们可以使用 cert-manager 来申请由 Let's encrypt 提供的免费 https 证书,因为我的域名是在阿里云上的,并不在官方的 DNS 服务商支持范围内,所以需要使用第三方的实现的 webhook 支持,而网上的一些第三方的很多 API version 都不对了,而且使用起来感觉也不太方便,所以自己基于别人的魔改了一版,完善了 helm 的支持,基本可以一个命令创建所有需要的资源

Cert-manager

随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,现在如果不使用 https Chrome 浏览器都会提示不安全,而且有些服务可能会要求必须是 https 才可以,而 Let's encrypt 为大家提供了免费的 https 证书,免费证书的时间是三个月,我们可以在过期之前重新申请,对于个人来说是个不错的选择。

cert-manager 是 Kubernetes 上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用 cert-manager 基于 ACME 协议与 Let's Encrypt 来签发免费证书并自动续期,实现永久免费使用证书。

下面这张图是一个 cert-manager 的总体架构图

79ae7eda8569c2619f1401d627e43c53.png

High level overview diagram explaining cert-manager architecture

Issuer 是指证书的来源,它可以从各种受支持的来源颁发证书,包括 Let's Encrypt、HashiCorp Vault 和 Venafi 以及私有 PKI。

Certificates 就是指的证书,证书是由指定的 issuer 来签发的

Kubernetes secrets 一般是指保存 https 证书的 secret,使用 https 的时候会用到这种 kubernetes.io/tls 类型的 secret

  • Issuer/ClusterIssuer: 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuer 与 Issuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。

  • Certificate: 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用

Let’s Encrypt 利用 ACME 协议来校验域名是否真的属于你,校验成功后就可以自动颁发免费证书,证书有效期只有 90 天,在到期前需要再校验一次来实现续期, cert-manager 可以自动续期,这样就可以基本使用永久免费的证书了。如何校验这个域名是否属于你呢?主要有两种校验方式是 HTTP-01DNS-01

HTTP-01 校验原理

HTTP-01 的校验原理是给你域名指向的 HTTP 服务增加一个临时 location ,Let’s Encrypt 会发送 http 请求到 http:///.well-known/acme-challenge/YOUR_DOMAIN 就是被校验的域名,TOKEN 是 ACME 协议的客户端负责放置的文件,在这里 ACME 客户端就是 cert-manager,它通过修改或创建 Ingress 规则来增加这个临时校验路径并指向提供 TOKEN 的服务。Let’s Encrypt 会对比 TOKEN 是否符合预期,校验成功后就会颁发证书。此方法仅适用于给使用 Ingress 暴露流量的服务颁发证书,并且不支持泛域名证书。

DNS-01 校验原理

DNS-01 的校验原理是利用 DNS 提供商的 API Key 拿到你的 DNS 控制权限, 在 Let’s Encrypt 为 ACME 客户端提供令牌后,ACME 客户端 (cert-manager) 将创建从该令牌和您的帐户密钥派生的 TXT 记录,并将该记录放在 _acme-challenge.。然后 Let’s Encrypt 将向 DNS 系统查询该记录,如果找到匹配项,就可以颁发证书。此方法不需要你的服务使用 Ingress,并且支持泛域名证书。

HTTP-01 的校验方式配置简单通用,不管使用哪个 DNS 提供商都可以使用相同的配置方法;缺点是:需要依赖 Ingress,如果你的服务不是用 Ingress 暴露流量的就不适用,而且不支持泛域名证书。

DNS-01 的校验方式不依赖 Ingress,也支持泛域名;缺点就是不同 DNS 提供商的配置方式不一样,而且 DNS 提供商有很多,cert-manager 的 Issuer 不可能每个都去支持,不过有一些可以通过部署实现了 cert-manager 的 Webhook 的服务来扩展 Issuer 进行支持,比如 DNSPod 和 阿里 DNS,详细 Webhook 列表请参考: https://cert-manager.io/docs/configuration/acme/dns01/#webhook

Sample

这里假定以后安装好了 helm3,如果没有安装可以参考:https://helm.sh/docs/intro/install/ 先安装 helm

首先我们需要安装 cert-manager,你可以执行下面的命令来通过 helm 安装 cert-manager

helm repo add jetstack https://charts.jetstack.iohelm repo updatehelm install cert-manager jetstack/cert-manager -n cert-manager --create-namespace --set installCRDs=true --version v1.6.1

安装完 cert-manager 之后,就可以配置 issuer 和 证书了

HTTP-01 比较简单,基本按照文档就可以走通了,这里不多介绍了 https://cert-manager.io/docs/tutorials/acme/http-validation/

如果你的 DNS 服务商官方就支持了也是跟着文档配置就可以了 https://cert-manager.io/docs/tutorials/acme/dns-validation/

而阿里云目前并非官方支持的,你需要使用第三方的,觉得不好用的,可以像我一样基于别人的配置改造一下,下面我们就以阿里云为例来介绍使用 cert-manager 来配置阿里云的 DNS,以我改造的 AliDNS webhook 为例

首先克隆项目 https://github.com/WeihanLi/certmanager-webhook-alidns 到本地,然后在项目根目录下执行下面的命令来配置证书

# 切换目录到 helm chart 包目录
cd deploy/certmanager-webhook-alidns# render template,只展示渲染后的 yaml 文件,不安装
helm template certmanager-webhook-alidns . --set issuer.create=true --set issuer.host=weihanli.top --set issuer.email=weihanli@outlook.com --set issuer.secret.accessKeyId=AliAccessKeyId --set issuer.secret.accessKeySecret=AliAccessKeySecret -n cert-manager# install without creating ClusterIssuer,安装 webhook,但是不创建证书 issuer 和申请证书
helm install certmanager-webhook-alidns . -n cert-manager# install with creating ClusterIssuer,安装 webhook 并创建证书 issuer 和申请 https 证书
helm install certmanager-webhook-alidns . --set issuer.create=true --set issuer.host=weihanli.top --set issuer.email=weihanli@outlook.com --set issuer.secret.accessKeyId=AliAccessKeyId --set issuer.secret.accessKeySecret=AliAccessKeySecret -n cert-manager

可以使用 helm template 来测试自己要安装的资源情况

默认只安装 webhook 不会创建 ClusterIssuer 以及证书,如果要创建需要提供更多参数,需要指定 issuer.createtrue,然后通过 issuer.email 来指定申请证书的邮箱,并且需要提供阿里云的 accessKeyId 和 accessKeySecret 来修改 DNS 解析记录以实现自动地 DNS 验证进而自动签发证书,默认地创建 ClusterIssuer 的时候也会创建一个证书,如果不需要创建证书则配置 issuer.createCertfalse,如果要创建需要指定一个域名,比如 weihanli.top

上面最后一个命令会自动创建证书,安装完成后,我们就可以去检查我们的证书了,执行kubectl get cert -n cert-manager 来查看 cert-manager 命名空间下的证书,上面命令创建的证书名称是 weihanli-top-tls-cert,会是 host 名字把 . 替换成 - 然后加上 -tls-cert,证书签发完成 kubectl get secret -n cert-manager 会看到和证书同名的一个 secret

类似下面这样

NAMETYPEDATAAGE
weihanli-top-tls-certkubernetes.io/tls24d

上面的命令会创建一个 ClusterIssuer 和 Certificate,yaml 定义如下:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:name: letsencryptlabels:app: webhook-alidnschart: webhook-alidns-0.1.0release: certmanager-webhook-alidnsheritage: Helm
spec:acme:server: https://acme-v02.api.letsencrypt.org/directoryemail: "weihanli@outlook.com"privateKeySecretRef:name: letsencryptsolvers:- dns01:webhook:config:accessKeyId: AliAccessKeyIdaccessKeySecretRef:key: accessKeySecretname: ali-credentialregionId: "cn-shanghai"ttl: 600groupName: certmanager.webhook.alidnssolverName: alidns
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:name: weihanli-top-tls-certlabels:app: webhook-alidnschart: webhook-alidns-0.1.0release: certmanager-webhook-alidnsheritage: Helm
spec:commonName: "weihanli.top"dnsNames:- "weihanli.top"- '*.weihanli.top'issuerRef:kind: ClusterIssuername: letsencryptsecretName: weihanli-top-tls-cert

同时还会有一个保存阿里云 accessKeyId 和 accessKeySecret 的 secret 生成

apiVersion: v1
kind: Secret
metadata:labels:app: webhook-alidnschart: webhook-alidns-0.1.0release: certmanager-webhook-alidnsheritage: Helmname: ali-credential
type: Opaque
data:accessKeyId: "QWxpQWNjZXNzS2V5SWQ="accessKeySecret: "QWxpQWNjZXNzS2V5U2VjcmV0"

有了证书之后我们就可以配置成 Ingress 默认的 https 证书,这样就不需要每个 ingress 都指定证书 secret 了,我们使用基于 nginx 的 ingress-nginx 来配置,通过 helm 来安装配置 ingress-nginx

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo updatehelm install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx --set controller.extraArgs.default-ssl-certificate=cert-manager/weihanli-top-tls-cert --create-namespace

controller.extraArgs.default-ssl-certificate 配置为我们的证书对应的 secret,格式为:<namespace>/<secret-name>

然后我们就可以在 ingress 中配置 https 了,下面是一个配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:cert-manager.io/cluster-issuer: letsencryptkubernetes.io/ingress.class: nginxname: homepagenamespace: default
spec:rules:- host: weihanli.tophttp:paths:- backend:service:name: homepageport:number: 80path: /pathType: Prefixtls:- hosts:- weihanli.top

这里我们不需要指定证书的 secret,因为我们已经设置了默认的证书配置,再看一个示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/rewrite-target: /$1name: sparktodo-api-ingress
spec:rules:- host: "sparktodo-api.weihanli.top"http:paths:- pathType: Prefixpath: "/?(.*)"backend:service:name: sparktodo-apiport:number: 80- pathType: Prefixpath: "/monitor/?(.*)"backend:service:name: sparktodo-apiport:number: 52323tls:- hosts:- sparktodo-api.weihanli.top

这个示例稍微复杂一些,主要是 /monitor/ 开头的请求转给 52323 端口,其他的请求转给 80 端口

More

按照上面的 helm chart 来配置自我感觉还是比较简单的,更多配置选项可以参考 helm chart 包的定义

https://github.com/WeihanLi/certmanager-webhook-alidns,

如果想自己玩一下,可能会遇到一些问题,cert-manager 的文档可能会帮到你 https://cert-manager.io/docs/faq/acme/,你也可以基于我魔改的再魔改一下哈

另外 cert-manager 文档上有一张非常详细的图来介绍证书的申请、验证、颁发整个过程,值得一看

b342ef3ea831e005eae8bb4125e40137.png

Life of a Certificate

References

  • https://www.cnblogs.com/tencent-cloud-native/p/13883790.html

  • https://github.com/WeihanLi/certmanager-webhook-alidns

  • https://cert-manager.io/docs/installation/helm/

  • https://cert-manager.io/docs/faq/acme/

  • https://helm.sh/docs/intro/install/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么要学数学?因为它真的没用啊!

全世界只有3.14 % 的人关注了爆炸吧知识数学之用无用之用有一天&#xff0c;表妹过来问了我两个问题&#xff1a;数学有什么用&#xff1f;那些深奥的公式对于普通人有什么意义&#xff1f;相信大多数人都有这个疑问&#xff0c;但总是找不到一个标准答案。问老师&#xff0c;他…

UI设计教程-界面设计构图

九宫格构图&#xff0c;圆心点放射形构图&#xff0c;三角形构图&#xff0c;SF字形构图。 1.九宫格网格构图 这种版式主要运用在分类为主的一级页面&#xff0c;起到功能分类的作用。 通常在界面设计中&#xff0c;我们会利用网格在界面进行布局&#xff0c;根据水平方向和垂直…

Android之最好理解的Binder机制

转载&#xff1a;http://weishu.me/2016/01/12/binder-index-for-newer/ Binder学习指南 发表于 2016-01-12 | 92条评论 | 34011次阅读毫不夸张地说&#xff0c;Binder是Android系统中最重要的特性之一&#xff1b;正如其名“粘合剂”所喻&#xff0c;它是系统间各个组件…

sql年月日24小时制_24小时制的「无码」真人秀,令人叫绝

几年前&#xff0c;我们总说互联网给世界带来了巨大的变化。到了现在&#xff0c;没想到自媒体的发展居然也能改变生活。但大家知道吗&#xff0c;其实早在20年前&#xff0c;美国那边就曾因“直播”掀起过不小的风浪——还是尺度挺大的那种。以至于毒师看过以后&#xff0c;整…

HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...

背景HangFire有个很奇怪的现象&#xff0c;就是即使你设置的循环作业是一天一次&#xff0c;但是每次作业执行很长时间&#xff0c;我们假设是1小时&#xff0c;那么差不多在开始执行之后的30分钟之后&#xff0c;如果还在执行job,系统就会自动帮你重新开启了新的job执行。也就…

linux之查看文件大小、文件夹的大小和分区磁盘速度

1 查看文件大小 查看文件大小的命令 ls -l filename 比如: 注意这个 1243870 是 单位是B 2 查看文件夹的大小 查看文件夹的大小,也就是查看文件夹下所有文件的大小总和 先进入这个目录: cd FoldeName 命令如下: du -sh 3 查看分区磁盘速度 命令如下:

再谈“开源软件供应链安全”

| 作者&#xff1a;庄表伟| 编辑&#xff1a;刘雪洁| 设计&#xff1a;周颖| 责编&#xff1a;王玥敏缘起之前写过一篇文章《我所理解的开源软件供应链安全》&#xff0c;当时的情况&#xff0c;还没有出现一些值得探讨的&#xff0c;堪称紧迫的热点事件&#xff0c;所以我也仅…

python 测试框架

2019独角兽企业重金招聘Python工程师标准>>> # -*- encodeing:utf-8 -*- import unittest class WidgetTestCase(unittest.TestCase): def setUp(self): self.size 4 def tearDown(self): self.size 0 def testSize(self): self.assertEqual(self.size, 4) def su…

从抛硬币试验看随机游走定义的基本概念错误

全世界只有3.14 % 的人关注了爆炸吧知识随机游走&#xff08;Random Walk&#xff09;是《随机过程》教科书中用于描述动态随机现象的一种基本随机过程&#xff0c;许多重要的随机过程都可由它派生出来&#xff0c;其理论不仅在随机过程中占有相当重要的地位&#xff0c;而且也…

正则表达式学习手册

效果图<ignore_js_op style"word-wrap: break-word;">详细说明&#xff1a;http://java.662p.com/thread-3932-1-1.html转载于:https://www.cnblogs.com/huasili/p/4152584.html

excel下划线转驼峰公式

最近为了省事&#xff0c;决定从excel将表结构生成jquery.datatable的json对象结构&#xff0c;其中要把下划线转驼峰&#xff0c;如下&#xff1a; LEFT(C251,1)&MID(SUBSTITUTE(PROPER(C251),"_",""),2,100)

NSCoding和NSCopy

为什么80%的码农都做不了架构师&#xff1f;>>> 很多时候我们都需要将对象序列化&#xff0c;比如将一个对象存入到NSUserDefault 里面去的时候&#xff0c;由于NSUserDefault支持存入的类型有限制&#xff0c;所以很多时候我们需要将NSObject类型的对象转换成NSDa…

如何判断对象是不是出轨了?

1 教官让学生表演才艺&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 人类幼崽的想象力能有多丰富&#xff1f;&#xff08;素材来源豆瓣&#xff0c;侵删&#xff09;▼3 来自医生的建议&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 这个手机壳很不…

Android之用AccessibilityService实现红包插件

微信红包自打出世以来就极其受欢迎,抢红包插件可谓红极一时.今天,我们重新谈谈抢红包插件的哪些事儿.本质上,抢红包插件的原理不难理解,其过程就是在收到红包时,自动模拟点击.做过自动化UI测试的童鞋应该非常熟悉了.那么问题来了,我们怎么知道有没有红包,又怎么模拟点击操作呢?…

【软件周刊】D语言卷土重来,Vue.js 应获 1024 个赞,小薇可以一键启动了

2019独角兽企业重金招聘Python工程师标准>>> 一、 前端相关 1. Vue.js — Vue.js 这次的更新比较频繁&#xff0c;才刚刚更新完 2.0.4 版本不久&#xff0c;立马就更新出了 2.0.5 版本。这次发布的 2.0.4 版本主要的亮点是 SSR 性能改进了 20%&#xff0c;然后接着更…

Autofac实现拦截器和切面编程

Autofac.Annotation框架是我用.netcore写的一个注解式DI框架&#xff0c;基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址&#xff1a;https://github.com/yuzd/Autofac.Annotation上期说了Autofac实现有条件的DI本期讲的是最新…