前面k8s系列之一介绍ingress-nginx, 提到了采用kubespary安装的datalab k8s集群的ingress-nginx版本有些低, 在研究cert-manager时发现了同样的问题, 最新的cert-manager是稳定版本的(GA、mature), 官方介绍这是过去3年来的大成就, 新版本主要有下面几大特性:
API版本升级, 之前是v1alpha2, 现在是v1
提供了kubectl插件 cert-manager, 提供了丰富的辅助功能
日志方面的改善
ACME方面的改善

看官方的介绍,后续v1.x是主要的趋势, 就把当前的集群v0.16.1版本的cert-manager进行升级了,下面介绍具体过程。
根据官方文档介绍, v0.16到v1.0没有直接的升级方式, 需要先删除原来的安装, 再安装新的。 之前相关的cert-manager服务如下:
[root@host01 ~]# kubectl get all -n cert-managerNAME READY STATUS RESTARTS AGEpod/cert-manager-cainjector-fc6c787db-cjtgx 1/1 Running 0 47hpod/cert-manager-d994d94d7-ptqvj 1/1 Running 0 47hpod/cert-manager-webhook-845d9df8bf-fls2v 1/1 Running 0 47hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/cert-manager ClusterIP ip01 <none> 9402/TCP 47hservice/cert-manager-webhook ClusterIP ip02 <none> 443/TCP 47hNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/cert-manager 1/1 1 1 47hdeployment.apps/cert-manager-cainjector 1/1 1 1 47hdeployment.apps/cert-manager-webhook 1/1 1 1 47hNAME DESIRED CURRENT READY AGEreplicaset.apps/cert-manager-cainjector-fc6c787db 1 1 1 47hreplicaset.apps/cert-manager-d994d94d7 1 1 1 47hreplicaset.apps/cert-manager-webhook-845d9df8bf 1 1 1 47h
通过kubectl describe pod cert-manager-xx , 确认当前安装的版本为v0.16.1, 这次删除安装不再采用上一篇文章删除namespace及其它资源的方式,而是直接通过delete -f 资源定义文件 (即apply的相反过程)来完成,如下:
[root@host01 ~]# kubectl delete -f https://github.com/jetstack/cert-manager/releases/download/v0.16.1/cert-manager.yamlWarning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinitioncustomresourcedefinition.apiextensions.k8s.io "certificaterequests.cert-manager.io" deletedcustomresourcedefinition.apiextensions.k8s.io "certificates.cert-manager.io" deletedcustomresourcedefinition.apiextensions.k8s.io "challenges.acme.cert-manager.io" deletedcustomresourcedefinition.apiextensions.k8s.io "clusterissuers.cert-manager.io" deletedcustomresourcedefinition.apiextensions.k8s.io "issuers.cert-manager.io" deletedcustomresourcedefinition.apiextensions.k8s.io "orders.acme.cert-manager.io" deletednamespace "cert-manager" deletedserviceaccount "cert-manager-cainjector" deletedserviceaccount "cert-manager" deletedserviceaccount "cert-manager-webhook" deletedWarning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleclusterrole.rbac.authorization.k8s.io "cert-manager-cainjector" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-controller-issuers" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-controller-clusterissuers" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-controller-certificates" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-controller-orders" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-controller-challenges" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-controller-ingress-shim" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-view" deletedclusterrole.rbac.authorization.k8s.io "cert-manager-edit" deletedWarning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBindingclusterrolebinding.rbac.authorization.k8s.io "cert-manager-cainjector" deletedclusterrolebinding.rbac.authorization.k8s.io "cert-manager-controller-issuers" deletedclusterrolebinding.rbac.authorization.k8s.io "cert-manager-controller-clusterissuers" deletedclusterrolebinding.rbac.authorization.k8s.io "cert-manager-controller-certificates" deletedclusterrolebinding.rbac.authorization.k8s.io "cert-manager-controller-orders" deletedclusterrolebinding.rbac.authorization.k8s.io "cert-manager-controller-challenges" deletedclusterrolebinding.rbac.authorization.k8s.io "cert-manager-controller-ingress-shim" deletedWarning: rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Rolerole.rbac.authorization.k8s.io "cert-manager-cainjector:leaderelection" deletedrole.rbac.authorization.k8s.io "cert-manager:leaderelection" deletedrole.rbac.authorization.k8s.io "cert-manager-webhook:dynamic-serving" deletedWarning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBindingrolebinding.rbac.authorization.k8s.io "cert-manager-cainjector:leaderelection" deletedrolebinding.rbac.authorization.k8s.io "cert-manager:leaderelection" deletedrolebinding.rbac.authorization.k8s.io "cert-manager-webhook:dynamic-serving" deletedservice "cert-manager" deletedservice "cert-manager-webhook" deleteddeployment.apps "cert-manager-cainjector" deleteddeployment.apps "cert-manager" deleteddeployment.apps "cert-manager-webhook" deletedWarning: admissionregistration.k8s.io/v1beta1 MutatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 MutatingWebhookConfigurationmutatingwebhookconfiguration.admissionregistration.k8s.io "cert-manager-webhook" deletedWarning: admissionregistration.k8s.io/v1beta1 ValidatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 ValidatingWebhookConfigurationvalidatingwebhookconfiguration.admissionregistration.k8s.io "cert-manager-webhook" deleted
可以看到cert-manager相关的资源非常多。 下面安装最新版本的v1.1.0:
[root@host01 ~]# kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager.yamlcustomresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io createdcustomresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io createdcustomresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io createdcustomresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io createdcustomresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io createdcustomresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io creatednamespace/cert-manager createdserviceaccount/cert-manager-cainjector createdserviceaccount/cert-manager createdserviceaccount/cert-manager-webhook createdclusterrole.rbac.authorization.k8s.io/cert-manager-cainjector createdclusterrole.rbac.authorization.k8s.io/cert-manager-controller-issuers createdclusterrole.rbac.authorization.k8s.io/cert-manager-controller-clusterissuers createdclusterrole.rbac.authorization.k8s.io/cert-manager-controller-certificates createdclusterrole.rbac.authorization.k8s.io/cert-manager-controller-orders createdclusterrole.rbac.authorization.k8s.io/cert-manager-controller-challenges createdclusterrole.rbac.authorization.k8s.io/cert-manager-controller-ingress-shim createdclusterrole.rbac.authorization.k8s.io/cert-manager-view createdclusterrole.rbac.authorization.k8s.io/cert-manager-edit createdclusterrolebinding.rbac.authorization.k8s.io/cert-manager-cainjector createdclusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-issuers createdclusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-clusterissuers createdclusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-certificates createdclusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-orders createdclusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-challenges createdclusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-ingress-shim createdrole.rbac.authorization.k8s.io/cert-manager-cainjector:leaderelection createdrole.rbac.authorization.k8s.io/cert-manager:leaderelection createdrole.rbac.authorization.k8s.io/cert-manager-webhook:dynamic-serving createdrolebinding.rbac.authorization.k8s.io/cert-manager-cainjector:leaderelection createdrolebinding.rbac.authorization.k8s.io/cert-manager:leaderelection createdrolebinding.rbac.authorization.k8s.io/cert-manager-webhook:dynamic-serving createdservice/cert-manager createdservice/cert-manager-webhook createddeployment.apps/cert-manager-cainjector createddeployment.apps/cert-manager createddeployment.apps/cert-manager-webhook createdmutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook createdvalidatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created[root@host01 ~]## 查看已经安装的资源[root@host01 ~]# kubectl get all -n cert-managerNAME READY STATUS RESTARTS AGEpod/cert-manager-5597cff495-phdjj 1/1 Running 0 67spod/cert-manager-cainjector-bd5f9c764-csvgm 1/1 Running 0 67spod/cert-manager-webhook-5f57f59fbc-dqq54 1/1 Running 0 67sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/cert-manager ClusterIP ip01 <none> 9402/TCP 67sservice/cert-manager-webhook ClusterIP ip02 <none> 443/TCP 67sNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/cert-manager 1/1 1 1 67sdeployment.apps/cert-manager-cainjector 1/1 1 1 67sdeployment.apps/cert-manager-webhook 1/1 1 1 67sNAME DESIRED CURRENT READY AGEreplicaset.apps/cert-manager-5597cff495 1 1 1 67sreplicaset.apps/cert-manager-cainjector-bd5f9c764 1 1 1 67sreplicaset.apps/cert-manager-webhook-5f57f59fbc 1 1 1 67s# 查看pod详情[root@host01 ~]# kubectl describe -n cert-manager pod cert-manager-5597cff495-phdjjName: cert-manager-5597cff495-phdjjNamespace: cert-manager......docker://bd819732bd9bb835b70d3954a425a407e38f147e66ed308b697bc80f8da88914Image: quay.io/jetstack/cert-manager-controller:v1.1.0......
可以看到安装成功了, cert-manager名字空间下的资源跟v0.16.1版本是一样的, 而cert-manager的描述中发现已经升级到了最新的v1.1.0版本。
采用官方提供的例子验证创建issuer、certificate的功能,如下:
[root@host01 ~]#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# 创建isuuer及cert[root@host01 ~]# kubectl apply -f test-resources.yamlnamespace/cert-manager-test createdissuer.cert-manager.io/test-selfsigned createdcertificate.cert-manager.io/selfsigned-cert created[root@host01 ~]## 查看证书是否颁发成功[root@host01 ~]# kubectl describe certificate -n cert-manager-testName: selfsigned-certNamespace: cert-manager-test... ...Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Issuing 48s cert-manager Issuing certificate as Secret does not existNormal Generated 47s cert-manager Stored new private key in temporary Secret resource "selfsigned-cert-6vzw9"Normal Requested 47s cert-manager Created new CertificateRequest resource "selfsigned-cert-kr86d"Normal Generated 46s (x2 over 47s) cert-manager Stored new private key in temporary Secret resource "selfsigned-cert-vz2mm"Normal Requested 46s cert-manager Created new CertificateRequest resource "selfsigned-cert-pz6mj"Normal Issuing 36s cert-manager The certificate has been successfully issued
可以看到用定义的issuer发布certifcation成功了。
下面简单介绍一下kubectl cert-manger的安装过程,直接从官方下载后放置到可执行的路径即可:
[root@host01 cert-manager]# curl -L -o kubectl-cert-manager.tar.gz https://github.com/jetstack/cert-manager/releases/download/v1.1.0/kubectl-cert_manager-linux-amd64.tar.gz[root@host01 cert-manager]# tar xzf kubectl-cert-manager.tar.gz[root@host01 cert-manager]# mv kubectl-cert_manager usr/local/bin[root@host01 cert-manager]# kubectl cert-manager helpkubectl cert-manager is a CLI tool manage and configure cert-manager resources for KubernetesUsage:kubectl cert-manager [command]Available Commands:convert Convert cert-manager config files between different API versionscreate Create cert-manager resourceshelp Help about any commandrenew Mark a Certificate for manual renewalstatus Get details on current status of cert-manager resourcesversion Print the kubectl cert-manager version
通过help命令可以看到提供了不少功能,包括跨API版本的配置文件转换、创建相关资源、重新生成证书、查看资源状态等功能。 下面是一个将配置文件从v1alpha2置换到v1的示例:
kubectl cert-manager convert -f cluster-issuer-staging.yaml -o yaml > cluster-issuer-staging-v1.1.0.yaml[root@host01 cert-manager]# cat cluster-issuer-staging.yamlapiVersion: cert-manager.io/v1alpha2kind: ClusterIssuermetadata:name: letsencrypt-stagingspec:acme:email: xxxserver: https://acme-staging-v02.api.letsencrypt.org/directoryprivateKeySecretRef:name: letsencrypt-stagingsolvers:- http01:ingress:class: nginx[root@host01 cert-manager]# cat acme-v1.1.0.yamlapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: letsencrypt-stagingspec:acme:# You must replace this email address with your own.# Let's Encrypt will use this to contact you about expiring# certificates, and issues related to your account.email: xxxserver: https://acme-staging-v02.api.letsencrypt.org/directoryprivateKeySecretRef:# Secret resource that will be used to store the account's private key.name: letsencrypt-staging# Add a single challenge solver, HTTP01 using nginxsolvers:- http01:ingress:class: nginx[root@host01 cert-manager]#
后面文章将介绍结合letsencrypt自动生成证书的过程。




