解决k8s拉取私有镜像401 Unauthorized 问题

ops/2024/11/25 10:59:37/

拉取镜像时未指定账户和密码通常是因为需要访问的镜像仓库启用了认证,但 Kubernetes 默认配置中未提供访问凭据。要解决此问题,可以按照以下步骤配置镜像仓库的认证信息:


1. 创建 Kubernetes Secret

为镜像仓库配置访问凭据,使用 kubectl 创建一个类型为 docker-registry 的 Secret。

kubectl create secret -n kubesphere-devops-system docker-registry my-registry-secret \--docker-server=registry.flow.cn \--docker-username=<your-username> \--docker-password=<your-password> \--docker-email=<your-email>
  • 参数说明
    • --docker-server:镜像仓库的地址,例如 registry.flow.cn
    • --docker-username:登录仓库的用户名。
    • --docker-password:登录仓库的密码。
    • --docker-email:邮箱地址(可以是任意值,不强制验证)。

2. Pod 单独配置

修改 CronJobspec.template.spec 配置,添加 imagePullSecrets 字段,指定刚创建的 Secret 名称。

更新后的 CronJob 配置如下:

kind: CronJob
apiVersion: batch/v1
metadata:name: devopsnamespace: kubesphere-devops-systemlabels:app: devops-pipelinerun-gcjobsapp.kubernetes.io/managed-by: Helmannotations:meta.helm.sh/release-name: devopsmeta.helm.sh/release-namespace: kubesphere-devops-system
spec:schedule: "0/2 * * * *"startingDeadlineSeconds: 4000concurrencyPolicy: Forbidsuspend: falsejobTemplate:spec:template:metadata:labels:app: devopsrelease: devopsspec:containers:- name: pipeline-run-gcimage: 'registry.flow.cn/kubesphereio/devops-tools:ks-v3.4.1'command:- ks- pip- gcimagePullPolicy: AlwaysrestartPolicy: NeverterminationGracePeriodSeconds: 30dnsPolicy: ClusterFirstserviceAccountName: devopsserviceAccount: devopsimagePullSecrets:  # 添加这一部分- name: my-registry-secretsuccessfulJobsHistoryLimit: 3failedJobsHistoryLimit: 1

验证配置

  1. 检查 Secret

    kubectl get secret -n kubesphere-devops-system
    

    确保 my-registry-secret 已成功创建。
    在这里插入图片描述

  2. 检查 CronJob 运行状态

    kubectl get cronjob -n kubesphere-devops-system
    
  3. 查看 Pod 拉取镜像日志
    如果镜像拉取失败,检查 Pod 事件:

    kubectl describe pod <pod-name> -n kubesphere-devops-system xxxx
    

注意事项

  • 镜像仓库地址:确保仓库地址(docker-server)与 image 字段中配置的一致。
  • 命名空间:Secret 和 CronJob 必须在同一命名空间下(如 kubesphere-devops-system)。
  • 权限问题:确保镜像仓库用户具备对目标镜像的拉取权限。

完成上述配置后,CronJob 应能够正确拉取镜像并运行。

3. ServiceAccount 配置: 如果多个 Pod 使用相同的 serviceAccount,可以为 ServiceAccount 配置 Secret

确认需要使用的 ServiceAccount
查看当前 Pod 使用的 ServiceAccount:

kubectl get pods <pod-name>  -n <namespace> -o jsonpath='{.spec.serviceAccountName}'

我我们假设返回的是 openebs-maya-operator
如果 kubectl get pods 命令返回的 serviceAccountName 是空的,说明 Pod 没有显式绑定任何 ServiceAccount,它会默认使用 default ServiceAccount。在这种情况下,你可以为 default ServiceAccount 配置 imagePullSecrets,或者直接为该 Pod 显式指定一个 ServiceAccount。


解决方案

方案 1:为默认 ServiceAccount 配置 imagePullSecrets

默认情况下,每个命名空间都包含一个 default ServiceAccount。如果 Pod 未显式指定 serviceAccountName,它会使用这个默认账户。

  1. 为命名空间中的 default ServiceAccount 添加 imagePullSecrets

    kubectl patch serviceaccount default \-n <namespace>\-p '{"imagePullSecrets": [{"name": "my-registry-secret"}]}'
    
  2. 验证配置:

 kubectl describe serviceaccount default -n <namespace>

确保输出中有以下内容:

Image pull secrets: my-registry-secret

方案 2:显式为 Pod 指定 ServiceAccount

为 Pod 指定一个具有正确配置的 ServiceAccount,比如 openebs-maya-operator

  1. 编辑 Pod 的 YAML 文件,将 serviceAccountName 字段显式指定:

    spec:serviceAccountName: openebs-maya-operator
    
  2. 如果没有现成的 ServiceAccount,可以创建一个新的并配置 imagePullSecrets

kubectl create serviceaccount openebs-maya-operator -n <namespace>
kubectl patch serviceaccount openebs-maya-operator \
-n <namespace>\
-p '{"imagePullSecrets": [{"name": "my-registry-secret"}]}'
  1. 删除并重新创建 Pod 以应用更改:
    kubectl delete pod <pod-name> -n <namespace>
    

方案 3:临时修改 Pod 配置

如果你只想快速测试,可以直接在 Pod 配置中添加 imagePullSecrets(不过这不是最佳实践)。

编辑 Pod 的 YAML 文件,添加以下内容:

spec:imagePullSecrets:- name: my-registry-secret

重新应用修改后的 Pod 配置:

kubectl replace -f pod.yaml

验证步骤

无论采用哪种方案,确保最终拉取镜像成功:

  1. 查看 Pod 状态:

    kubectl get pods -n <namespace>
    
  2. 如果仍有错误,请检查具体日志:

    kubectl describe pod <pod-name> -n <namespace>
    
  3. 确认镜像仓库的认证信息正确,并确保网络连接正常。


http://www.ppmy.cn/ops/136546.html

相关文章

量子感知机

神经网络类似于人类大脑&#xff0c;是模拟生物神经网络进行信息处理的一种数学模型。它能解决分类、回归等问题&#xff0c;是机器学习的重要组成部分。量子神经网络是将量子理论与神经网络相结合而产生的一种新型计算模式。1995年美国路易斯安那州立大学KAK教授首次提出了量子…

2024年北京海淀区中小学信息学竞赛(初赛)试题

来源&#xff1a;2024年北京海淀区中小学信息学竞赛&#xff08;初赛&#xff09;试题 | 6547网 2024年北京海淀区中小学信息学竞赛&#xff08;初赛&#xff09;试题 题目总数&#xff1a;24 总分数&#xff1a;100 单项选择题(共有 15 道小题&#xff0c;每道小题3分&am…

【Qt】控件LineEdit

1.QcalendarWidget 获取点击的时间&#xff0c;显示在lineedit上 2.QLineEdit 1.QLineEdit设置内部提示 ui->name->setPlaceholderText("请输入名字");//设置内部提示2.设置快捷删除 ui->name->setClearButtonEnabled(true);//设置一键清除3.设置…

彻底理解Redis的过期策略

一.由来 因为现在Redis的使用是非常普遍的&#xff0c;Redis是基于内存的数据存储系统&#xff0c;而内存相比于早些年而言&#xff0c;还是便宜了很多&#xff0c;但是相比硬盘而言还是最很多&#xff0c;因此提高Redis里面的内存利用率是非常重要&#xff0c;而Redis的过期策…

Vue3 生命周期钩子详解

Vue3 生命周期钩子详解 简介 Vue3的生命周期钩子让我们能够在组件的不同阶段执行自定义代码。与Vue2相比&#xff0c;Vue3的生命周期钩子在Composition API中有了新的使用方式&#xff0c;但整体概念保持一致。 基础知识 Vue3中的生命周期钩子可以通过两种方式使用&#xf…

C程序设计语言 第二章 类型、运算符与表达式

变量和常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型&#xff0c;也可以指定变量的初值。运算符指定将要进行的操作。表达式则把变量与常量组合起来生成新的值。对象的类型决定该对象可取值的集合以及可以对该对象执行的操作。本章将详细讲述这些内容。 AN…

C指针之舞——指针探秘之旅(2)

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏&#xff1a;C语言学习专栏 在上一篇博客文章&#xff1a;C指针之舞——指针探秘之旅-CSDN博客中&#xff0c;我们学习了字符指针&#xff0c;指针数组&#xff0c;数组指针&#xff0c;数组传参和指针传参等内容&#xff0c;…

idea添加版权信息

1、添加Copyright Profiles 打开Settings -> Editor -> Copyright -> Copyright Profiles -> 新增 Copyright (c) 【你的版权信息】 【开始年份】-${today.year}. All rights reserved.如&#xff1a; Copyright (c) by cwp 2024-${today.year}. All rights rese…