k8s镜像拉取方式选择-imagePullPolicy

本文详细解析了Kubernetes中镜像拉取策略imagePullPolicy的默认行为及不同场景下的设置规则。包括Always、IfNotPresent、Never三种策略的含义与应用,以及在创建Pod时如何自动设置这些策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

镜像拉取方式选择

默认镜像拉取策略
当你(或控制器)向 API 服务器提交一个新的 Pod 时,你的集群会在满足特定条件时设置 imagePullPolicy 字段:

如果你省略了 imagePullPolicy 字段,并且你为容器镜像指定了摘要, 那么 imagePullPolicy 会自动设置为 IfNotPresent。
如果你省略了 imagePullPolicy 字段,并且容器镜像的标签是 :latest, imagePullPolicy 会自动设置为 Always。
如果你省略了 imagePullPolicy 字段,并且没有指定容器镜像的标签, imagePullPolicy 会自动设置为 Always。
如果你省略了 imagePullPolicy 字段,并且为容器镜像指定了非 :latest 的标签, imagePullPolicy 就会自动设置为 IfNotPresent。

说明:
容器的 imagePullPolicy 的值总是在对象初次 创建 时设置的, 如果后来镜像的标签或摘要发生变化,则不会更新。

例如,如果你用一个 非 :latest 的镜像标签创建一个 Deployment, 并在随后更新该 Deployment 的镜像标签为 :latest,
则 imagePullPolicy 字段 不会 变成 Always。 你必须手动更改已经创建的资源的拉取策略。

https://kubernetes.io/zh-cn/docs/concepts/containers/images/#image-pull-policy
官方文档:https://kubernetes.io/docs/concepts/containers/images/

k8s-imagePullPolicy

  containers:
    - name: uses-private-image
      image: $PRIVATE_IMAGE_NAME
      imagePullPolicy: Always
      command: [ "echo", "SUCCESS" ]

k8s的配置文件中经常看到有imagePullPolicy属性,这个属性是描述镜像的拉取策略

Always 总是拉取镜像

IfNotPresent 本地有则使用本地镜像,不拉取

Never 只使用本地镜像,从不拉取,即使本地没有

如果省略imagePullPolicy  策略为always 
### 批量修改Kubernetes中的容器镜像策略 为了批量更改Kubernetes集群中多个Pod或Deployment的镜像策略,通常有两种主要方法: #### 方法一:通过编辑YAML配置文件并重新应用 如果拥有所有目标资源(如Deployments, StatefulSets等)的原始YAML定义文件,则可以直接编辑这些文件来改变`imagePullPolicy`字段。之后使用命令行工具`kubectl apply -f <your-file>.yaml`再次部署更新后的资源配置。 对于已经存在于集群内的资源而没有保存其对应的YAML文件的情况下,可以通过导出现有的资源描述作为基础来进行修改: ```bash # 导出特定命名空间下的deployment为yaml格式,并排除自动添加的状态信息 kubectl get deployments -n your-namespace -o yaml --export > deployments.yaml ``` 接着手动打开生成的`deployments.yaml`文件,在每一个容器模板里找到`spec.template.spec.containers[*].imagePullPolicy`项将其设置成期望值(Always/Never/IfNotPresent),最后再执行apply操作[^1]。 #### 方法二:利用`jsonpath`或者`patch`方式在线上直接打补丁 另一种更灵活的方式是在不下载任何文件的前提下直接对线上资源做局部调整。这需要用到`kubectl patch`命令配合JSON Patch语法实现精准定位和替换。下面是一个例子展示如何一次性将某命名空间内所有的ReplicaSet对象里的镜像策略改为`Always`: ```bash # 获该命名空间下所有replicasets的名字列表 REPLICASETS=$(kubectl get rs -n your-namespace -o name) for RS in $REPLICASETS; do # 对每个replicaset逐个打补丁 kubectl patch $RS \ -p='{"spec":{"template":{"spec":{"containers":[{"name":"*","imagePullPolicy":"Always"}]}}}}'\ --type=merge -n your-namespace; done ``` 需要注意的是这里的`"*"`通配符仅适用于某些版本的Kubernetes;如果是较新版本可能需要具体指明容器名称而不是使用星号匹配全部容器。另外这种方法会覆盖原有配置中关于此属性的内容,请谨慎评估风险后再实施[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值