證書過期,是個(gè)讓人很頭疼的問題峰伙。需要定期的去renew證書疗疟,就會(huì)比較麻煩,而且很容易遺忘瞳氓。當(dāng)portal太多當(dāng)時(shí)候策彤,這個(gè)問題就會(huì)更加明顯。這個(gè)問題本身并不是什么難題匣摘,寫個(gè)定時(shí)任務(wù)就可以完成店诗。如果我們代碼部署在k8s上的話,也只用寫個(gè)cronjob去刷新掛載的secret就可以了恋沃。今天要介紹的是采用Cert-manager來自動(dòng)管理證書必搞,我認(rèn)為它很優(yōu)雅,對(duì)代碼沒有侵入性囊咏,并且使用起來很簡(jiǎn)單方便。先看看他官網(wǎng)自己怎么說的塔橡。
cert-manager is a native?Kubernetes?certificate management controller. It can help with issuing certificates from a variety of sources, such as?Let’s Encrypt,?HashiCorp Vault,?Venafi, a simple signing key pair, or self signed.
官方文檔介紹的很詳細(xì)梅割。今天就主要介紹一下踩的一點(diǎn)點(diǎn)坑就行了。因?yàn)槲覀兊捻?xiàng)目是部署在gcp k8s cluster上的葛家,所以下面的介紹也都以k8s部署為例户辞。
安裝
安裝 CustomResourceDefinition
kubectl apply --validate=false-f https://github.com/jetstack/cert-manager/releases/download/v0.14.0/cert-manager.yaml
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm3.x 執(zhí)行 helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v0.14.0
helm2.x 執(zhí)行?helm install --name cert-manager --namespace cert-manager --version v0.14.0 jetstack/cert-manager?
到這里基本的安裝就結(jié)束了●耍可以通過這個(gè)命令去查看一下底燎。kubectl get pods --namespace cert-manager
使用
Ingress上的使用
Ingress使用比較簡(jiǎn)單,不過多介紹弹砚。為了讓多個(gè)Ingress可以共用同一個(gè)Issuer双仍,需要?jiǎng)?chuàng)建一個(gè)ClusterIssuer。溫馨提示桌吃,測(cè)試環(huán)境請(qǐng)用letencrypt的staging環(huán)境朱沃,生產(chǎn)環(huán)境有配額限制。每IP每3個(gè)小時(shí)不超過10次,每個(gè)域名(包含子域名)每7天不超過5個(gè)逗物。
接下來就按照教程里面說的配置就行了搬卒,secretName可以隨便取名,cert-manager會(huì)自動(dòng)幫你創(chuàng)建翎卓。
loadbalancer上的使用
我們項(xiàng)目有一個(gè)項(xiàng)目比較特殊契邀,不需要用ingress,而是直接采用的loadbalancer的形式暴露服務(wù)失暴。那么證書就需要手動(dòng)去刷新蹂安。
首先創(chuàng)建一個(gè)issuer
然后創(chuàng)建一個(gè)certificate
certificate里面的secretName就是生成的證書所在了,可以把這個(gè)secret掛載到需要的地方锐帜,就可以使用了田盈。
這里踩的一個(gè)坑就是,一開始我在供ingress使用的clusterissuer下面添加了dns解析器這種形式缴阎,但是失敗了允瞧。由于我是采用clouddns的形式,需要letencrypt能夠訪問到我的dns下面蛮拔,所以需要提供service account述暂,所以就掛載了一個(gè)secret。由于service account secret需要能夠被clusterissueer訪問到建炫,所以需要放在clusterissuer對(duì)應(yīng)的namespace A下面畦韭。certificate創(chuàng)建的secret需要被namespace B使用,所以需要?jiǎng)?chuàng)建在namespace B中肛跌。走到這里就失敗了艺配,因?yàn)閏ertificate在調(diào)用clusterissuer的申請(qǐng)證書的時(shí)候,提示訪問不到service account衍慎。最后改用了Issuer转唉。
今天寫到這里突然想到,service account secret放在namespace B中稳捆,clusterissuer不知道能不能讀到赠法,如果能就完美了。晚點(diǎn)試試再來給答案乔夯。
自動(dòng)證書刷新就做完了砖织,針對(duì)具體的項(xiàng)目,怎么讓secret每次更新觸發(fā)程序重新讀取secret的值就需要寫一個(gè)cronjob了末荐,比如nginx reload之類的侧纯。我這里是寫了個(gè)cronjob,用python來定期讀取證書