TL;DR
以下のコマンドでローカルの Docker image を kind で作成した k8s にアップロードすることが可能です。
$ kind load docker-image IMAGE:TAG
アップロードした Docker image を使う際には imagePullPolicy: IfNotPresent
もしくは imagePullPolicy: Never
の設定を行ってください。また、既にアップロード済みの場合には Docker image が更新されることなく処理が終了する仕様なのでご注意ください。
はじめに
kind(Kubernetes IN Docker)でローカルの Docker image を使う方法を紹介します。
https://github.com/kubernetes-sigs/kind
動作確認
kind で k8s クラスタを作成します。
$ kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.15.0) 🖼
✓ Preparing nodes 📦
✓ Creating kubeadm config 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info
ローカルで Docker image をビルドします。
$ cat Dockerfile
FROM busybox
ENTRYPOINT sh -c "echo 'Hi, kind!' && sleep 10000"
$ docker build -t my-image:tag .
ローカルの Docker image を kind にアップロードします。
$ kind load docker-image my-image:tag
kind で作成した k8s にアップロードした Docker image を Pod としてデプロイします。
restartPolicy: Always
になっていると Docker image をリモートから取得するようになってしまうので、imagePullPolicy: IfNotPresent
もしくは imagePullPolicy: Never
の設定を行うことを忘れないでください。
$ cat manifest.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-image
spec:
containers:
- name: my-image
image: my-image:tag
imagePullPolicy: Never
$ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
$ kubectl apply -f manifest.yaml
アップロードした Docker image が使えているか確認します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-image 1/1 Running 0 10s
$ kubectl logs my-image
Hi, kind!
アップロードした Docker image が使えることが確認できました。
備考
既にアップロード済みの場合には Docker image が更新されることなく処理が終了する仕様なのでご注意ください。この仕様に関する詳細を知りたい方は以下の Issue を参照ください。
https://github.com/kubernetes-sigs/kind/issues/380
今回は Docker image のアップロードを紹介しましたが、以下のコマンドで docker save
で Docker image のアーカイブをアップロードすることも可能です。
$ kind load image-archive IMAGE_ARCHIVE.tar