kubectl apply
了解如何使用 kubectl 和静态清单安装证书管理器。
先决条件
- 安装
kubectl
版本>= v1.19.0
。否则,您在更新 CRD 时可能会遇到问题 - 请参见 v0.16 升级说明)。 - 安装 受支持的 Kubernetes 或 OpenShift 版本。
- 如果您在云平台上使用 Kubernetes,请阅读 与 Kubernetes 平台提供商的兼容性。
步骤
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-managerNAME READY STATUS RESTARTS AGEcert-manager-5c6866597-zw7kh 1/1 Running 0 2mcert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2mcert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m
您应该看到 cert-manager
、cert-manager-cainjector
和 cert-manager-webhook
pod 处于 运行
状态。webhook 的成功配置可能需要比其他组件稍长的时间。
如果您遇到问题,请首先查看 常见问题解答。
2.(可选)等待 cert-manager webhook 准备就绪
webhook 组件可能需要一些时间才能启动,并且使 Kubernetes API 服务器信任 webhook 的证书。
首先,确保 已安装 cmctl。
cmctl 对 Kubernetes 集群执行证书创建的试运行检查。如果成功,将显示消息 cert-manager API 已准备就绪
。
$ cmctl check apiThe cert-manager API is ready
该命令还可用于等待检查成功。以下是在安装 cert-manager 同时运行命令的输出示例。
$ cmctl check api --wait=2mNot ready: the cert-manager CRDs are not yet installed on the Kubernetes API serverNot ready: the cert-manager CRDs are not yet installed on the Kubernetes API serverNot ready: the cert-manager webhook deployment is not ready yetNot ready: the cert-manager webhook deployment is not ready yetNot ready: the cert-manager webhook deployment is not ready yetNot ready: the cert-manager webhook deployment is not ready yetThe cert-manager API is ready
2.(可选)端到端验证安装
完全验证安装的最佳方法是发出测试证书。为此,我们将在测试命名空间中创建一个自签名颁发者和证书资源。
cat <<EOF > test-resources.yamlapiVersion: v1kind: Namespacemetadata:name: cert-manager-test---apiVersion: cert-manager.io/v1kind: Issuermetadata:name: test-selfsignednamespace: cert-manager-testspec:selfSigned: {}---apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: selfsigned-certnamespace: cert-manager-testspec:dnsNames:- example.comsecretName: selfsigned-cert-tlsissuerRef:name: test-selfsignedEOF
创建测试资源。
kubectl apply -f test-resources.yaml
检查新创建的证书的状态。您可能需要等待几秒钟,才能让 cert-manager 处理证书请求。
$ kubectl describe certificate -n cert-manager-test...Spec:Common Name: example.comIssuer Ref:Name: test-selfsignedSecret Name: selfsigned-cert-tlsStatus:Conditions:Last Transition Time: 2019-01-29T17:34:30ZMessage: Certificate is up to date and has not expiredReason: ReadyStatus: TrueType: ReadyNot After: 2019-04-29T17:34:29ZEvents: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
资源可能会导致 TLSSecret
被删除,如果它们具有由 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-webhookkubectl delete validatingwebhookconfigurations cert-manager-webhook
然后,通过编辑挑战资源将 .metadata.finalizers
字段更改为空列表。
kubectl edit challenge <the-challenge>