[筆記]Traefik TLS in k8s with helm

 

最近剛好在做一些細部的更新,沒想到直接踩爆這個坑,卡了一小段時間,結果這個解法在官方的github裡的values.yml可以找到 但是沒先下載的情況下哪可能看到

前言

自從弄好一個簡單的內部使用的服務後,就會想把很多東西都放進去使用,這一定是k8s的陰謀什麼都想塞

事前準備

本來也是要弄個簡單的gitlab給外包商push使用,結果直接跑helm差點炸掉整個k8s,雖然我的規格開的不低,但是一安裝下去一堆pending什麼鬼官方helm,不過重點是我原本以為我新建一個namespace,就要新建一個對應的traefik,沒想到是我誤會了,所以後來去找了簡單的docker版本後就自己改一改放進k8s然後就出事了

起因

因為我原本以為一個namespace要建一個traefik,所以搞的兩個traefik都差點掛掉,接著我全砍掉後就出事了,依照官方設定的配置裡,少了一行配置導致於如果今天同一份設定檔在重覆安裝的時候會起衝突

原本設定檔

persistence:
  enabled: true
  path: /certs
  size: 128Mi

加上accessMode

persistence:
  enabled: true
  accessMode: ReadWriteOnce
  path: /certs
  size: 128Mi

事情沒這麼容易解決

加上剛剛那行之後,只是代表你有權限可以讀取這份檔案了,根據tls的相關設定來說,他需要更嚴格的600檔案權限,不然你在裝完helm之後就會發現不能用,然後看log會噴Unable to get ACME account: permissions 666 for /data/acme.json are too open,我只擷取其中一段,不然這log有夠長,資料位置自己替換就是了,總之就是跟你說你檔案的權限出問題了不然不要用

直接加上deployment.initContainer設定,

deployment:
  initContainers:
    - name: volume-permissions
      image: busybox:1.31.1
      command: ["sh", "-c", "chmod -Rv 600 /certs/*"] # **注意位置換成自己的**
      volumeMounts:
        - name: data
          mountPath: /certs/ # **注意位置換成自己的**

補上podSecurityContext

podSecurityContext:
  fsGroup: null

後記

查了一些官方的回報和相關討論,一開始是先看到說把fsGroup改成null就不會有660,但是改了還是沒用,結果官方直接請大家在initContainers裡用指令把資料夾權限直接改成600,我個人是覺得這樣的方式怪怪的,不過既然是官方說的就那樣唄,事情解決了就好。

參考資料

Unable to get ACME account: permissions 666 for /data/acme.json are too open #6972

values.yaml第22行

permissions 660 for /data/acme.json are too open, please use 600 #164

以下letsencrypt官方討論,可以看一下怎麼查自己domain申請的數量

letsencrypt官方討論

Let’s Debug Toolkit

HTTPS encryption on the web