查看原文
其他

如何在Rancher 2.x中升级cert-manager?

Nassos Michas RancherLabs 2020-10-16

R

明天晚上20:30,最后一期在线培训课程《Rancher 2.3集群模板及新特性》将准时开播!集群模板功能、Google认证、与k8s解耦、k8s1.16的支持……一节课通通解锁!点击【阅读原文】或复制以下地址到浏览器报名吧:

http://www.itdks.com/Home/Live/detail?id=28601


作者:

Nassos Michas丨European Dynamics SA, CTO


如果你正在使用由Rancher提供的Helm Chart在Rancher管理的Kubernetes集群中安装cert-manager,那么你最近也许收到了Let’s Encrypt发给你的提醒:



在集群中检查cert-manager的日志,你可以看到Let’s Encrypt拒绝更新证书的请求,因为“你的ACME客户端版本过旧,请升级到更新的版本”。那么,我们现在就开始吧!


使用Rancher提供的Helm Chart进行更新


我想你脑海里的第一想法应该和我的类似:使用相关的最新版本的Helm Chart升级cert-manager。大家可以不用考虑这个选项,因为Rancher提供的cert-manager Helm Chart目前最新的是0.5.2版本,所以别想着一键式升级啦!


使用官方Helm Chart升级


参考链接:https://forums.rancher.com/t/update-on-cert-manager-application-in-the-catalog/15598


计划十分简单:只需要将Rancher提供的cert-manager的Helm Chart移除,并使用Helm中由Jetstack维护的chart替换即可。


在开始之前,我们需要保持谨慎。从v0.5.2到目前stable的版本v0.11.0,许多内容都有所更改。新引入的CRDs和相应的配置格式将深刻地影响你的部署。因此,更新升级后,你需要将资源定义更新为新格式。幸运的是,cert-manager为我们提供了升级脚本,我们会在下文中用到它。


移除Rancher提供的Helm Chart


1、 登录你的Rancher UI

2、 切换到最初安装cert-manager的项目(可能是System)

3、 点击“APPs”

4、 点击垂直省略号按钮,然后选择“删除”。



现在,你已经移除了最开始安装的cert-manager。请注意,这一操作不会影响此前已经创建的证书,并且你的ingress配置应该像之前一样工作。


安装Tiller


Tiller是Helm的服务端组件,所以为了能在我们的CLI中使用Helm,我们需要在Kubernetes集群中安装Tiller。你可以通过运行以下命令来验证Tiller是否已经安装:


helm version


如果你的输出结果与以上结果类似,那么Tiller并没有安装好。如果你已经完成安装,那么请跳过这一部分。


好,现在我们来安装Tiller。首先,我们需要创建一个服务账号,授予我们远程安装Tiller的权限,然后再授予安装Chart的权限。


kubectl -n kube-system create serviceaccount tillerkubectl create clusterrolebinding tiller \ --clusterrole=cluster-admin \ --serviceaccount=kube-system:tiller


要启动安装Tiller:


helm init --service-account tiller


几秒钟之后,你能够通过重新输入命令helm version来验证Tiller是否已经安装,或者通过下列命令来验证你的Kubernetes Tiller部署:


kubectl -n kube-system rollout status deploy/tiller-deploy:


安装cert-manager


在安装cert-manager之前,我们需要做以下准备:


1、 禁用资源验证,以允许cert-manager的webhook组件正常工作

2、 安装新的(v0.11.1)的CRDs

3、 添加Jetstack repos


kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=truekubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.11/deploy/manifests/00-crds.yamlhelm repo add jetstack https://charts.jetstack.io && helm update


此时,我们就准备好安装并且验证cert-manager


helm install \ --name cert-manager \ --namespace cert-manager \ --version v0.11.0 \ jetstack/cert-managerkubectl get pods --namespace cert-manager

cert-manager v0.11.0安装成功


升级旧的资源参考和配置


参考链接:

https://cert-manager.io/docs/installation/upgrading/upgrading-0.10-0.11/


如果你检查你的ingress证书,你会发现什么都没有改变。这在意料之中,因为之前的版本v0.5.2中使用的ingress定义的配置不适用于v0.11.0。cert-manager为我们提供了简便的代码来查找哪个集群资源依旧引用旧的注释:


kubectl get ingress \ --all-namespaces \ -o json | \ jq '.items[] | select(.metadata.annotations| to_entries | map(.key)[] | test("certmanager")) | "Ingress resource \(.metadata.namespace)/\(.metadata.name) contains old annotations: (\( .metadata.annotations | to_entries | map(.key)[] | select( . | test("certmanager") ) ))"'


根据你的Kubernetes集群部署数量,以上列表可能会更短也可能会更长。而尝试去手动更改所有部署的旧注释可能会花费相当长的时间。以下CLI工具可以自动执行这一过程,但它不会对你的集群造成任何更改:


# 首先,根据你的平台下载二进制文件wget -O api-migration https://github.com/jetstack/cert-manager/releases/download/v0.11.0/api-migration-linux# 或者根据Darwinwget -O api-migration https://github.com/jetstack/cert-manager/releases/download/v0.11.0/api-migration-darwin
# 将二进制文件标记为可执行文件,然后对集群运行二进制文件chmod +x api-migration && ./api-migration --kubeconfig /path/to/my/kubeconfig.yaml
# 查看CLI的输出结果并且检查文件中的差异diff ingress.yaml ingress-migrated.yaml
# 最后,review了新的ingress资源之后,应用manifestkubectl apply -f ingress-migrated.yaml --kubeconfig /path/to/my/kubeconfig.yaml


请确保更新所有Ingress资源,以保证您的证书保持最新状态。


重新引入集群Issuer


我们现在基本上完成了,最后一步是我们需要重新引入集群Issuer(如果你只希望将kind注释更改为Issuer,也可以选择每个命名空间的Issuer)。


使用Let’s Encrypt stage和Production以及HTTP01创建两个集群Issuer,以下是代码摘要:


---apiVersion: cert-manager.io/v1alpha2kind: ClusterIssuermetadata: name: letsencrypt-stagingspec: acme: email: example@example.com server: https://acme-staging-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-staging-account-key solvers: - http01: ingress: class: nginx---apiVersion: cert-manager.io/v1alpha2kind: ClusterIssuermetadata: name: letsencrypt-prodspec: acme: email: example@example.com server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-prod-account-key solvers: - http01: ingress: class: nginx


在一两分钟之后,你的所有ingress都将更新为指向新颁发的证书。但是请记住,如果你之前的证书不在续订窗口内,那么你不会发现任何差异。


PS:针对Rancher本身的应用,cert-manager支持的最高版本是v0.9,如果是自有的应用服务,可以支持最新版本。

PPS:由于众所周知的原因,在国内不推荐使用cert-manager,建议使用10年有效期的自签名证书。


推荐阅读

本周三在线培训 | Rancher 2.3集群模板及新特性

再也不用担心学不会K8S!17个K8S初学者必须掌握的知识点

Rancher 2.3实现K8S一键式升级!再也不用同步升级Rancher啦!

About Rancher Labs


Rancher Labs由CloudStack之父梁胜创建。旗舰产品Rancher是一个开源的企业级Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理。Rancher一向因操作体验的直观、极简备受用户青睐,被Forrester评为2018年全球容器管理平台领导厂商,被Gartner评为2017年全球最酷的云基础设施供应商。


目前Rancher在全球拥有超过一亿的下载量,并拥有包括中国人寿、华为、中国平安、兴业银行、民生银行、平安证券、海航科技、厦门航空、上汽集团、海尔、米其林、丰田、本田、中船重工、中联重科、迪斯尼、IBM、Cisco、Nvidia、辉瑞制药、西门子、CCTV、中国联通等全球著名企业在内的共27000家企业客户。

点击【阅读原文】,解锁Rancher 2.3所有黑科技!

↓↓↓

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存