1. 概述

Kubernetes 是一个高度健壮的容器编排平台,广泛用于高效管理封装在容器中的应用程序。为了确保应用的稳定性和安全性,掌握在必要时强制 Kubernetes 重新拉取镜像的方法非常重要

本文将介绍几种常见的方法,帮助你在不同场景下实现镜像的重新拉取。


2. 设置镜像拉取策略(Image Pull Policy)

Kubernetes 提供了三种镜像拉取策略:

  • IfNotPresent(默认):只有在节点上没有该镜像时才拉取
  • Always:每次启动容器都重新拉取镜像
  • Never:只使用本地镜像,不尝试拉取

如果你希望 Kubernetes 每次都重新拉取镜像,可以将 imagePullPolicy 设置为 Always

示例 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: my-container
          image: myregistry/my-image:latest
          imagePullPolicy: Always

⚠️ 注意:使用 Always 策略时,如果镜像标签未变更,Kubernetes 仍会尝试拉取,可能增加网络开销。


3. 修改镜像标签(Image Tag)

这是最常见也是最直接的方法:通过修改 Deployment 中的镜像标签,Kubernetes 会识别为新镜像并触发拉取。

例如,将镜像从 myregistry/my-image:2.0.0 更新为 myregistry/my-image:2.1.0

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: my-container
          image: myregistry/my-image:2.1.0

✅ 优点:无需修改部署策略,简单有效
✅ 推荐用于 CI/CD 自动化流程中


4. 使用镜像拉取密钥(ImagePullSecrets)

如果你的镜像位于私有仓库中,且认证信息发生了变化,可以通过更新 ImagePullSecret 来触发重新拉取。

示例定义一个镜像拉取密钥:

apiVersion: v1
kind: Secret
metadata:
  name: my-registry-secret
  type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: <base64-encoded credentials>
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: my-container
          image: myregistry/my-image:latest
      imagePullSecrets:
        - name: my-registry-secret

⚠️ 注意:更新密钥内容不会自动触发 Pod 重启,需配合其他方法(如滚动更新)使用。


5. 在 OpenShift 中使用 ImageStream

OpenShift 提供了 ImageStream 功能,用于抽象镜像元数据,简化镜像更新流程。

通过更新 ImageStream 的 tag,OpenShift 会自动触发镜像拉取和部署更新。

示例:

apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
  name: my-image-stream
spec:
  tags:
    - name: latest
      from:
        kind: DockerImage
        name: myregistry/my-image:2.1.0

✅ 优点:

  • 不需要修改 Deployment,只需更新 ImageStream tag
  • 支持版本回滚和自动清理旧版本镜像

6. 使用滚动更新(Rolling Update)

滚动更新是一种渐进式更新方式,Kubernetes 会逐步替换旧的 Pod 实例,确保应用在更新过程中保持可用。

使用 kubectl set image 命令即可触发滚动更新:

$ kubectl set image deployment/my-app my-container=myregistry/my-image:2.1.0
deployment/my-app image updated

✅ 优点:

  • 可控性强,支持逐步更新
  • 出现问题可快速回滚

7. 总结

方法 适用场景 优点 注意事项
设置 imagePullPolicy: Always 希望每次拉取最新镜像 简单直接 增加拉取次数
修改镜像标签 CI/CD 部署、版本控制 稳定、推荐做法 标签必须变更
使用 ImagePullSecret 私有仓库认证变更 安全性高 不自动触发更新
OpenShift 的 ImageStream OpenShift 用户 元数据抽象,便于管理 仅限 OpenShift
滚动更新 应用版本升级 渐进式更新,支持回滚 需要更新镜像或配置

根据你的实际场景选择合适的方法,合理使用这些技巧,可以有效提升 Kubernetes 部署的灵活性与安全性。


原始标题:How to Force Kubernetes to Re-Pull an Image