Day22,Cert-Manager

正文

既上次 Day 16 使用自签凭证的过程,其实原本是打算使用cert-manager来签署凭证的,但因为http01 solver发生一些问题,无法正确create出.well-knownpath在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,需要开启的范围为:

  • Permissions:
    • Zone - DNS - Edit
    • Zone - Zone - Read
  • Zone Resources:
    • Include - All Zones


会产出一组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 归纳重复行为

Day7 - 读 Concurrency is not Parallelism - Rob Pike (二)

续上篇,Day6 - 读 Concurrency is not Parallelism - Rob ...

Day23:Hot Flow - StateFlow

State Flow 是从 Shared Flow 继承而来的,跟 Shared Flow 不同的地...

Day 27 - 建立自己的K线资料库 (中)

本篇重点 透过Pandas读取资料及做OHLC转换 DataFrame.resample中的Left...

Chapter3 今天来学习画一棵树(I)学学人家DOM 自己用递回做一个树状图结构

你是说...树吗? 嘿~丢!铁人赛至今已经过半,实在是油尽灯枯,想不到主题了,刚好看到这两个很赞的树...

TypeScript 能手养成之旅 Day 8 物件型别-扩充型别-元组(Tuple)

前言 今天要来介绍,Typescript 特有的类型 Tuple 、 Enum,到底会是什麽,有趣的...