使用cert-manager实现Ingress https
什么是https
超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息,HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息,因此,HTTP協(xié)議不適合傳輸一些敏感信息,比如:信用卡號(hào)、密碼等支付信息。
為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS,為了數(shù)據(jù)傳輸?shù)陌踩?#xff0c;HTTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書(shū)來(lái)驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密。http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
什么是cert-manager
cert-manager 是一個(gè)云原生證書(shū)管理開(kāi)源項(xiàng)目,用于在 Kubernetes 集群中提供 HTTPS 證書(shū)并自動(dòng)續(xù)期,支持 Let’s Encrypt, HashiCorp Vault 這些免費(fèi)證書(shū)的簽發(fā)。在Kubernetes集群中,我們可以通過(guò) Kubernetes Ingress 和 Let’s Encrypt 實(shí)現(xiàn)外部服務(wù)的自動(dòng)化 HTTPS。
在Kubernetes集群中使用 HTTPS 協(xié)議,需要一個(gè)證書(shū)管理器、一個(gè)證書(shū)自動(dòng)簽發(fā)服務(wù),主要通過(guò) Ingress 來(lái)發(fā)布 HTTPS 服務(wù),因此需要Ingress Controller并進(jìn)行配置,啟用 HTTPS 及其路由。
環(huán)境依賴(lài)
- 本文使用 Helm 安裝,所以請(qǐng)確保 Helm 已安裝,且版本最好>2.10
- 集群必須已經(jīng)裝有 Ingress Controller
- 外部客戶(hù)端配置hosts,IP 指向 Ingress Controller 對(duì)外暴露的地址(如果IP是公網(wǎng)地址并做了域名解析,則無(wú)需配置)
部署cert-manager
使用helm安裝cert-manager
安裝 CustomResourceDefinition資源
| 1 | kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.7/deploy/manifests/00-crds.yaml |
?
創(chuàng)建cert-manager namespace
| 1 | kubectl create namespace cert-manager |
?
標(biāo)記cert-Manager命名空間以禁用資源驗(yàn)證
| 1 | kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true |
?
添加 Jetstack Helm repository
| 1 | helm repo add jetstack https://charts.jetstack.io |
?
更新本地Helm chart repository
| 1 | helm repo update |
?
使用Helm chart安裝cert-manager
| 1 2 3 4 5 | helm install \ --name cert-manager \ --namespace cert-manager \ --version v0.7.0 \ jetstack/cert-manager |
?
查看cert-manager部署結(jié)果
| 1 2 3 4 5 | # kubectl get pods --namespace cert-manager NAME READY STATUS RESTARTS AGE cert-manager-5658b7db79-824lt 1/1 Running 0 11h cert-manager-cainjector-768fd47f68-ls6zh 1/1 Running 0 11h cert-manager-webhook-5b4bc6b547-8qk2v 1/1 Running 0 11h |
?
創(chuàng)建ClusterIssuer
我們需要先創(chuàng)建一個(gè)簽發(fā)機(jī)構(gòu),cert-manager 給我們提供了 Issuer 和 ClusterIssuer 這兩種用于創(chuàng)建簽發(fā)機(jī)構(gòu)的自定義資源對(duì)象,Issuer 只能用來(lái)簽發(fā)自己所在 namespace 下的證書(shū),ClusterIssuer 可以簽發(fā)任意 namespace 下的證書(shū),這里以 ClusterIssuer 為例創(chuàng)建一個(gè)簽發(fā)機(jī)構(gòu):
| 1 2 3 4 5 6 7 8 9 10 11 12 |
?
說(shuō)明:
- metadata.name 是我們創(chuàng)建的簽發(fā)機(jī)構(gòu)的名稱(chēng),后面我們創(chuàng)建證書(shū)的時(shí)候會(huì)引用它
- spec.acme.email 是你自己的郵箱,證書(shū)快過(guò)期的時(shí)候會(huì)有郵件提醒,不過(guò) cert-manager 會(huì)利用 acme 協(xié)議自動(dòng)給我們重新頒發(fā)證書(shū)來(lái)續(xù)期
- spec.acme.server 是 acme 協(xié)議的服務(wù)端,我們這里用 Let’s Encrypt,這個(gè)地址就寫(xiě)死成這樣就行
- spec.acme.privateKeySecretRef 指示此簽發(fā)機(jī)構(gòu)的私鑰將要存儲(chǔ)到哪個(gè) Secret 對(duì)象中,名稱(chēng)不重要
- spec.acme.http01 這里指示簽發(fā)機(jī)構(gòu)使用 HTTP-01 的方式進(jìn)行 acme 協(xié)議 (還可以用 DNS 方式,acme 協(xié)議的目的是證明這臺(tái)機(jī)器和域名都是屬于你的,然后才準(zhǔn)許給你頒發(fā)證書(shū))
部署
| 1 |
?
查看clusterissuer創(chuàng)建結(jié)果
| 1 2 3 | # kubectl get clusterissuer NAME AGE letsencrypt-prod 11m |
?
創(chuàng)建Certificate
有了簽發(fā)機(jī)構(gòu),接下來(lái)我們就可以生成免費(fèi)證書(shū)了,cert-manager 給我們提供了 Certificate 這個(gè)用于生成證書(shū)的自定義資源對(duì)象,它必須局限在某一個(gè) namespace 下,證書(shū)最終會(huì)在這個(gè) namespace 下以 Secret 的資源對(duì)象存儲(chǔ),創(chuàng)建一個(gè) Certificate 對(duì)象:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # cat cert.yaml apiVersion: certmanager.k8s.io/v1alpha1 kind: Certificate metadata: name: dashboard-imroc-io namespace: istio-system spec: secretName: dashboard-imroc-io issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - istio.kiali.com acme: config: - http01: ingressClass: traefik domains: - istio.kiali.com |
?
說(shuō)明:
- spec.secretName 指示證書(shū)最終存到哪個(gè) Secret 中
- spec.issuerRef.kind 值為 ClusterIssuer 說(shuō)明簽發(fā)機(jī)構(gòu)不在本 namespace 下,而是在全局
- spec.issuerRef.name 我們創(chuàng)建的簽發(fā)機(jī)構(gòu)的名稱(chēng) (ClusterIssuer.metadata.name)
- spec.dnsNames 指示該證書(shū)的可以用于哪些域名
- spec.acme.config.http01.ingressClass 使用 HTTP-01 方式校驗(yàn)該域名和機(jī)器時(shí),cert-manager 會(huì)嘗試創(chuàng)建Ingress 對(duì)象來(lái)實(shí)現(xiàn)該校驗(yàn),如果指定該值,會(huì)給創(chuàng)建的 Ingress 加上 kubernetes.io/ingress.class 這個(gè) annotation,如果我們的 Ingress Controller 是 traefik Ingress Controller,指定這個(gè)字段可以讓創(chuàng)建的 Ingress 被 traefik Ingress Controller 處理。
- spec.acme.config.http01.domains 指示該證書(shū)的可以用于哪些域名
執(zhí)行部署命令
| 1 |
?
查看certificate創(chuàng)建結(jié)果
| 1 2 3 | # kubectl get certificate -n istio-system NAME AGE dashboard-imroc-io 54s |
?
執(zhí)行上述步驟,如有問(wèn)題,可使用如下命令排查原因
| 1 2 |
?
查看生成的secret 結(jié)果
| 1 2 | # kubectl get secret -n istio-system | grep dashboard-imroc-io dashboard-imroc-io kubernetes.io/tls 3 2m32s |
?
測(cè)試Ingress使用https
創(chuàng)建一個(gè)nginx
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | # cat test-nginx.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-nginx spec: replicas: 1 template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 443 |
?
需要注意的是上面我們添加的兩個(gè)annotations非常重要,這個(gè)將告訴 Cert Manager 去生成證書(shū),然后由于我們這里要使用 HTTPS,所以我們需要添加一個(gè) tls 證書(shū),而證書(shū)就是通過(guò)k8sui-tls這個(gè) Secret 對(duì)象來(lái)提供的,要注意的是這個(gè) Secret 對(duì)象并不是我們手動(dòng)創(chuàng)建的,而是 Cert Manager 自動(dòng)創(chuàng)建的證書(shū)對(duì)應(yīng)的對(duì)應(yīng)。然后直接創(chuàng)建這個(gè)資源對(duì)象即可:
| 1 |
?
創(chuàng)建完成后隔一會(huì)兒我們可以看到會(huì)多出現(xiàn)一個(gè)隨機(jī)名稱(chēng)的 Ingress 對(duì)象,這個(gè) Ingress 對(duì)象就是用來(lái)專(zhuān)門(mén)驗(yàn)證證書(shū)的:
| 1 2 3 | # kubectl get ingress -n istio-system NAME HOSTS ADDRESS PORTS AGE cm-acme-http-solver-z562f test.nginx.com 80 62s |
?
我們可以通過(guò) Traefik 的 Dashboard 可以觀察到這一變化,驗(yàn)證成功后,這個(gè) Ingress 對(duì)象也自動(dòng)刪除了:
這個(gè)時(shí)候我們可以去describe下我們的 Ingress 對(duì)象,查看有無(wú)報(bào)錯(cuò)
| 1 |
?
同樣我們可以去查看 Cert manager 的 Pod 日志信息:
| 1 | # kubectl logs -f cert-manager-5658b7db79-824lt --namespace cert-manager |
?
最后,我們來(lái)打開(kāi)瀏覽器使用https訪(fǎng)問(wèn)服務(wù)
到這里我們就完成了使用Let’s Encrypt實(shí)現(xiàn)Kubernetes Ingress自動(dòng)化 HTTPS。
參考資料
項(xiàng)目地址:https://github.com/jetstack/cert-manager
文檔地址:https://cert-manager.readthedocs.io
轉(zhuǎn)載于:https://www.cnblogs.com/cheyunhua/p/10768067.html
總結(jié)
以上是生活随笔為你收集整理的使用cert-manager实现Ingress https的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux安装/升级pip
- 下一篇: luogu P5324 [BJOI201