為了將服務跑在 K8s 中,容器化是必須的。在程式即將部署之際,會需要測試一些 K8s 中的環境變數是否可以被程式正常讀取,或是為了符合 K8s 環境,將程式打包成容器映像試著部署上叢集試試看有沒有問題。這個過程的工作流大致上如下:
1 | 打包 (docker build . -t my-app:0.1) |
我們在 Local 開發時,可能會使用 minikube 來當作測試用的部署環境,但是 minikube 實際上是起一個新的 docker-daemon,他並不認識 macOS 或是 Linux 上的 docker-daemon。也就是說,你在 Local 將 image build 完畢,在 minikube 中並無法存取 Local 的 Docker Registry。這對於正在快速開發測試的人來說極為不便,我們很可能改一行 code 就需要馬上看是否在 K8s 環境能正常運作。
要解決這個問題大致上有幾種方法:
- 使用外部 Docker Hub 來當作 Docker Registry
缺點:暴露在外網、外網流量慢 - 在 Local 跑一個 Docker Registry,讓 Local 與 minikube 共用
缺點:Local IP 如果換掉,yaml 設定檔的 image 位置又要重寫 - 在 minikube 環境中跑一個 Docker Registry,port-forward 到 Local 上
缺點:第一次設定較繁瑣,但大致上已經算好用
這邊要提的方法個人覺得較方便,但同時也有一些不方便的地方
該方法原理是直接在 build image 時直接存進 minikube 的 Registry 中
方法如下:
eval $(minikube docker-env)
docker build -t my-app .
此時可以用 minikube ssh
進去看 docker images
會發現 Image 已經進到 Registry 中
最後在 yaml 檔有用到該 image 的地方加上
1 | imagePullPolicy: Never |
確保在 pull image 時只會拉 Local 的 Image
該方法是透過重新指定環境變數來改變 docker 指令操作 docker-deamon 的位置
所以開一個新的 session 就要重新設定一次,算是一個小缺點