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 都会强制拉取,可能导致启动延迟或拉取失败。

❗ 如果是自己指定的拉取策略,会完全遵循指定的拉取策略

四、私有仓库镜像拉取

适用于AlwaysIfNotPresent两种策略,多数用于: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
相关推荐
流浪0013 分钟前
Linux系统篇(一):从零入门操作系统:冯诺依曼体系到进程的完整理解
linux·运维·服务器
STDD9 分钟前
Node-RED 自托管部署指南:打造可视化 IoT 自动化平台
运维·物联网·自动化
hj28625130 分钟前
Linux学习方法论 + 系统安全加固与性能优化 完整版笔记(含案例)
运维
刘某的Cloud40 分钟前
硬链接 和 软链接 区别
运维·系统·硬链接·软链接
jiayong2343 分钟前
harness 与 hermes-agent 扩展性、安全与运维
运维·人工智能·安全·ai·架构·智能体·harness
STDD1 小时前
Linux Namespace:容器隔离的底层原理,PID、网络、挂载隔离实战
linux·运维·网络
todoitbo1 小时前
一台 2C2G 服务器上的 KingbaseES 安装记录
运维·服务器·数据库·国产数据库
容器魔方1 小时前
KubeEdge SIG AI: 基于KubeEdge-Ianvs的大模型联邦微调算法
大数据·人工智能·算法·云原生·容器·云计算
tianyuanwo1 小时前
企业级容器镜像管理实践:基于JFrog Artifactory的私有镜像仓库搭建与配置指南
docker·云原生·registry
最后一支迷迭香1 小时前
Mac使用docker下的两个冷知识
macos·docker·容器