導入
ローカル環境で、minikubeを使用している際、Docker Hubのようなコンテナイメージレジストリを使用せずに構築したいシチュエーションがありました。
調べながらやりましたが、苦戦したので備忘録的にメモを残しておこうと思います。
やりたいこと
このようなマニュフェストで、myapp:latestのようなローカル環境で適当に作成したイメージを使用してdeploymentしたい。
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-web-app
spec:
replicas: 1
selector:
matchLabels:
app: go-web-app
template:
metadata:
labels:
app: go-web-app
spec:
containers:
- name: go-web-app
image: myapp:latest
ports:
- containerPort: 8080
だがしかし、現実はそううまくいかない...
user@shrimpTail:~/git_wsl/go_clean_architecture/k8s$ kubectl get pods --watch
NAME READY STATUS RESTARTS AGE
go-web-app-6c7fbb6849-mkc9k 0/1 ErrImagePull 0 67s
go-web-app-6c7fbb6849-mkc9k 0/1 ImagePullBackOff 0 71s
go-web-app-6c7fbb6849-mkc9k 0/1 ErrImagePull 0 116s
なぜなのか
minikube もといkubectlでdeploymentオプションを使用した際、おそらくリモート上のコンテナイメージレジストリからタグが一致するイメージを探すのがデフォルトになっている模様。
なので、マニュフェストにこの項目の追加が必要。
imagePullPolicy: IfNotPresent
修正後全体像
サンプルコード(open属性なし)
(上に空行が必要)
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-web-app
spec:
replicas: 1
selector:
matchLabels:
app: go-web-app
template:
metadata:
labels:
app: go-web-app
spec:
containers:
- name: go-web-app
image: myapp:latest
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent # 追加
実行コマンド
eval $(minikube docker-env)
docker build -f Dockerfile -t myapp:latest .
kubectl rollout restart deployment/go-web-app
さいごに
後発者の参考になれば幸いです。