最新:在推特Mastodon

kubectl apply

了解如何使用 kubectl 和静态清单安装证书管理器。

先决条件

步骤

1. 从 cert-manager 发布清单中安装

所有资源(CustomResourceDefinitions 和 cert-manager、cainjector 和 webhook 组件)都包含在一个单独的 YAML 清单文件中。

安装所有 cert-manager 组件。

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml

默认情况下,cert-manager 将安装到 cert-manager 命名空间中。可以在不同的命名空间中运行 cert-manager,但您需要对部署清单进行修改。

安装 cert-manager 后,您可以通过检查 cert-manager 命名空间中是否有运行的 pod 来验证它是否已正确部署。

$ kubectl get pods --namespace cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-5c6866597-zw7kh 1/1 Running 0 2m
cert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2m
cert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m

您应该看到 cert-managercert-manager-cainjectorcert-manager-webhook pod 处于 运行 状态。webhook 的成功配置可能需要比其他组件稍长的时间。

如果您遇到问题,请首先查看 常见问题解答

2.(可选)等待 cert-manager webhook 准备就绪

webhook 组件可能需要一些时间才能启动,并且使 Kubernetes API 服务器信任 webhook 的证书。

首先,确保 已安装 cmctl

cmctl 对 Kubernetes 集群执行证书创建的试运行检查。如果成功,将显示消息 cert-manager API 已准备就绪

$ cmctl check api
The cert-manager API is ready

该命令还可用于等待检查成功。以下是在安装 cert-manager 同时运行命令的输出示例。

$ cmctl check api --wait=2m
Not ready: the cert-manager CRDs are not yet installed on the Kubernetes API server
Not ready: the cert-manager CRDs are not yet installed on the Kubernetes API server
Not ready: the cert-manager webhook deployment is not ready yet
Not ready: the cert-manager webhook deployment is not ready yet
Not ready: the cert-manager webhook deployment is not ready yet
Not ready: the cert-manager webhook deployment is not ready yet
The cert-manager API is ready

2.(可选)端到端验证安装

完全验证安装的最佳方法是发出测试证书。为此,我们将在测试命名空间中创建一个自签名颁发者和证书资源。

cat <<EOF > test-resources.yaml
apiVersion: v1
kind: Namespace
metadata:
name: cert-manager-test
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: test-selfsigned
namespace: cert-manager-test
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: selfsigned-cert
namespace: cert-manager-test
spec:
dnsNames:
- example.com
secretName: selfsigned-cert-tls
issuerRef:
name: test-selfsigned
EOF

创建测试资源。

kubectl apply -f test-resources.yaml

检查新创建的证书的状态。您可能需要等待几秒钟,才能让 cert-manager 处理证书请求。

$ kubectl describe certificate -n cert-manager-test
...
Spec:
Common Name: example.com
Issuer Ref:
Name: test-selfsigned
Secret Name: selfsigned-cert-tls
Status:
Conditions:
Last Transition Time: 2019-01-29T17:34:30Z
Message: Certificate is up to date and has not expired
Reason: Ready
Status: True
Type: Ready
Not After: 2019-04-29T17:34:29Z
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CertIssued 4s cert-manager Certificate issued successfully

清理测试资源。

kubectl delete -f test-resources.yaml

如果所有上述步骤都已完成并且没有错误,那么您就可以开始了!

卸载

警告:要卸载 cert-manager,您应始终使用与安装相同的流程,但以相反的顺序进行。无论 cert-manager 是从静态清单还是 Helm 安装,偏离以下流程都可能导致问题并可能导致错误状态。卸载时请务必按照以下步骤操作,以防止这种情况发生。

在继续之前,请确保已删除用户创建的任何不需要的 cert-manager 资源。您可以使用以下命令检查是否存在任何现有资源。

kubectl get Issuers,ClusterIssuers,Certificates,CertificateRequests,Orders,Challenges --all-namespaces

建议您在卸载 cert-manager 之前删除所有这些资源。如果您计划稍后重新安装并且不想丢失某些自定义资源,则可以保留它们。但是,这可能会导致 finalizer 出现问题。一些资源,如 Challenges,应予以删除,以避免 卡在挂起状态

一旦删除了不需要的资源,您就可以根据安装方式确定卸载 cert-manager 的步骤。

警告:卸载 cert-manager 或简单地删除 Certificate 资源可能会导致 TLS Secret 被删除,如果它们具有由 cert-manager 设置的 metadata.ownerReferences。您可以使用 --enable-certificate-owner-ref 控制器标志来控制是否将所有者引用添加到 Secret 中。默认情况下,该标志设置为 false,这意味着不会添加任何所有者引用。但是,在 cert-manager v1.8 及更早版本中,将标志的值从 true 更改为 false 不会导致删除现有的所有者引用。此行为已在 cert-manager v1.8 中修复。请检查所有者引用,以确认它们确实已删除。

使用常规清单卸载

使用常规清单进行卸载相当于以相反的顺序运行安装过程,使用 kubectl 的删除命令。

使用指向您当前运行的版本 vX.Y.Z 的链接删除安装清单,如下所示。

警告:此命令还会删除已安装的 cert-manager CRD。所有 cert-manager 资源(例如,certificates.cert-manager.io 资源)将由 Kubernetes 的垃圾回收器删除。如果您删除 CustomResourceDefinition,则无法保留任何自定义资源。如果您想保留资源,则应分别管理 CustomResourceDefinition

kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/vX.Y.Z/cert-manager.yaml

命名空间卡在终止状态

如果命名空间已标记为删除但未先删除 cert-manager 安装,则命名空间可能会卡在终止状态。这通常是由于 APIService 资源仍然存在,但 webhook 不再运行,因此无法访问。要解决此问题,请确保您已正确运行上述命令,如果仍然遇到问题,请运行以下命令。

kubectl delete apiservice v1beta1.webhook.cert-manager.io

删除挂起的挑战

Challenge 可能在 finalizer 无法完成并且 Kubernetes 正在等待 cert-manager 控制器完成时卡在挂起状态。当控制器不再运行以删除标志并且资源定义为需要等待时,就会发生这种情况。您可以通过手动执行控制器执行的操作来解决此问题。

首先,删除现有的 cert-manager webhook 配置(如果有)。

kubectl delete mutatingwebhookconfigurations cert-manager-webhook
kubectl delete validatingwebhookconfigurations cert-manager-webhook

然后,通过编辑挑战资源将 .metadata.finalizers 字段更改为空列表。

kubectl edit challenge <the-challenge>