/

與 minikube 共享 local docker image

為了將服務跑在 K8s 中,容器化是必須的。在程式即將部署之際,會需要測試一些 K8s 中的環境變數是否可以被程式正常讀取,或是為了符合 K8s 環境,將程式打包成容器映像試著部署上叢集試試看有沒有問題。這個過程的工作流大致上如下:

1
2
3
打包 (docker build . -t my-app:0.1)
部署 (kubectl apply -f deploy.yaml)
確認是否有問題,有的話修改程式,然後繞回第一步

我們在 Local 開發時,可能會使用 minikube 來當作測試用的部署環境,但是 minikube 實際上是起一個新的 docker-daemon,他並不認識 macOS 或是 Linux 上的 docker-daemon。也就是說,你在 Local 將 image build 完畢,在 minikube 中並無法存取 Local 的 Docker Registry。這對於正在快速開發測試的人來說極為不便,我們很可能改一行 code 就需要馬上看是否在 K8s 環境能正常運作。

要解決這個問題大致上有幾種方法:

  1. 使用外部 Docker Hub 來當作 Docker Registry
    缺點:暴露在外網、外網流量慢
  2. 在 Local 跑一個 Docker Registry,讓 Local 與 minikube 共用
    缺點:Local IP 如果換掉,yaml 設定檔的 image 位置又要重寫
  3. 在 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 就要重新設定一次,算是一個小缺點