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
)的镜像时,推荐使用此策略,以避免不必要的镜像拉取。
注意: 默认情况下,如果镜像标签是
latest
,imagePullPolicy
会自动设置为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
命令触发更新。
- 修改 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
- 执行
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 以加速更新
通过设置这些参数,您可以精细控制容器的滚动更新行为,以平衡服务可用性和更新速度。
这种修订版本提供了更为清晰的策略解释、更新的实践方法和对滚动更新的详细控制,适用于生产环境中的实际操作。
标签:Kubernetes,更新,拉取,版本,imagePullPolicy,镜像,k8s From: https://www.cnblogs.com/leojazz/p/18686403