如果你问一位经验丰富、睿智的工程师他对 cert-manager 的看法以及为什么每个人都使用它,那么专家会叹息,自信地拥抱他并疲倦地说:“每个人都使用它,因为没有明智的选择。 我们的老鼠会哭、会刺,但会继续与这种仙人掌共存。 我们为什么爱? 因为它有效。 我们为什么不爱? 因为使用新功能的新版本不断出现。 而且你必须一遍又一遍地更新集群。 旧版本停止工作,因为有一个阴谋和一个伟大的神秘萨满教。
但开发商声称 证书管理器 1.0 一切都会改变。
相信吗?
Cert-manager 是原生的 Kubernetes 证书管理控制器。 它可用于颁发来自各种来源的证书:Let's Encrypt、HashiCorp Vault、Venafi、签名和自签名密钥对。 它还允许您在过期日期之前使密钥保持最新,并尝试在证书过期前的指定时间自动续订证书。 Cert-manager 基于 kube-lego 并且还使用了其他类似项目(例如 kube-cert-manager)的一些技巧。
发行说明
在 1.0 版中,我们为 cert-manager 项目三年的开发打上了信任的标记。 在此期间,它在功能和稳定性方面取得了显着发展,但最重要的是在社区方面。 今天,我们看到许多人使用它来保护他们的 Kubernetes 集群并将其部署到生态系统的各个部分。 在最近的 16 个版本中修复了很多错误。 而该破的就破了。 使用 API 的几次访问改进了它与用户的交互。 我们已经解决了 GitHub 上的 1500 个问题以及来自 253 个社区成员的更多拉取请求。
随着1.0的发布,我们正式宣布cert-manager是一个成熟的项目。 我们还承诺保持我们的 API 兼容 v1
.
非常感谢这三年来帮助我们制作 cert-manager 的每一个人! 让 1.0 版成为许多重大事件中的第一个。
1.0 版是一个稳定的版本,有几个优先领域:
-
v1
API; -
团队
kubectl cert-manager status
, 帮助分析问题; -
使用最新稳定的 Kubernetes API;
-
改进的日志记录;
-
ACME 改进。
升级前一定要阅读升级说明。
API v1
版本 v0.16 使用 API v1beta1
. 这增加了一些结构上的变化,也改进了 API 字段文档。 版本 1.0 在此基础上使用 API v1
. 这个API是我们第一个稳定的API,同时我们已经给出了兼容性保证,但是随着API v1
我们承诺在未来几年保持兼容性。
所做的更改(注意:我们的转换工具会为您处理一切):
证书:
-
emailSANs
现在叫emailAddresses
-
uriSANs
-uris
这些更改增加了与其他 SAN 的兼容性(主题替代名称, 约译者),以及 Go API。 我们将从我们的 API 中删除该术语。
更新
如果您使用的是 Kubernetes 1.16+,转换 webhook 将允许您同时无缝地使用 API 版本 v1alpha2
, v1alpha3
, v1beta1
и v1
. 有了这些,您将能够使用新版本的 API,而无需更改或重新部署您的旧资源。 我们强烈建议将您的清单升级到 API v1
,因为以前的版本很快就会被弃用。 用户 legacy
证书管理器的版本仍然只能访问 v1
,可以找到升级步骤
kubectl 证书管理器状态命令
随着我们对扩展的新改进 kubectl
调查与未颁发证书有关的问题变得更加容易。 kubectl cert-manager status
现在提供了有关证书的更多信息,还显示了证书颁发阶段。
安装扩展后,您可以运行 kubectl cert-manager status certificate <имя-сертификата>
,如果使用来自 ACME 的证书,它将查找具有给定名称的证书和任何相关资源,例如 CertificateRequest、Secret、Issuer、Order 和 Challenges。
调试尚未准备好的证书的示例:
$ kubectl cert-manager status certificate acme-certificate
Name: acme-certificate
Namespace: default
Created at: 2020-08-21T16:44:13+02:00
Conditions:
Ready: False, Reason: DoesNotExist, Message: Issuing certificate as Secret does not exist
Issuing: True, Reason: DoesNotExist, Message: Issuing certificate as Secret does not exist
DNS Names:
- example.com
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Issuing 18m cert-manager Issuing certificate as Secret does not exist
Normal Generated 18m cert-manager Stored new private key in temporary Secret resource "acme-certificate-tr8b2"
Normal Requested 18m cert-manager Created new CertificateRequest resource "acme-certificate-qp5dm"
Issuer:
Name: acme-issuer
Kind: Issuer
Conditions:
Ready: True, Reason: ACMEAccountRegistered, Message: The ACME account was registered with the ACME server
error when finding Secret "acme-tls": secrets "acme-tls" not found
Not Before: <none>
Not After: <none>
Renewal Time: <none>
CertificateRequest:
Name: acme-certificate-qp5dm
Namespace: default
Conditions:
Ready: False, Reason: Pending, Message: Waiting on certificate issuance from order default/acme-certificate-qp5dm-1319513028: "pending"
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal OrderCreated 18m cert-manager Created Order resource default/acme-certificate-qp5dm-1319513028
Order:
Name: acme-certificate-qp5dm-1319513028
State: pending, Reason:
Authorizations:
URL: https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/97777571, Identifier: example.com, Initial State: pending, Wildcard: false
Challenges:
- Name: acme-certificate-qp5dm-1319513028-1825664779, Type: DNS-01, Token: J-lOZ39yNDQLZTtP_ZyrYojDqjutMAJOxCL1AkOEZWw, Key: U_W3gGV2KWgIUonlO2me3rvvEOTrfTb-L5s0V1TJMCw, State: pending, Reason: error getting clouddns service account: secret "clouddns-accoun" not found, Processing: true, Presented: false
该命令还可以帮助您详细了解证书的内容。 Letsencrypt 颁发的证书的详细示例:
$ kubectl cert-manager status certificate example
Name: example
[...]
Secret:
Name: example
Issuer Country: US
Issuer Organisation: Let's Encrypt
Issuer Common Name: Let's Encrypt Authority X3
Key Usage: Digital Signature, Key Encipherment
Extended Key Usages: Server Authentication, Client Authentication
Public Key Algorithm: RSA
Signature Algorithm: SHA256-RSA
Subject Key ID: 65081d98a9870764590829b88c53240571997862
Authority Key ID: a84a6a63047dddbae6d139b7a64565eff3a8eca1
Serial Number: 0462ffaa887ea17797e0057ca81d7ba2a6fb
Events: <none>
Not Before: 2020-06-02T04:29:56+02:00
Not After: 2020-08-31T04:29:56+02:00
Renewal Time: 2020-08-01T04:29:56+02:00
[...]
使用最新稳定的 Kubernetes API
Cert-manager 是最早实施 Kubernetes CRD 的公司之一。 这一点,以及我们对 Kubernetes 1.11 版本的支持,意味着我们需要支持遗留的 apiextensions.k8s.io/v1beta1
也适用于我们的 CRD admissionregistration.k8s.io/v1beta1
对于我们的网络挂钩。 它们现在已被弃用,并将在 Kubernetes 1.22 版本中删除。 在我们的 1.0 版本中,我们现在提供全面支持 apiextensions.k8s.io/v1
и admissionregistration.k8s.io/v1
对于 Kubernetes 1.16(添加它们的地方)和更新版本。 对于之前版本的用户,我们继续提供支持 v1beta1
在我们的 legacy
版本。
改进的日志记录
在此版本中,我们将日志库更新为 klog/v2
,用于 Kubernetes 1.19。 我们还会审查我们撰写的每份期刊,以确保它被分配了适当的级别。 我们以此为指导 Error
(0 级),它只打印重要错误,并以 Trace
(第 5 级)这将帮助您准确了解正在发生的事情。 通过此更改,如果您在运行 cert-manager 时不需要调试信息,我们会减少日志数量。
提示:cert-manager 默认运行在 level 2 (Info
), 你可以使用 global.logLevel
在头盔图中。
注意:查看日志是进行故障排除时的最后手段。 有关更多信息,请查看我们的
编者注:要了解更多关于 Kubernetes 的工作原理,从实践教师那里获得宝贵的建议,以及优质的技术支持帮助,您可以参加在线强化
ACME 改进
cert-manager 最常见的用途可能与使用 ACME 从 Let's Encrypt 颁发证书有关。 1.0 版以使用社区反馈为我们的 ACME 发行者添加两个小但重要的改进而著称。
禁用帐户密钥生成
如果您大量使用 ACME 证书,您很可能在多个集群上使用同一个帐户,因此您的证书颁发限制将适用于所有这些。 在复制中指定的秘密时,这在 cert-manager 中已经是可能的 privateKeySecretRef
. 这个用例有很多问题,因为 cert-manager 试图提供帮助,如果找不到的话,它会很高兴地创建一个新的帐户密钥。 这就是为什么我们添加 disableAccountKeyGeneration
如果您将此选项设置为 true
- cert-manager 不会生成密钥并会警告您它没有提供帐户密钥。
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt
spec:
acme:
privateKeySecretRef:
name: example-issuer-account-key
disableAccountKeyGeneration: false
优选链
29 月 XNUMX 日让我们加密 ISRG Root
. 交叉签名证书将被替换为 Identrust
. 此更改不需要更改证书管理器设置,在此日期之后颁发的所有更新或新证书都将使用新的根 CA。
Let's Encrypt 已经使用此 CA 签署了证书,并通过 ACME 将它们作为“备用证书链”提供。 在此版本的证书管理器中,可以在颁发者设置中设置对这些链的访问。 在参数 preferredChain
您可以指定正在使用的 CA 的名称,证书将通过该名称颁发。 如果与请求匹配的 CA 证书可用,它将向您颁发证书。 请注意,这是首选选项,如果未找到任何内容,将颁发默认证书。 这将确保您在删除 ACME 颁发者端的备用链后仍会续订证书。
今天您已经可以收到由 ISRG Root
, 所以:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
preferredChain: "ISRG Root X1"
如果你喜欢离开链条 IdenTrust
- 将此选项设置为 DST Root CA X3
:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
preferredChain: "DST Root CA X3"
请注意,此根 CA 将很快被弃用,Let's Encrypt 将使此链保持活动状态,直到 29 年 2021 月 XNUMX 日。
来源: habr.com