在Kubernetes
集群里,拉取容器镜像是一个非常关键的步骤。这些镜像包含了应用程序及其所有需要的依赖项,Kubernetes
通过拉取这些镜像来启动Pod
中的容器。为了提升集群的稳定性、速度和安全性,Kubernetes
提供了几种不同的镜像拉取策略。这篇文章会详细解释这些策略以及如何配置它们,帮助你在不同情况下做出最佳选择。
什么是容器拉取策略?
容器拉取策略Image Pull Policy
是 Kubernetes
中的一种配置选项,决定了容器镜像在启动时是否需要从镜像仓库拉取,以及如何管理和更新镜像版本。拉取策略控制 Kubernetes
在调度 Pod
时是否重新拉取镜像。
Kubernetes中的拉取策略
我们可以通过以下命令查看 kubernetes支持那几种拉取策略。
kubectl explain pod.spec.containers.imagePullPolicy
从上面的结果可以看出,Kubernetes 支持三种策略,每种策略适用于不同的使用场景。
Alawys
如果你把容器的imagePullPolicy
设成Always
,那么每次创建Pod
或者重启容器的时候kubelet
都会去镜像仓库拉取最新的镜像。它会对比本地和远程仓库的镜像摘要,确保你用的是最新的版本。
使用场景
-
开发环境:在开发过程中,我们经常需要快速迭代和更新镜像,使用
Always
可以确保每次启动容器时都能拉取到最新的镜像。 -
测试环境:在自动化测试中,拉取最新镜像可以确保每次测试时都使用的是最新的镜像版本。
案例演示:
现在部署一个简单的Pod
,yaml文件内容如下:
apiVersion: v1
kind: Pod
metadata:name: simple-pod
spec:containers:- name: nginx-containerimage: nginx:latestimagePullPolicy: Alwaysports:- containerPort: 80
在执行这个yaml文件之前,我们先查看一下本地是否存在这个镜像,结果如下:
controlplane $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
这时执行会从远端仓库拉取镜像到本地进行启动Pod。
IfNotPresent:
当拉取策略设置为 IfNotPresent
时,Kubernetes
只有在本地节点上没有该镜像时,才会去远程镜像仓库拉取镜像。如果节点上已经存在该镜像,则不会再次拉取,直接使用本地镜像。
使用场景
-
生产环境:为了提高启动速度并减少带宽消耗,
IfNotPresent
是一种较为常见的选择。如果你已经确保容器镜像是经过验证和测试的,并且不会频繁更改,那么这个策略就很合适。 -
节点具有高效的镜像缓存时,
IfNotPresent
可以避免重复拉取镜像,减少网络压力。
案例演示
修改上述的yaml文件,内容如下:
apiVersion: v1
kind: Pod
metadata:name: simple-pod
spec:containers:- name: nginx-containerimage: nginximagePullPolicy: IfNotPresent ports:- containerPort: 80
删除之前创建的Pod,然后在重新执行创建命令,结果如下:
通过上述的日志可以看到该镜像已经存在这台机器上,所以,没有向远端仓库进行拉取。
Never
当拉取策略设置为 Never
时,Kubernetes
无论如何都不会从镜像仓库拉取镜像。如果节点本地没有该镜像,容器启动将失败。此策略通常用于确保容器使用的是本地已有的镜像。
使用场景
-
本地镜像部署:如果你已经手动将镜像拉取到本地,并希望避免
Kubernetes
再次去远程拉取,Never
策略可以避免不必要的拉取操作。 -
离线环境:在一些没有外网的离线环境中,所有的镜像都已经提前下载,使用
Never
可以确保容器启动时不进行拉取操作。
案例演示
我们通过docker search
查询远端仓库存在的镜像。如下图:
把上述yaml进行修改,把nginx镜像修改成bitnami/nginx
,内容如下:
apiVersion: v1
kind: Pod
metadata:name: simple-pod
spec:containers:- name: bitnami-nginximage: bitnami/nginximagePullPolicy: Never ports:- containerPort: 80
执行创建命令,结果如下:
通过上述日志可以看到这个pod部署失败,原因是本地不存在这个镜像,由于配置了Never
拉取策略,所以,不会在远端仓库拉取的。
小结
Kubernetes
提供了三种镜像拉取策略:Always
、IfNotPresent
和 Never
。根据应用场景的不同,用户可以选择适合的策略,以平衡镜像拉取的频率、网络带宽和镜像更新的需求。在生产环境中,通常推荐使用 IfNotPresent
策略,而在开发环境中,Always
策略则更为常见。
推荐阅读
-
ncdu:Linux磁盘分析的利器,你值得拥有
-
Linux磁盘爆满?别慌!这几个命令轻松搞定
-
fnOS搭建音乐服务Navidrome
-
命令行的视觉盛宴:如何用Sampler轻松实现数据可视化
-
别再手动编码了!发现这个一键生成K8S YAML的神器!
-
轻松搭建RustDesk,畅享远程办公新体验