Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?

ops/2024/12/27 11:14:12/

Kubernetes集群里,拉取容器镜像是一个非常关键的步骤。这些镜像包含了应用程序及其所有需要的依赖项,Kubernetes通过拉取这些镜像来启动Pod中的容器。为了提升集群的稳定性、速度和安全性,Kubernetes提供了几种不同的镜像拉取策略。这篇文章会详细解释这些策略以及如何配置它们,帮助你在不同情况下做出最佳选择。

什么是容器拉取策略?

容器拉取策略Image Pull PolicyKubernetes中的一种配置选项,决定了容器镜像在启动时是否需要从镜像仓库拉取,以及如何管理和更新镜像版本。拉取策略控制 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 提供了三种镜像拉取策略:AlwaysIfNotPresentNever。根据应用场景的不同,用户可以选择适合的策略,以平衡镜像拉取的频率、网络带宽和镜像更新的需求。在生产环境中,通常推荐使用 IfNotPresent 策略,而在开发环境中,Always 策略则更为常见。

推荐阅读


  • ncdu:Linux磁盘分析的利器,你值得拥有

  • Linux磁盘爆满?别慌!这几个命令轻松搞定

  • fnOS搭建音乐服务Navidrome

  • 命令行的视觉盛宴:如何用Sampler轻松实现数据可视化

  • 别再手动编码了!发现这个一键生成K8S YAML的神器!

  • 轻松搭建RustDesk,畅享远程办公新体验



http://www.ppmy.cn/ops/145358.html

相关文章

golangci-lint安装与Goland集成

golangci-lint安装与Goland集成 1.golangci-lint概述2.golangci-lint安装3.Goland 中集成 golangci-lint4.golangci-lint 的使用5.排除代码检查 1.golangci-lint概述 golangci-lint是用于go语言的代码静态检查工具集 官网地址:golangci-lint 特性: 快…

深度解析:电商平台API接口的安全挑战与应对策略

随着电子商务的蓬勃发展,电商平台与外部服务、内部系统之间的数据交换和通信变得日益频繁。API(应用程序编程接口)接口作为这一过程中的关键枢纽,其安全性显得尤为重要。API接口不仅承载着商品管理、订单处理、支付结算、用户管理…

JS 异步 ( 一、异步概念、Web worker 基本使用 )

文章目录 异步代码异步执行概念ES6 之前的异步 Web worker 异步 代码异步执行概念 通常代码是自上而下同步执行的,既后面的代码必须等待前面的代码执行完才会执行,而异步执行则是将主线程中的某段代码交由子线程去执行,当交给子线程后&…

通过GRE协议组建VPN网络

GRE(Generic Routing Encapsulation,通用路由封装协议)协议是一种简单而有效的封装协议,它在网络中的广泛应用,比如在构建VPN网络。   GRE是一种封装协议,它允许网络层协议(如IP)的…

【gulp】gulp 的基本使用

gulp 是一个基于node的自动化打包构建工具,前端开发者可以使用它来处理常见任务: 创建项目 进入项目 npm init -ynpm i gulp -g (使用命令 gulp)npm i gulp -D # 开发依赖(前端工具都是开发依赖 本地安装 代…

面试问题-华勤技术(软件开发岗)

博主base无锡,刚考完研,顺手投了简历到华勤的校招邮箱,然后第二天上午发信息笔试,考的是c语言/c测试卷,只有选择题和判断题,然后是文段阅读理解卷,数据图表计算卷以及性格测试卷;难度…

centos单机部署seata

文章目录 场景分析下载seata包启动 场景 centos7.9 jdk17 安装部署seata 分析 jdk和seata的版本对应关系如图 JDK版本 推荐 Seata 版本 理由 JDK 8 任何 Seata 版本 JDK 8 是 Seata 长期支持的版本,兼容性最好。 JDK 11 Seata 1.2.0 适合需要长期支持且性能较高的应…

Unity 踩坑记录 将Image 的 Image Type 设置成 sliced 不显示图片

将Image 的 Image Type 设置成 sliced 不显示图片 检查 image 自身的 pixels per Unity multplier 的值 和canvas reference pixels per 的值(默认100)