k8s之镜像拉取策略

👨‍🎓博主简介

  🏅CSDN博客专家

  🏅云计算领域优质创作者

  🏅华为云开发者社区专家博主

  🏅阿里云开发者社区专家博主

💊交流社区: 运维交流社区 欢迎大家的加入!

🐋 希望大家多多支持,我们一起进步!😄

🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

一、三种镜像拉取策略

策略值 行为描述 适用场景
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
相关推荐
红红谈说15 小时前
定时发布关机就停,本地定时任务的补跑策略怎么设计?
运维·服务器·定时任务·本地调度·补跑策略·幂等互斥·执行记录
4SAPI16 小时前
企业级大模型工作流基础设施选型指南:4SAPI、硅基流动与 OpenRouter 的架构权衡
运维·人工智能·架构·自动化
幽默小吴16 小时前
nginx篇
运维·nginx
爱和冰阔落16 小时前
【Linux网络】UDP 服务器怎么写?从 socket、bind 到 recvfrom/sendto,手写完整回显服务器
linux·运维·服务器·网络
maochongsandai11016 小时前
Centos上运行docker应用命令汇总
linux·docker·centos
知已难寻16 小时前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
小白的码BUG之路16 小时前
K8S -- 集群搭建环境基础
java·服务器·kubernetes
艾伦_耶格宇16 小时前
【kubernetes - 1.28版本】-4 containerd与docker-ce 的区别
docker·容器·kubernetes
七夜zippoe16 小时前
Agent 网关设计:统一入口、智能路由与负载均衡
运维·ai·log4j·负载均衡·agent·网关设计
CQU_JIAKE16 小时前
10.28【A】
linux·运维·网络