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
相关推荐
IMPYLH2 小时前
【无标题】
linux·运维·服务器·网络·bash
Elivs.Xiang2 小时前
Redis - Docker环境下的持久化、主从复制、哨兵、集群、淘汰策略
数据库·redis·docker
比昨天多敲两行2 小时前
Linux权限管理
linux·运维·服务器
runningshark2 小时前
【Linux】VirtualBox ↔ Ubuntu+WinSCP 文件传输
linux·运维·ubuntu
MXsoft6182 小时前
信创时代的运维“铁三角”:一体化监控、自主底座与A预判
运维
aidream12392 小时前
Linux文件操作-文件打包和压缩(tar/gzip/bzip2/xz/zip)
linux·运维·服务器
迷茫运维路2 小时前
云枢运维管理系统
运维·golang·kubernetes·gin·casbin
feng_you_ying_li3 小时前
linux之进程优先与切换调度
linux·运维·服务器
记得多喝水o3 小时前
分析下最近的IPv8提案
运维·服务器