CodeSnippet.Cn
代码片段
Csharp
架构设计
.NetCore
西班牙语
kubernetes
MySql
Redis
Algorithm
Ubuntu
Linux
Other
.NetMvc
VisualStudio
Git
pm
Python
WPF
java
Plug-In
分布式
CSS
微服务架构
JavaScript
DataStructure
Shared
cert-manager+Let‘s Encrypt自动证书签发
0
kubernetes
小笨蛋
发布于:2022年03月10日
更新于:2022年03月10日
114
#custom-toc-container
### 前言 说到免费的SSL证书,大家首先想到的肯定是Let’s Encrypt,而使用过Let’s Encrypt的同学应该也知道,其有效期只有三个月,三个月后要重新续期。github上也有类似的脚本可以做到自动续期。那如果是在k8s上使用该免费证书,又如何操作的呢?这里cert-manager就派上用场了。 ### 什么是cert-manager > cert-manager 是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期,支持 Let’s Encrypt, HashiCorp Vault 这些免费证书的签发。在Kubernetes集群中,我们可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。 > 在Kubernetes集群中使用 HTTPS 协议,需要一个证书管理器、一个证书自动签发服务,主要通过 Ingress 来发布 HTTPS 服务,因此需要Ingress Controller并进行配置,启用 HTTPS 及其路由。 ![图片alt](/uploads/images/20220310/183317-c67e29a815a940b5a094a29f1877d833.png ''代码片段:Www.CodeSnippet.Cn'') - Issuer/ClusterIssuer: 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuer 与 Issuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。 - Certificate: 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。 ### 安装cert-manager 安装cert-manager ```yaml # Kubernetes 1.16+ $ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager.yaml # Kubernetes <1.16 $ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager-legacy.yaml ``` 安装crds-要不然创建ClusterIssuer会报错 ```yaml # Kubernetes 1.15+ $ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager.crds.yaml # Kubernetes <1.15 $ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager-legacy.crds.yaml ``` ### cert-manager使用案例 #### 1.创建一个集群级的签发机构 ```yaml # 配置 cat <
cluster-issuer.yaml apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod #是我们创建的签发机构的名称,后面我们创建证书的时候会引用它 spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: codeSnippet@.cn #你自己的邮箱,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期 privateKeySecretRef: #指示此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要 name: letsencrypt-prod solvers: #是 acme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行 - http01: #这里指示签发机构使用 HTTP-01 的方式进行 acme 协议 (还可以用 DNS 方式,acme 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书) ingress: class: nginx EOF ``` ```yaml # 执行发布命令 kubectl apply -f cluster-issuer.yaml ``` #### 2.域名解析添加A记录-记录值为集群中的任意worker节点 #### 3.创建一个命名空间 `kubectl create ns mldong-test` #### 4.创建一个证书 ```yaml # 配置 cat <
b-cert.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: b.mldong.com-tls namespace: mldong-test spec: secretName: b.mldong.com-tls #指示证书最终存到哪个 Secret 中 issuerRef: name: letsencrypt-prod #我们创建的签发机构的名称 (ClusterIssuer.metadata.name) kind: ClusterIssuer #值为 ClusterIssuer 说明签发机构不在本 namespace 下,而是在全局 dnsNames: - b.mldong.com #指示该证书的可以用于哪些域名,与域名解析的一致 EOF ``` #### 5.可以查看临时生成的专门验证证书的 Ingress 对象的运行情况 `kubectl get pods -n mldong-test -w` 临时对象`cm-acme-http-solver-xxxx`从创建到消亡的过程 #### 6.执行发布命令 `kubectl apply -f b-cert.yaml` #### 7.查看certificate创建结果 ```yaml [root@mldong cert-manager]# kubectl get certificate -n mldong-test NAME READY SECRET AGE b.mldong.com-tls True b.mldong.com-tls 2m27s ``` 当READY为True时即为成功,详细可看cert-manager运行日志。 ### 小结 - 创建一个集群级的签发机构-ClusterIssuer-仅第一次需要 - 添加一条域名解析记录-指向集群的任意worker节点 - 根据解析的域名生成certificate - 发布应用 - 发布Pod - 发布Service - 发布Ingress-这里配置tls证书,指向certificate
这里⇓感觉得写点什么,要不显得有点空,但还没想好写什么...
返回顶部
About
京ICP备13038605号
© 代码片段 2024