k8s从私有仓库拉取镜像

从私有仓库拉取镜像 | Kubernetes

准备开始

  • 你必须拥有一个 Kubernetes 的集群,同时你必须配置 kubectl 命令行工具与你的集群通信。 建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。
  • 可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:
    • Killercoda
    • 玩转 Kubernetes
  • 要进行此练习,需要 docker 命令行工具和一个知道密码的 Docker ID。
  • 如果要使用不同的私有的镜像仓库,需要有对应镜像仓库的命令行工具和登录信息。

登录 Docker 镜像仓库

在个人电脑上,要想拉取私有镜像必须在镜像仓库上进行身份验证。

使用 docker 命令工具来登录到 Docker Hub。 更多详细信息,请查阅 Docker ID accounts 中的 log in 部分。

docker login

# or
docker login <harbor仓库地址> -u <用户名> -p <密码>
# eg
docker login https://k8s-harbor.com/harbor/project

当出现提示时,输入你的 Docker ID登录凭据(访问令牌或 Docker ID 的密码)。

登录过程会创建或更新保存有授权令牌的 config.json 文件。 查看 Kubernetes 如何解析这个文件。

查看 config.json 文件:

cat ~/.docker/config.json

输出结果示例:

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "c3R...zE2"        
    }
  }
}
# use
[root@rpp-vm00 ~]# cat ~/.docker/config.json
{
    "auths": {
        "k8s-harbor.com": {
            "auth": "cm9ib3QkcGVybWlzc2lvbl9wcm8rcHJvcm9ib3Q6ZTlwTVNhNTNmWjA4MUU4dFZJV1hJM3BtUmlveVhUNXo="
         }
    }
}

说明:

使用 Docker 凭据仓库时,不会看到 auth 条目,看到的将是以仓库名称作为值的 credsStore 条目。 此时,可以直接创建 Secret。 请参阅 在命令行上提供凭据来创建 Secret。

从Harbor非公开仓库拉取镜像配置

在Harbor中创建私有镜像仓库, 并配置相关机器人账号,获取到机器人账号的用户名和密码,然后配置到步骤4步骤5中即可。

3.1 创建私有项目仓库

3.2 创建机器人账户

创建机器人账户,并设置权限和关联项目。

3.3 创建项目内部机器人账户

处理创建global机器人账号外,也可以在项目内部创建机器人账号, 该机器人账号只对该项目有效:

3.4 保存机器人账号访问凭证

无论5.2还是5.3章节创建的机器人账号,创建完成后会弹出该账号的访问凭证,内容示例如下:

其中, name 为用户名, 密码为 secret:

 {
    "creation_time":"2023-10-30T03:50:21.260Z",
    "expires_at":-1,
    "id":4,
    "name":"robot$permission_pro+prorobot",      // 用户名
    "secret":"e9pMSa53fZ081E8tVIWXI3pmRioyXT5z"  // 密码
}

方式一: 基于现有凭据创建generic 类型的 Secret

Kubernetes 使用 kubernetes.io/dockerconfigjson 类型的 Secret 对镜像仓库进行身份验证,拉取镜像。

运行之前的 docker login 命令,复制~/.docker/config.json中的凭据到 Kubernetes:

kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson

更多的设置(例如,为新 Secret 设置名字空间或标签), 可以自定义 Secret 。 但必须:

  • 将 data 项中的名称设置为 .dockerconfigjson
  • 使用 base64 编码方法对 Docker 配置文件进行编码,然后粘贴该字符串的内容,作为字段 data[".dockerconfigjson"] 的值
  • type 设置为 kubernetes.io/dockerconfigjson

示例:

apiVersion: v1
kind: Secret
metadata:
  name: myregistrykey
  namespace: awesomeapps
data:
  .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson

如果你收到错误消息:error: no objects passed to create, 这可能意味着 base64 编码的字符串是无效的。如果你收到类似 Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ... 的错误消息,则表示数据中的 base64 编码字符串已成功解码, 但无法解析为 .docker/config.json 文件。

(use)方式二: 通过命令行创建 docker-registry 类型的Secret

创建 Secret,命名为 regcred

kubectl create secret docker-registry regcred \
  --docker-server=<你的镜像仓库服务器> \
  --docker-username=<你的用户名> \
  --docker-password=<你的密码> \
  --docker-email=<你的邮箱地址>

# use  '$'是特殊字符, 需要使用'\'转义
kubectl create secret docker-registry k8s-harbor-secret \
  --docker-server=https://k8s-harbor.com \
  --docker-username="robot\$permission_pro+prorobot" \
  --docker-password="e9pMSa53fZ081E8tVIWXI3pmRioyXT5z" \
  --docker-email=rpp@rpp.com

========================= 参考 ===========================
kubectl edit secret/k8s-harbor-secret
kubectl get secret k8s-harbor-secret --output=yaml
kubectl delete secret k8s-harbor-secret

kubectl get secret

kubectl get secret k8s-harbor-secret \
--output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

参数解释:

  • <your-registry-server> 私有 Docker 仓库全限定域名(FQDN)。 DockerHub 使用 https://index.docker.io/v1/
  • <your-name> Docker 用户名。
  • <your-pword> Docker 密码。
  • <your-email> Docker 邮箱。

说明:

在命令行上键入 Secret 可能存储在Shell 历史记录中而不受保护, 并且这些 Secret 信息也可能在 kubectl 运行期间对 PC 上的其他用户可见。

检查 Secret

用 YAML 格式进行查看上面创建的regcredSecret

kubectl get secret regcred --output=yaml

# use
kubectl get secret k8s-harbor-secret --output=yaml

输出和下面类似:

apiVersion: v1
kind: Secret
metadata:
  ...
  name: regcred
  ...
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson

.dockerconfigjson 字段的值是 Docker 凭据的 base64 表示。

将 Secret 数据转换为可读格式:

kubectl get secret regcred \
--output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

# use
kubectl get secret k8s-harbor-secret \
--output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

输出和下面类似:

{
    "auths":{
        "your.private.registry.example.com": {
            "username":"janedoe",
            "password":"xxxxxxxxxxx",
            "email":"jdoe@example.com",
            "auth":"c3R...zE2"
        }
    }
}

查看 auth 字段中内容,解码 base64 编码过的数据:

echo"c3R...zE2" | base64 --decode

输出结果中,用户名和密码用 : 链接,类似下面这样:

janedoe:xxxxxxxxxxx

注意,Secret 数据包含与本地 ~/.docker/config.json 文件类似的授权令牌。

创建应用 Secret 的 Pod

下面是一个 Pod 配置清单示例,该示例中 Pod 访问 Docker 凭据 regcred

pods/private-reg-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image> # 私有仓库的镜像路径
  imagePullSecrets:  # 从 Secret 获取凭据
  - name: regcred

下载文件:

curl -L -o my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml

imagePullSecrets 字段配置仓库镜像的凭据。regcred 即从名为regcred的 Secret 获取凭据。

创建Pod,并检查是否正常运行:

kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg

说明:

要为 Pod(或 Deployment,或其他有 Pod 模板的对象)使用镜像拉取 Secret, 需要确保合适的 Secret 确实存在于正确的名字空间中。 要使用的是定义 Pod 时所用的namespace

此外,如果 Pod 启动失败,状态为 ImagePullBackOff,查看 Pod 事件:

kubectl describe pod private-reg

如果报错 FailedToRetrieveImagePullSecret , 说明 Kubernetes 找不到相关名称(此例中为 regcred)的 Secret

确保 Secret 存在,并且其名称拼写正确,下面为报错示例:

Events:
  ...  Reason                           ...  Message
       ------                                -------
  ...  FailedToRetrieveImagePullSecret  ...  Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.

创建应用 Secret 的 Deployment

Deployment 配置清单示例,Deployment 访问 Docker 凭据 regcred:

apiVersion: apps/v1            # 版本
kind: Deployment               # 类型
metadata:                      # Deployment的元数据
  name: springboot-docker2-dp  # Deployment的名字
  namespace: my-namespace-100
  labels:                         # 标签
    app: springboot-docker2-pod   # 选择器,用于匹配Pod的标签,确保Pod属于该Deployment
spec:                             # Pod的信息
  replicas: 3                     # Pod的副本数
  selector:                       # 标签选择器
    matchLabels:                  # 选择器,用于匹配Pod的标签,确保Pod属于该Deployment
      app: springboot-docker2-pod # app=springboot-docker2
  template:                       # Pod的模板信息,根据模板信息来创建Pod
    metadata:                     # Pod的元数据
      labels:                     # Pod的标签,与Selector中的标签匹配以确保Pod属于该Deployment
        app: springboot-docker2-pod  # 标签app=springboot-docker2
    spec:                      # 容器的信息    
      containers:                 # 容器
      - name: springboot-docker2  # 容器名
        image: k8s-harbor.com/permission_pro/spring-boot-docker2:0.0.1-SNAPSHOT
        ports:                 # 端口
        - containerPort: 8600  # 容器暴露的端口
          name: business-port
        - containerPort: 8800
          name: actuator-port
      imagePullSecrets:  # 从 Secret 获取凭据
      - name: k8s-harbor-secret

查看运行状态:

vi springboot-docker2-dp-secret-svc-ingress.yml

kubectl apply -f springboot-docker2-dp-secret-svc-ingress.yml

kubectl delete -f springboot-docker2-dp-secret-svc-ingress.yml

kubectl get pod

kubectl describe pod springboot-docker2-dp-697ccf7c7c-7zntd

scp -r 192.168.31.55:/etc/docker/certs.d/k8s-harbor.com /etc/containerd/certs.d/

crictl pull k8s-harbor.com/permission_pro/spring-boot-docker2:0.0.1-SNAPSHOT
docker pull k8s-harbor.com/permission_pro/spring-boot-docker2:0.0.1-SNAPSHOT
scp 192.168.31.151:/usr/local/ssl/{server.crt,server.key,myCA.cer} .

scp 192.168.31.151:/usr/local/ssl/{myCA.crt,server.cert} .
insecure_skip_verify = false

$. systemctl restart containerd
$. systemctl status containerd

kubectl get deploy

kubectl get deploy springboot-docker2-dp

kubectl get pod private-reg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/111258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二十二、Arcpy批量波段组合——结合Landat数据城市建成区提取

一、前言 其实波段组合和GIS中栅格计算有点类似,实质上就是对每个像素点对应的DN值进行数学计算,也就是可以进行运算表达式是三个或多个变量相加、相减……每一个变量对应于一个图像数据,对这三个或多个图像数据求值并输出结果图像。 二、具体操作 1、实验具体目标 将202…

英语——歌曲篇——only you

《only you》(只有你)赏析 很多人都听过The Platters(派特斯乐队)演唱的《only you》(只有你)这首歌曲&#xff0c;尤其是看过在周星驰和罗家英在《大话西游》里面演绎的"无厘头"版本后。 不过&#xff0c;又有几人知道&#xff0c;这首歌曲原来是经典浪漫影片《罗马…

【Docker】Linux网络命名空间

命名空间 Namespace是Linux提供的一种对于系统全局资源的隔离机制&#xff1b;从进程的视角来看&#xff0c;同一个namespace中的进程看到的是该namespace自己独立的一份全局资源&#xff0c;这些资源的变化只在本namespace中可见&#xff0c;对其他namespace没有影响。容器就…

python 练习 在列表元素中合适的位置插入 输入值

目的&#xff1a; 有一列从小到大排好的数字元素列表&#xff0c; 现在想往其插入一个值&#xff0c;要求&#xff1a; 大于右边数字小于左边数字 列表元素&#xff1a; [1,4,6,13,16,19,28,40,100] # 方法&#xff1a; 往列表中添加一个数值&#xff0c;其目的方便元素位置往后…

操作系统:内存管理(二)虚拟内存管理

一战成硕 3.2 虚拟内存管理3.2.1 虚拟内存的基本概念3.2.2 请求分页管理方式3.2.3 页框分配3.2.4 页面置换算法3.2.5 抖动和工作集 3.2 虚拟内存管理 3.2.1 虚拟内存的基本概念 3.2.2 请求分页管理方式 页表机制 缺页中断机制 地址变换机构 3.2.3 页框分配 驻留集大小 内…

一致性哈希揭秘,深入解析其工作原理

前言 在进行一致性哈希介绍前&#xff0c;先思考2个问题&#xff1a; 什么是Hash一致性Hash和Hash的关系是什么 对于第一个问题Hash的定义 Hash也成散列&#xff0c;基本原理就是把任意长度的输入&#xff0c;通过hash算法变成固定长度的输出。 对于第二个问题&#xff0c…

gitee上传项目

目录 首先在gitee新建一个仓库 接下来创建好项目&#xff0c;先找到生成公钥SSH的目录 接下来是生成公钥SSH 仓库创建好后&#xff0c;接着开始链接项目 首先在gitee新建一个仓库 接下来创建好项目&#xff0c;先找到生成公钥SSH的目录 接下来是找目录&#xff1a;C盘&a…

Karate轻松实现自动API测试

如果您想做自动API测试&#xff0c;但没有编程背景&#xff0c;那么你必须要给Karate一个机会&#xff01; Karate由Intuit作为开源工具发布。该工具旨在用于自动API测试&#xff0c;并具有使API测试变得轻而易举且实际上令人愉快的所有必需功能。 与需要大量编码的其他自动化…

项目综合实训,vrrp+bfd,以及策略路由的应用

目录 一&#xff0e; 项目需求 二&#xff0e; Visio设备画图 三&#xff0e; 设备选型 三&#xff0e;vlan规划 四&#xff0e;Ip地址规划 五&#xff0e;实验拓扑图 六&#xff0e;配置过程及结果 项目需求 1.S1作为VLAN10的主网关和根桥&#xff0c;S2作为v…

JavaScript从入门到精通系列第二十六篇:详解JavaScript中的Math对象

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥连接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

storage数据存储问题,不能存undefined

这篇文章分享一下自己使用sessionStorage遇到的一个小问题&#xff0c;以后遇到要避坑。 需求是easyui表格的单元格编辑&#xff0c;点击保存的时候会结束当前行的编辑&#xff0c;然后修改editingId&#xff08;当前编辑行记录的ID&#xff09;。 待解决问题 如图&#xff0c…

【Docker】Docker的应用包含Sandbox、PaaS、Open Solution以及IT运维概念的详细讲解

前言 作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&…

Spring MVC的常用注解(设置响应篇)

目录 1.返回静态页面 2.返回数据 3.返回HTML代码片段 4.返回json 5.设置状态码 6.设置Header &#xff08;1&#xff09;.设置 Content-Type &#xff08;2&#xff09;.设置其他Header 推荐先看前篇博客Spring MVC的常用注解&#xff08;接收请求数据篇&#xff09; 接收…

UE4/UE5 设置widget中text的字体Outline

想要在蓝图中控制Widget 中的 text字体&#xff0c;对字体outline参数进行设置。 但是蓝图中无法直接获取设置outline参数的方法&#xff1a; 没有outline相关的蓝图函数 该参数本身是在Font类别下的扩展&#xff0c;所以只要获取设置Font参数即可进行outline的设置 text连出…

11、插件注入到vue实例中

新建插件 nuxt-demo2\plugins\vue-inject.js import Vue from "vue"Vue.prototype.$test function (str) {console.log(str) }配置插件 nuxt-demo2\nuxt.config.js export default {...// Plugins to run before rendering page: https://go.nuxtjs.dev/config-…

python基于VGG19实现图像风格迁移

目录 1、原理 2、代码实现 1、原理 图像风格迁移是一种将一张图片的内容与另一张图片的风格进行合成的技术。 风格&#xff08;style&#xff09;是指图像中不同空间尺度的纹理、颜色和视觉图案&#xff0c;内容&#xff08;content&#xff09;是指图像的高级宏观结构。 实…

计算机网络重点概念整理-第四章 网络层【期末复习|考研复习】

计算机网络复习系列文章传送门&#xff1a; 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言四、网络层4.1 网络层功能4.1.1 电路交换、报文交换与分组交换4.1…

电商数据采集抓取封装数据、淘宝、天猫、京东等平台商品详情API接口参数详解

电商数据采集抓取数据、淘宝、天猫、京东等平台的电商数据抓取&#xff0c;网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电商数据…

【git】git拉取代码报错,fatal: refusing to merge unrelated histories问题解决

大家好&#xff0c;我是好学的小师弟。今天准备将之前写的代码&#xff0c;拉到新的工程文件夹(仓库)下面&#xff0c;用了pull命令&#xff0c;结果报错了&#xff0c;报错截图如下 $ git pull https://gitee.com/* #仓库地址 fatal: refusing to merge unrelated histor…

12、SpringCloud -- redis库存和redis预库存保持一致、优化后的压测效果

目录 redis库存和redis预库存保持一致问题的产生需求:代码:测试:优化后的压测效果之前的测试数据优化后的测试数据redis库存和redis预库存保持一致 redis库存是指初始化是从数据库中获取最新的秒杀商品列表数据存到redis中 redis的预库存是指每个秒杀商品每次成功秒杀之后…
最新文章