这里使用helm安装的1.6.1版本
先决条件
安装 Helm 版本 3 或更高版本。安装受支持的 Kubernetes 或 OpenShift 版本。如果您在云平台上使用 Kubernetes,请阅读与 Kubernetes 平台提供商的兼容性
1、添加 Jetstack Helm 存储库:
$ helm repo add jetstack https://charts.jetstack.io
2、更新您本地的 Helm 图表存储库缓存
$ helm repo update
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 <
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-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.ioKubernetes 的垃圾收集器将删除所有证书管理器资源(例如资源)。
$ 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: IngressapiVersion: networking.k8s.io/v1metadata: 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: PathPrefixStripspec: 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: 80status: loadBalancer: {}