Home From Docker to K8s With Koel
Post
Cancel

From Docker to K8s With Koel

前情提要

前陣子心血來潮,想說來自架一下 spotify alternative,翻了一下文章之後選擇試試 Koel

整體 UI 算是好看,但功能上一直有些問題,像是上傳有奇怪的限制,所以後來雖然架成功,但幾經思量後還是把他砍掉換成了 jellyfin。不過雖然被我換掉,整體的架設過程還是值得紀錄一下。

Environment

Koel 需要 database 和存放音樂檔案的空間,這個部份我選擇用另外的 VM 解決,這樣自己在管理上和更新資料(上傳音樂)會比較方便

我開了兩台 VM,一台用來放檔案,hostname 是 nfs,以及另一台當資料庫,這次選擇採用 Postgresql,hostname 是 db

從 Docker 開始

要用這類開源專案,我第一步都是先去 github 看看,但主要的 github 沒有 docker 相關的文件,最後翻了一下,發現他放在另一個 repo 裡面。

在 repo 裡面發現有一份用 Postgresql 的 docker-compose.yaml,所以就先把他抓下來研究。

我在這邊主要看四個部分。

  • service,像這邊就是 koel 本身和 database。
  • volumes,這關乎 K8s 裡面的 PV 和 PVC 要開甚麼。不過這邊我們會用 NFS 處理掉,所以他影響的是在 NFS 上要管理那些目錄。
  • environment,這到時候要直接拉進 K8s 的部署 YAML。
  • ports,這是 deployment 要打出去的 port

其他部分(像是 image 之類的)當然也要搬遷,基本上就是搬過去,相對簡單,所以這邊就不特別討論。

開始搬上 K8s

確定完這些內容後,我們就可以開始搬遷。但最一開始我們要先把和 K8s 無關的部分解決掉,以我的狀況來說,就是資料庫以及 NFS 的問題,所以要先去開好。

接著就可以把 docker-compose.yaml 的內容搬過來了。

在搬的過程中,我們也可以把 DB_USERNAMEDB_PASSWORD 這種較為敏感的資訊另外存一份 configmap。

最後的結果是:

這裡面有一個剛剛沒有提到的 lifecycle,這個指令是在官方文件中提到要在第一次跑的時候執行的指令。如果有遇到 .env 沒有設定好之類的問題,八成就是因為沒跑這個。

在這邊我們用在 postStart 的時候來執行,根據 K8s lifecycle 的文件 ,他會在進入 running status 之前先跑完,這符合我們想要的「在第一次執行前先跑」。

至此,我們就可以 apply 這兩個 resource,然後讓 koel 跑起來。

把 koel 打出去

當 koel deployment 跑起來之後,我們還必須要把他打出去。我們會使用 service (cluster-IP) 和 ingress 做搭配。

這個部分就相對簡單,把 service 接上 koel 的 deployment,然後 ingress 再接上 service,這樣就可以出去了。

要注意的是,我們畢竟不是用 deployment 裡面的 web server,上傳檔案時會經過 ingress,所以必須要加上 nginx.ingress.kubernetes.io/proxy-body-size: 1g,不然會在 ingress 的時候就被擋掉。

另外,我想要開兩個 domain 都接到這個服務,但同樣的 http rule 打兩次很難看,所以我使用了 YAML anchors 來簡化。

References

This post is licensed under CC BY 4.0 by the author.