既上次 Day 16 使用自签凭证的过程,其实原本是打算使用cert-manager来签署凭证的,但因为http01 solver发生一些问题,无法正确create出.well-known
path在ingress上,那这次就改用dns01来挑战去签出一个可信赖於internet的网站凭证,透过Let's encrypt。
首先为这次的实验,我先从godaddy租了一个(首年)99元的凭证,因为预计是要透过cloudflare托管的,需要去注意一下domain的level是要能够被cloudflare支援的。而domain托管的意思就是修改原domain供应商的dns server,将其修改设定为透过cloudflare的dns。
如果明年没打算要续用,记得都要去取消自动续约喔。
接着我们透过helm安装 Cert-Manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
kubectl create ns cert-manager
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v1.5.3 \
--set prometheus.enabled=false \
--set webhook.timeoutSeconds=4 \
--set installCRDs=true
接着我们要去cloudflare上设定使用的api token,需要开启的范围为:
会产出一组token,我们需要将它设定在kubernetes secret中。
kubectl apply -f cloudflare-secret.yml
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
stringData:
api-token: xxxxx-token
接着我们这次是直接使用cluster-issuer(与issuer不同,能跨越namespace),先创建测试用的kubectl apply -f cluster-issuer-stage.yml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
namespace: cert-manager
spec:
acme:
email: [email protected]
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-stage
solvers:
- dns01:
cloudflare:
email: [email protected]
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
接着调整ingress,将host置换为homelab.gurubear.info、放入cluster-issuer的annotation
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-staging"
name: ithomelab-ing
namespace: ithomelab
spec:
rules:
- host: homelab.gurubear.info
http:
paths:
- backend:
service:
name: ithomelab-react-deployment
port:
number: 80
path: /
pathType: Prefix
- backend:
service:
name: ithomelab-api-deployment
port:
number: 80
path: /API
pathType: Prefix
tls:
- hosts:
- homelab.gurubear.info
secretName: gurubear-new-tls
检查event,观察到tls rotate 成功
打开浏览器,检视凭证确实是let'encrypt的凭证(不安全是正常现象)
这样子的流程没问题後,我们再去新增cluster-issuer-prod,最主要就是将acme server调整为正式的server。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
namespace: cert-manager
spec:
acme:
email: [email protected]
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
cloudflare:
email: [email protected]
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
调整ingress annotation的cluster-issuer
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
name: ithomelab-ing
namespace: ithomelab
.
.
.
一样检查event,观察到tls rotate 成功
打开浏览器检查凭证,可以看到被识别为安全的凭证了
因为正式的凭证签署是有限制的,所以我们确立流程前会先使用测试的server进行验证,没问题就转为正式。透过这样子方式就可以免费签署到有效的凭证啦,而後续也能够透过自动更新来当个实实在在的免费仔。
检查custom resources内容可以看到
kubectl get certificates.cert-manager.io gurubear-new-tls -n ithomelab -o yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
.......
.......
status:
conditions:
- lastTransitionTime: "2021-09-18T08:03:07Z"
message: Certificate is up to date and has not expired
observedGeneration: 2
reason: Ready
status: "True"
type: Ready
notAfter: "2021-12-17T07:03:04Z"
notBefore: "2021-09-18T07:03:05Z"
renewalTime: "2021-11-17T07:03:04Z"
revision: 2
凭证的有效期限为90天,更新时间为到期前30天,而这些设定也能够在annotation上去调整,有需要可以自己去官网认真看看罗~
到今天为止,我的铁人赛第二阶段算是告一段落啦。从开发点小程序到建置环境、布署、发行、domain&凭证、log&monitoring相信都是一般公司不可少的,当然可能还有不足的地方就多多包容了~接下的部分就会是比较乱的内容了,我想到什麽做什麽XD
<<: 当你发现自己和大众站在一边的时候,反而该停下来反思一下。
>>: 自动化测试,让你上班拥有一杯咖啡的时间 | Day 8 - 用 beforeEach 归纳重复行为
续上篇,Day6 - 读 Concurrency is not Parallelism - Rob ...
State Flow 是从 Shared Flow 继承而来的,跟 Shared Flow 不同的地...
本篇重点 透过Pandas读取资料及做OHLC转换 DataFrame.resample中的Left...
你是说...树吗? 嘿~丢!铁人赛至今已经过半,实在是油尽灯枯,想不到主题了,刚好看到这两个很赞的树...
前言 今天要来介绍,Typescript 特有的类型 Tuple 、 Enum,到底会是什麽,有趣的...