一、安装
这里使用helm安装的1.6.1版本
先决条件
- 安装 Helm 版本 3 或更高版本。
- 安装受支持的 Kubernetes 或 OpenShift 版本。
- 如果您在云平台上使用 Kubernetes,请阅读与 Kubernetes 平台提供商的兼容性
1. 添加 Jetstack Helm 存储库:
$ helm repo add jetstack https: //charts.jetstack.io |
2. 更新您本地的 Helm 图表存储库缓存
3.安装 CustomResourceDefinitions
cert-manager 需要一些 CRD 资源,可以使用手动安装,也可以在安装 Helm chart 时kubectl
使用installCRDs
选项。
选项 1:安装 CRD kubectl
kubectl apply -f https: //github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.crds.yaml |
选项 2:安装 CRD 作为 Helm 版本的一部分
要在 Helm 版本中自动安装和管理 CRD,您必须将--set installCRDs=true
标志添加到 Helm 安装命令中。
在接下来的步骤中取消注释相关行以启用此功能。
请注意,如果您使用的是helm
基于 Kubernetesv1.18
或更低版本(Helm v3.2
) 的版本,installCRDs
则无法与 cert-manager 一起使用v0.16
。有关更多详细信息,请参阅v0.16 升级说明。
4.安装证书管理器
要安装 cert-manager Helm chart,请使用Helm install 命令,如下所述。
helm install \ --name-template cert-manager \ --namespace cert-manager \ --set ingressShim.defaultIssuerName=letsencrypt-prod \ --set ingressShim.defaultIssuerKind=ClusterIssuer \ --version v1. 6.1 \ jetstack/cert-manager |
--set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer:用于全自动TLS,在ingress.yaml中配置kubernetes.io/tls-acme: "true"后会自动创建证书
部署 cert-manager 后,您可以验证安装。
查看
root @master24 :~# kubectl get pods --namespace cert-manager -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES cert-manager-57d89b9548-dq4k7 1 / 1 Running 0 3h 10.244 . 122.147 node26 cert-manager-cainjector-5bcf77b697-gwss2 1 / 1 Running 0 3h 10.244 . 122.146 node26 cert-manager-webhook-9cb88bd6d-djxxm 1 / 1 Running 0 3h 10.244 . 122.145 node26 |
验证
创建测试资源 kubectl apply -f test-resources.yaml
[root @master cert-manager]# cat < test-resources.yaml apiVersion: v1 kind: Namespace metadata: name: cert-manager-test --- apiVersion: cert-manager.io/v1alpha2 kind: Issuer metadata: name: test-selfsigned namespace: cert-manager-test spec: selfSigned: {} --- apiVersion: cert-manager.io/v1alpha2 kind: Certificate metadata: name: selfsigned-cert namespace: cert-manager-test spec: commonName: example.com secretName: selfsigned-cert-tls issuerRef: name: test-selfsigned EOF |
检查新创建证书的状态。您可能需要等待几秒钟,然后cert-manager
才能处理证书请求。
[root @master cert-manager]# kubectl describe certificate.cert-manager.io -n cert-manager-test Name: selfsigned-cert Namespace: cert-manager-test Labels: Annotations: kubectl.kubernetes.io/last-applied-configuration: { "apiVersion" : "cert-manager.io/v1alpha2" , "kind" : "Certificate" , "metadata" :{ "annotations" :{}, "name" : "selfsigned-cert" , "namespace" :"cert-mana... API Version: cert-manager.io/v1alpha2 Kind: Certificate Metadata: Creation Timestamp: 2019 - 12 -11T08: 23 :18Z Generation: 1 Resource Version: 2363190 Self Link: /apis/cert-manager.io/v1alpha2/namespaces/cert-manager-test/certificates/selfsigned-cert UID: 0c152ff9-184e-4b8f-9fe7-fc4fb4b2d86f Spec: Common Name: example.com Issuer Ref: Name: test-selfsigned Secret Name: selfsigned-cert-tls Status: Conditions: Last Transition Time: 2019 - 12 -11T08: 23 :18Z Message: Certificate is up to date and has not expired Reason: Ready Status: True Type: Ready Not After: 2020 - 03 -10T08: 23 :18Z Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal GeneratedKey 10s cert-manager Generated a new private key Normal Requested 10s cert-manager Created new CertificateRequest resource "selfsigned-cert-2334779822" Normal Issued 10s cert-manager Certificate issued successfully |
清理测试资源。
[root @master cert-manager]# kubectl delete -f test-resources.yaml |
输出 YAML
可以使用Helm 模板命令创建静态 YAML 清单,而不是使用 Helm 直接安装 cert-manager 。可以通过提供覆盖默认 Helm 值的标志来调整此静态清单:
helm template \ cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1. 6.1 \ # --set prometheus.enabled= false \ # Example: disabling prometheus using a Helm parameter # --set installCRDs= true \ # Uncomment to also template CRDs > cert-manager.custom.yaml |
卸载
警告:要卸载 cert-manger,您应该始终使用相同的安装过程,但相反。从静态清单或 Helm 安装 cert-manager 是否偏离以下过程可能会导致问题和潜在的损坏状态。请确保在卸载时遵循以下步骤以防止发生这种情况。
在继续之前,请确保已删除用户创建的所有 cert-manager 资源。您可以使用以下命令检查任何现有资源:
kubectl get Issuers,ClusterIssuers,Certificates,CertificateRequests,Orders,Challenges --all-namespaces |
删除所有这些资源后,您就可以使用由您的安装方式确定的过程卸载 cert-manager
使用 Helm 卸载
从helm
安装中卸载 cert-manager是运行安装过程的一种情况,相反,在kubectl
和上使用 delete 命令helm
。
helm --namespace cert-manager delete cert-manager |
接下来,删除 cert-manager 命名空间:
kubectl delete namespace cert-manager |
最后,CustomResourceDefinitions 使用vX.Y.Z
您安装的版本的链接删除证书管理 器:
警告:此命令还将删除已安装的 cert-manager CRD。certificates.cert-manager.io
Kubernetes 的垃圾收集器将删除所有证书管理器资源(例如资源)。
$ kubectl delete -f https://github.com/jetstack/cert-manager/releases/download/vX.Y.Z/cert-manager.crds.yaml
命名空间卡在终止状态
如果命名空间已被标记为删除,而没有先删除 cert-manager 安装,则命名空间可能会卡在终止状态。这通常是因为APIService资源仍然存在,但是 webhook 不再运行,因此不再可访问。要解决此问题,请确保您已正确运行上述命令,如果您仍然遇到问题,请运行:
$ kubectl delete apiservice v1beta1.webhook.cert-manager.io
二、配置
ACME配置
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: # The ACME server URL server: https: //acme-v02.api.letsencrypt.org/directory # Email address used for ACME registration email: 664269713 @qq .com # Name of a secret used to store the ACME account private key from step 3 privateKeySecretRef: name: letsencrypt-prod # Enable the HTTP- 01 challenge provider solvers: - http01: ingress: class : traefik # 运行 [root @master cert-manager]# kubectl create -f production-issuer.yaml |
metadata.name 是我们创建的签发机构的名称,后面我们创建证书的时候会引用它
spec.acme.email 是你自己的邮箱,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期
spec.acme.server 是 acme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行
spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要
spec.acme.http01 这里指示签发机构使用 HTTP-01 的方式进行 acme 协议 (还可以用 DNS 方式,acme 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)
[root @master cert-manager]# kubectl get clusterissuer.cert-manager.io NAME READY AGE letsencrypt-prod True 3m46s |
三、使用出现的问题以及解决方式
k8s集群是1.22.4的,使用这个会造成证书签发不成功
kubectl get certificate 查看READY对应的是False,好久都不会成功
解决方式:
在ingress.yaml加入以下配置
cert-manager.io/issue-temporary-certificate: "true" acme.cert-manager.io/http01-edit-in-place: "true" |
如:
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: third-platform-management
annotations:
acme.cert-manager.io/http01-edit-in-place: 'true'
cert-manager.io/cluster-issuer: letsencrypt-prod
cert-manager.io/issue-temporary-certificate: 'true'
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/redirect-entry-point: https
traefik.ingress.kubernetes.io/router.middlewares: zmj-prod-scheme@kubernetescrd
traefik.ingress.kubernetes.io/router.tls: 'true'
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
spec:
tls:
- hosts:
- platfrom.zmarthome.cn
secretName: third-platform-management-tls
rules:
- host: platfrom.zmarthome.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: third-platform-management
port:
number: 80
status:
loadBalancer: {}