👨🎓博主简介
💊交流社区: 运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗
文章目录
-
- 一、三种镜像拉取策略
- 二、策略示例
-
- [2.1 IfNotPresent 拉取策略](#2.1 IfNotPresent 拉取策略)
- [2.2 Always 拉取策略](#2.2 Always 拉取策略)
- [2.3 Never 拉取策略](#2.3 Never 拉取策略)
- 三、默认策略的隐式规则
- 四、私有仓库镜像拉取
-
- [步骤 1:创建 Secret](#步骤 1:创建 Secret)
- [步骤 2:在 Pod/Deployment 中引用](#步骤 2:在 Pod/Deployment 中引用)
- [步骤 3:配置默认 Secret(可选)](#步骤 3:配置默认 Secret(可选))
- 五、故障排查

一、三种镜像拉取策略
| 策略值 | 行为描述 | 适用场景 |
|---|---|---|
Always |
总是从远程仓库拉取最新镜像,即使本地已存在 | 使用 :latest 标签或开发环境需频繁更新 |
IfNotPresent |
本地不存在时才拉取,本地有则直接使用 | 生产环境使用固定版本标签(默认策略) |
Never |
永不拉取远程镜像,仅使用本地已存在的镜像 | 离线环境、预加载镜像、本地调试 |
二、策略示例
2.1 IfNotPresent 拉取策略
IfNotPresent拉取策略:本地不存在时才会去官方仓库拉取,本地存在时拉取本地的镜像,也是默认的拉取策略
- nginx deployment 示例:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25.0
# 默认不写拉取策略也是这个
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
2.2 Always 拉取策略
Always拉取策略:总是从镜像仓库拉取,再yaml中可以直接配置要拉取的地址,例如:registry.cn-hangzhou.aliyuncs.com/myrepo/nginx:1.24,就会每次运行时都要从这个仓库拉取镜像,一般拉取镜像地址为自己搭建的harbor仓库或云仓库,适用于内外网生产环境使用,确保每次拉取都是最新的镜像;
- nginx deployment 示例:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25.0
imagePullPolicy: Always
ports:
- containerPort: 80
2.3 Never 拉取策略
Never拉取策略:总是从本地拉取镜像,不去远程仓库进行拉取;适用于自定义镜像及内网环境开发使用;
- nginx deployment 示例:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25.0
imagePullPolicy: Never
ports:
- containerPort: 80
三、默认策略的隐式规则
K8s 会根据 image 标签 自动选择默认策略:
| 镜像标签 | 默认策略 |
|---|---|
:latest 或 无标签 |
Always |
具体版本(如 :v1.2.3) |
IfNotPresent |
⚠️ 陷阱警告 :使用
:latest时,即使本地有镜像,每次创建 Pod 都会强制拉取,可能导致启动延迟或拉取失败。❗ 如果是自己指定的拉取策略,会完全遵循指定的拉取策略
四、私有仓库镜像拉取
适用于
Always和IfNotPresent两种策略,多数用于:Always策略中;
当镜像存储在私有仓库(如Harbor、阿里云 ACR)时,需要配置imagePullSecrets:
步骤 1:创建 Secret
命令行创建 docker-registry 类型的 Secret;
bash
kubectl create secret docker-registry registry-secret \
--docker-server=172.16.10.24 \
--docker-username=admin \
--docker-password=Harbor12345 \
-n default
查看创建好的secret
bash
kubectl get secret

步骤 2:在 Pod/Deployment 中引用
yaml
spec:
imagePullSecrets:
- name: registry-secret # 引用上面创建的 Secret
containers:
- name: nginx
image: 172.16.10.24:10010/library/nginx:1.25.0
完整的内容:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
imagePullSecrets:
- name: registry-secret # 引用上面创建的 Secret
containers:
- name: nginx
# 镜像仓库中的镜像地址
image: 172.16.10.24:10010/library/nginx:1.25.0
imagePullPolicy: Always
ports:
- containerPort: 80
创建运行nginx的deployment
bash
# yaml文件名称自定义
kubectl apply -f nginx-always.yaml
# 查看pod运行状态
kubectl get pod -n nginx
# 查看nginx pod的创建日志,是否是拉取的镜像
kubectl describe pod -n nginx nginx-deployment-5d5d699957-959kc | grep -iA10 events

步骤 3:配置默认 Secret(可选)
为命名空间下所有 Pod 自动添加:
bash
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "registry-secret"}]}' -n nginx
五、故障排查
| 现象 | 原因 | 解决 |
|---|---|---|
| ImagePullBackOff | 镜像不存在/认证失败 | 检查镜像地址、Secret、网络 |
| ErrImageNeverPull | 本地无镜像 | 节点上 docker load 导入 |
| 权限拒绝 | Secret 错误 | 检查 username/password/server |