随笔 - 307  文章 - 0  评论 - 5  阅读 - 4264

k8s的镜像拉取策略

Kubernetes 镜像更新策略

在 Kubernetes(简称 K8s)中,容器镜像的更新行为主要由 imagePullPolicy 参数控制。该策略决定了 Kubernetes 在启动或重启容器时是否从镜像仓库拉取新的镜像版本。常见的镜像更新策略有三种:

1. Always

如果容器的 imagePullPolicy 设置为 Always,每次创建 Pod 或者重启容器时,Kubelet 都会从镜像仓库拉取最新的镜像版本。这对于使用 latest 标签或者希望始终获取最新镜像的场景非常有用,但在生产环境中应谨慎使用,因为 latest 标签的镜像内容可能会随时变化,导致版本不一致或潜在的不稳定。

建议: 在生产环境中避免直接使用 latest 标签,使用明确的版本号(如 v1.0.1)来确保一致性,并记录镜像版本历史以便于追踪和排查问题。

2. IfNotPresent(默认值)

imagePullPolicy 设置为 IfNotPresent 时,如果本地节点上已经存在该镜像,则 Kubelet 不会尝试从镜像仓库拉取镜像;仅当本地不存在该镜像时,Kubelet 才会去远程仓库拉取镜像。通常,使用带有明确版本标签(如 v1.0)的镜像时,推荐使用此策略,以避免不必要的镜像拉取。

注意: 默认情况下,如果镜像标签是 latestimagePullPolicy 会自动设置为 Always;如果是版本号标签(如 v1.0),则默认使用 IfNotPresent

3. Never

如果 imagePullPolicy 设置为 Never,无论本地是否存在该镜像,Kubelet 都不会尝试从镜像仓库拉取镜像,而是始终使用本地已有的镜像。这种策略适用于不希望自动升级镜像版本,且希望始终使用特定版本的场景。

更新应用镜像的常见方法

在 Kubernetes 中,更新应用镜像的常见方法是通过修改 Deployment、StatefulSet 等控制器中定义的 Pod 模板内的镜像版本,然后执行 kubectl apply 命令将更改推送到集群,触发滚动更新。

滚动更新的过程中,Kubernetes 会逐步替换旧的容器实例,确保服务的持续可用性。您可以使用以下命令来更新镜像版本:

示例:更新 Deployment 中的镜像

假设我们有一个名为 example-deployment 的 Deployment,其中定义了一个容器镜像 myapp:v1.0。我们将镜像版本更新为 myapp:v2.0,并通过 kubectl apply 命令触发更新。

  1. 修改 Deployment 配置文件 deployment.yaml 中的镜像版本:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-container
        image: myapp:v2.0  # 修改为新的镜像版本
        imagePullPolicy: IfNotPresent
  1. 执行 kubectl apply 命令将变更推送到集群:
kubectl apply -f deployment.yaml

在执行该命令后,Kubernetes 会根据定义的镜像更新策略(例如,imagePullPolicy: IfNotPresent)决定是否从仓库拉取新的镜像,并按滚动更新的方式逐步替换旧版本的容器实例。

滚动更新控制

在滚动更新过程中,您还可以通过以下参数控制更新过程的行为:

  • maxUnavailable:定义更新过程中允许不可用的最大 Pod 数量,控制更新期间服务的最小可用性。
  • maxSurge:定义在更新过程中可以超出期望副本数的最大 Pod 数量,帮助提升更新的速度。

合理设置这两个参数可以在保证服务可用性的同时加速或控制更新过程。例如:

spec:
  replicas: 3
  strategy:
    rollingUpdate:
      maxUnavailable: 1  # 最多允许 1 个 Pod 不可用
      maxSurge: 1        # 可以增加 1 个 Pod 以加速更新

通过设置这些参数,您可以精细控制容器的滚动更新行为,以平衡服务可用性和更新速度。


这种修订版本提供了更为清晰的策略解释、更新的实践方法和对滚动更新的详细控制,适用于生产环境中的实际操作。

posted on   Leo-Yide  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示