【環(huán)境】
MacOS
minikube version: v1.25.2
minikube vm-driver: hyperkit
【參考】
https://minikube.sigs.k8s.io/docs/handbook/pushing/
1. Pushing directly to the in-cluster Docker daemon (docker-env)
1.1 Linux或MacOS可以使用命令:
eval $(minikube docker-env)
這個(gè)適用于用vm-driver啟動(dòng)的minikube(比如minikube start --vm-driver=hyperkit壁畸,或是其它虛擬driver杠河,默認(rèn)minikube start使用的是docker的虛擬driver)郭毕,這個(gè)命令不適用vm-driver=none的情況。
我們可以在minikube集群中用daemon的方式重用現(xiàn)有的docker刘急。
意味著我們不需要再將docker image push到遠(yuǎn)程的docker hub后棚菊,再在deployment.yaml中pull了,而是可以在minikube中直接使用docker build后使用這個(gè)鏡像了J逯M城蟆!
1.2 測(cè)試
我們先打包一個(gè)本地鏡像:
準(zhǔn)備一個(gè)Spring Boot項(xiàng)目另假,端口為8090像屋,可以參考我之前的文章:【k8s學(xué)習(xí)】在Kubernetes上部署Hazelcast集群(embedded模式)
build鏡像:
docker build -f DockerFile -t localhost/hazelcast-k8s-single .
通過(guò)docker images
查看鏡像:
以往接下來(lái)的步驟是docker push
命令將鏡像推送至docker hub,而現(xiàn)在因?yàn)閐ocker以daemon的方式include到minikube集群中了边篮,所以在minikube中可以直接使用打包的docker image己莺。
創(chuàng)建deployment.yaml文件奏甫,重點(diǎn)是需要先把屬性imagePullPolicy:Always
關(guān)掉,改用imagePullPolicy:IfNotPresent
或imagePullPolicy:Never
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hazelcast-k8s
labels:
app: hazelcast
spec:
replicas: 1
selector:
matchLabels:
app: hazelcast
template:
metadata:
labels:
app: hazelcast
spec:
containers:
- name: hazelcast-k8s
image: localhost/hazelcast-k8s-single
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8090
部署deployment.yaml
kubectl apply -f deployment.yaml
查看Pod log凌受,可以看到已經(jīng)運(yùn)行了:
kubectl logs hazelcast-k8s-6dfb49ccb8-dlxkj
1.3 想要取消上述的命令:
參考:https://stackoverflow.com/questions/30550742/how-do-i-undo-the-command-eval-docker-machine-env-blog
官網(wǎng):https://minikube.sigs.k8s.io/docs/commands/docker-env/
官網(wǎng)上有說(shuō)minikube docker-env [flags]
爽锥,這個(gè)命令析珊,可以加上參數(shù)-u, --unset:Unset variables instead of setting them
忆矛,即為取消上述的docker daemon操作硝训,試一下:
docker-machine env -u
2. Push images using ‘cache’ command
2.1 首先調(diào)用minikube cache list
查看有沒(méi)有cache粉寞,確保下面的測(cè)試準(zhǔn)確性拘鞋。
2.2 minikube image load介紹
我們可以把docker image直接push到minikube中珊擂,這個(gè)image會(huì)自動(dòng)被minikube緩存起來(lái)杈湾。
首先還是先打包一個(gè)本地docker鏡像:
build鏡像:
docker build -f DockerFile -t cached/hazelcast-k8s-single .
添加到minikube cache中:
minikube cache add cached/hazelcast-k8s-single
查看cache list:
minikube cache list
另解虱,如果cache里已經(jīng)有了image,想要更新漆撞,可以用:
minikube cache reload
2.3 測(cè)試
修改#1.2中的deployment image殴泰,從localhost/hazelcast-k8s-single
改成cached/hazelcast-k8s-single
,然后部署之浮驳。
這里還是需要設(shè)置imagePullPolicy為IfNotPresent或Never悍汛,如果不設(shè)置,pod在pull image的時(shí)候會(huì)報(bào)錯(cuò)至会,因?yàn)樗€是會(huì)試圖從docker hub中pull image:Failed to pull image "cached/hazelcast-k8s-single": rpc error: code = Unknown desc = Error response from daemon: pull access denied for cached/hazelcast-k8s-single, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
通過(guò)kubectl describe
可以看到pull image直接在machine中存在了,所以不會(huì)從docker hub中拉取了:
kubectl describe pod hazelcast-k8s-699ffb895c-jfk42
2.4 刪除minikube cache 列表
minikube cache delete cached/hazelcast-k8s-single
文章開(kāi)頭的文章中還介紹了別的一些方式奉件,可以點(diǎn)進(jìn)去詳細(xì)了解下其它方式宵蛀,比如:
- Pushing directly to in-cluster CRI-O. (podman-env)
- Pushing to an in-cluster using Registry addon
- Building images inside of minikube using SSH
- 等等