Linux——Harbor: 容器镜像的存储

news2025/1/18 8:56:26

K8s 如何通过harbor 拉取镜像?

K8S 在那些情况下需要进行镜像的拉取?

  1. 在需要进行新的pod的调度时,基于镜像拉取策略,完成镜像的获取:
    1. Always:  在任何情况下都需要重新拉取镜像
      • 即使设置为总是进行镜像拉取,也不代表每一次都需要重新进行镜像的完成拉取
      • 容器镜像的层次结构决定了镜像的每一层都有一个唯一不重复的ID
      • 每一次进行镜像拉取的操作时,都需要对比本地和仓库中镜像层的ID,只有在ID 不一致的情况下,才会重新拉取不一致的层
      • 主要的使用场景,pod的镜像默认使用最新版镜像,即tag为latest,而tag为latest的镜像会不断更新,在最新版镜像更新的时候,重新拉取镜像。
    2. IfNotPresent: 在需要调度pod的节点上不存在镜像的情况下,才会进行镜像的拉取
  2. 过程如下:
    1. 客户端发出后指令要求调度一个pod,并制定了pod的镜像
    2. K8S的APIserver将pod调度的指令转发给对应的控制器
    3. 控制器创建pod运行需要的基本配置
    4. 调度器决定新创建的pod应该在那个工作节点上运行
    5. 对应工作节点上的kubelet 来完成pod的最终的创建,这里就包括拉取镜像、启动容器等
    6. Kubelet 对应的容器运行时(OCI) 使用的是 containerd 服务,
  3. 如果k8s 需要从harbor中拉取镜像重点是,配置各个工作节点使用harbor。

配置过程如下:

  1. 需要在工作节点上,基于工作节点使用的OCI ,配置OCI 使用harbor的tsl证书
  2. 如果需要拉取私有仓库的镜像,那么还需要提前设置好,登录仓库使用的用户名密码的信息

在k8s的工作节点:

[root@node1 ~]# vim +162 /etc/containerd/config.toml

// 指定仓库的配置路径,该路径下基于不同仓库对应的域名和IP地址创建子目录,以保存不同仓库的配置和访问证书等。

[root@node1 ~]# mkdir /etc/containerd/certs.d/harbor.mydomain.com -p
[root@node1 ~]# vim /etc/containerd/certs.d/harbor.mydomain.com/hosts.toml
[root@node1 ~]# cat /etc/containerd/certs.d/harbor.mydomain.com/hosts.toml
server = "https://harbor.mydomain.com"

[host."https://harbor.mydomain.com"]
capabilities = ["pull", "resolve", "push"]
ca = "ca.crt"
client = [["harbor.mydomain.com.cert","harbor.mydomain.com.key"]]

在harbor节点上分发证书:
[root@harbor certs]# scp ca.crt root@192.168.110.11:/etc/containerd/certs.d/harbor.mydomain.com/
root@192.168.110.11's password:
ca.crt                                                                                                        100% 2065     1.2MB/s   00:00
[root@harbor certs]# scp harbor.mydomain.com.key  root@192.168.110.11:/etc/containerd/certs.d/harbor.mydomain.com/
root@192.168.110.11's password:
harbor.mydomain.com.key                                                                                       100% 3268     1.8MB/s   00:00
[root@harbor certs]# scp harbor.mydomain.com.cert   root@192.168.110.11:/etc/containerd/certs.d/harbor.mydomain.com/
root@192.168.110.11's password:
harbor.mydomain.com.cert                                                                                      100% 2179     1.1MB/s   00:00

返回k8s 工作节点,重启服务:
[root@node1 ~]# systemctl restart containerd.service

将改变配置分配给其他工作节点:
首先现在其他工作节点上创建配置目录
[root@node2 ~]# mkdir /etc/containerd/certs.d/harbor.mydomain.com -p

在node1上进行配置文件变更的同步:
[root@node1 ~]# scp /etc/containerd/certs.d/harbor.mydomain.com/* root@node2:/etc/containerd/certs.d/harbor.mydomain.com/

Node2 检查文件是否同步完成:
[root@node2 ~]# ls /etc/containerd/certs.d/harbor.mydomain.com/
ca.crt  harbor.mydomain.com.cert  harbor.mydomain.com.key  hosts.toml
[root@node2 ~]# systemctl restart containerd.service

返回k8s 控制节点:

  1. 创建harbor仓库访问记录
    [root@control ~]# source .kube/k8s_bash_completion
    [root@control ~]# kubectl create secret docker-registry harbor-admin-registry \
    > --docker-server=https://harbor.mydomain.com \
    > --docker-username=admin \
    > --docker-password=Harbor12345
    

  2. 将harbor仓库域名解析同步到其他节点
  3. [root@control ~]# vim /etc/hosts

    # 添加一行即可

[root@control ~]# scp /etc/hosts root@node1:/etc/hosts
root@node1's password:
hosts                                                                                                         100%  259   463.5KB/s   00:00
[root@control ~]# scp /etc/hosts root@node2:/etc/hosts
root@node2's password:
hosts                                                                                                         100%  259   259.2KB/s   00:00

3.部署一个使用harbor仓库中镜像的应用

[root@control ~]# vim  nginx-deployment.yml
[root@control ~]# cat  nginx-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets:
        - name: harbor-admin-registry
      dnsPolicy: ClusterFirst
      containers:
      - name: nginx
        image: harbor.mydomain.com/myproject/nginx:1.19.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

返回harbor仓库确保仓库中存在上面配置文件指定的镜像:

如果没有的话,可以选择上传:

在harbor节点上,进行一下操作:

[root@harbor harbor]# docker pull nginx:1.19.1
[root@harbor harbor]# docker tag nginx:1.19.1 harbor.mydomain.com/myproject/nginx:1.19.1
[root@harbor harbor]# docker push harbor.mydomain.com/myproject/nginx:1.19.1

#报错可能是缺少认证

# 查看一下是不是有用户的认证信息

[root@harbor harbor]# ls ~/.docker/config.json 
/root/.docker/config.json
[root@harbor harbor]# cat ~/.docker/config.json 
{
	"auths": {
		"harbor.mydomain.com": {
			"auth": "YWRtaW46SGFyYm9yMTIzNDU="
		}
	}
}
# 没有的话,需要登录到仓库,来生成认证信息缓存
[root@harbor harbor]# docker login harbor.mydomain.com
# 按照提示输入用户名 密码即可



回到控制节点:
[root@control ~]# kubectl get deployments.apps
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
test-nginx   3/3     3            3           2d
[root@control ~]# kubectl apply -f nginx-deployment.yml
deployment.apps/nginx-deployment created
[root@control ~]# kubectl get pods
NAME                                READY   STATUS         RESTARTS      AGE
nginx-deployment-6f7b4fb9b9-cxnrm   0/1     ErrImagePull   0             7s  // 报错的原因是第一次的配置文件存在错误,修正错误后,稍等片刻pod会自动恢复
nginx-deployment-6f7b4fb9b9-mbqgn   0/1     ErrImagePull   0             7s
nginx-deployment-6f7b4fb9b9-zkjsm   0/1     ErrImagePull   0             7s
test-nginx-bb78867bf-7drv4          1/1     Running        4 (60m ago)   2d
test-nginx-bb78867bf-fgd5l          1/1     Running        3 (19h ago)   2d
test-nginx-bb78867bf-gzd9v          1/1     Running        3 (19h ago)   2d

修正错误后:
[root@control ~]# kubectl get pods  -o wide
NAME                                READY   STATUS             RESTARTS      AGE     IP             NODE    NOMINATED NODE   READINESS GATES
nginx-deployment-6f7b4fb9b9-cxnrm   1/1     Running            0             2m54s   10.244.1.112   node1   <none>           <none>
nginx-deployment-6f7b4fb9b9-mbqgn   0/1     ImagePullBackOff   0             2m54s   10.244.2.133   node2   <none>           <none>
nginx-deployment-6f7b4fb9b9-zkjsm   0/1     ImagePullBackOff   0             2m54s   10.244.2.134   node2   <none>           <none>
test-nginx-bb78867bf-7drv4          1/1     Running            4 (63m ago)   2d      10.244.2.131   node2   <none>           <none>
test-nginx-bb78867bf-fgd5l          1/1     Running            3 (19h ago)   2d      10.244.1.102   node1   <none>           <none>
test-nginx-bb78867bf-gzd9v          1/1     Running            3 (19h ago)   2d      10.244.1.101   node1   <none>           <none>
[root@control ~]# kubectl get pods
NAME                                READY   STATUS    RESTARTS      AGE
nginx-deployment-6f7b4fb9b9-cxnrm   1/1     Running   0             3m27s
nginx-deployment-6f7b4fb9b9-mbqgn   1/1     Running   0             3m27s
nginx-deployment-6f7b4fb9b9-zkjsm   1/1     Running   0             3m27s
test-nginx-bb78867bf-7drv4          1/1     Running   4 (64m ago)   2d
test-nginx-bb78867bf-fgd5l          1/1     Running   3 (19h ago)   2d
test-nginx-bb78867bf-gzd9v          1/1     Running   3 (19h ago)   2d

请尝试更新一下目前pod的镜像,进行一次滚动更新。

延申: 目前harbor 与K8S 分别部署到不同的主机中,或者换一句话说 harbor没有直接在k8s平台来运行,如果需要将harbor部署到K8S平台中,可以直接通过控制器部署,也可以结合专门的部署工具helm 来提高部署的自动化程度。Harbor不管是通过docker compose 还是通过 k8s 平台部署,都需要通过重点考虑存储的持久化问题,毕竟谁也不想平台断电或者重启后,原本保存的镜像不见了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ERP系统是什么?ERP系统如何与数据库对接?

ERP系统的定义 1.企业ERP系统标准的定义来自于其英文原意&#xff0c;即企业资源规划(Enterprise Resource Planning)。企业资源计划系统是一种集成的软件系统&#xff0c;旨在帮助企业管理其资源。它可以协调各种不同的业务流程&#xff0c;例如供应链管理、采购、库存管理、…

arm架构ceph pacific部署

背景 合作伙伴实验室的华为私有云原来使用单点的nfs做为存储设备&#xff0c;现有两方面考量&#xff0c;业务需要使用oss了&#xff0c;k8s集群及其他机器也需要一套可扩展的分布式文件系统 部署ceph 初始机器配置规划 IP配置主机名Role10.17.3.144c8g1T数据盘ceph-node01…

2-122 文章复现:基于matlab的多智能体系统一致性算法的电力系统分布式经济调度策略

文章复现&#xff1a;基于matlab的多智能体系统一致性算法的电力系统分布式经济调度策略&#xff0c;应用多智能体系统中的一致性算法&#xff0c;以发电机组的增量成本和柔性负荷的增量效益作为一致性变量&#xff0c;设计一种用于电力系统经济调度的算法&#xff0c;通过分布…

透过3大海外案例,看百亿中老年眼镜市场创新发展方向

国内老花镜市场容量为342.15亿元 前言 全球人口老龄化的加速推进&#xff0c;中老年群体正逐渐成为消费市场中不可忽视的重要力量&#xff0c;每一个细微的市场变化都映射着社会结构与消费需求的深刻转型。 其中&#xff0c;中老年眼镜市场的新场景、新需求不断涌现&#xf…

西门子S7-200 SMART选型指南之产品订货信息

提供了S7-200 SMART控制器的产品订货号列表&#xff0c;用户可以根据订货号准确选择所需的产品型号。 S7-200SMART CPU 订货号 产品选型或方案确认需求需要结合工艺、应用场合等因素综合考虑&#xff0c;最终方案或订货号请与西门子销售或经销商确认。本文列出的订货号仅供参考…

Vite + Vue3 使用 cdn 引入依赖,并且把外部 css、js 文件内联引入

安装插件 pnpm i element-plus echarts axios lodash -S在 vite.config.js 引用 注意事项&#xff1a;element-plus 不能在 vite.config.js 中使用按需加载&#xff0c;需要在 main.js 中全局引入&#xff1b; import { resolve } from path import { defineConfig } from v…

晶振电路的设计一定要和单片机靠近,路线尽量短

晶振作为同步单片机全部工作的核心&#xff0c;首先要求高度可靠和稳定&#xff0c;所以离芯片越近&#xff0c;引线越短&#xff0c;受外来干扰就越小&#xff1b; 其次&#xff0c;一般晶振部分是整个电路板中频率最高的部分&#xff0c;也就是高频辐射最严重的部分&#xf…

Redis集群相关

目录 一、Redis主从集群 主从数据同步原理 全量同步 1&#xff09;为什么是基本一致而不是完全一致呢&#xff1f; 2&#xff09;上述过程还有一个问题&#xff0c;怎么判断是不是第一次同步&#xff1f; 增量同步 1&#xff09;master节点怎么知道slave节点与自己的数据…

关于Git Bash中如何定义alias

一、在一次临时Bash会话中使用alias 在Bash中直接输入alias xxdddd&#xff0c;xx为对应要执行的命令的缩写&#xff0c;dddd为要执行的命令&#xff0c;如alias ddcd /d&#xff0c;输入完成后&#xff0c;在Bash中输入dd&#xff0c;即可切换至D盘。 此种设置方式&#xff…

JavaSE——集合2:List(Iterator迭代器、增强for、普通for循环遍历集合)

目录 一、List (一)List接口基本介绍 二、List接口的常用方法 三、List集合的三种遍历方式 四、小练习——使用冒泡排序遍历集合 一、List (一)List接口基本介绍 List接口是Collection接口的子接口 public interface List<E> extends Collection<E> List集…

华大基因与NRL完成技转合作,为中东家庭提供更优质的产前筛查方案

今年年初&#xff0c;华大基因与中东地区最大的美国病理学家学会&#xff08;CAP&#xff09;认证实验室集团National Reference Laboratory&#xff08;NRL&#xff09;&#xff0c;顺利完成了无创产前基因检测技术&#xff08;NIPT&#xff09;技转合作&#xff0c;并向NRL实…

AI先行者工具撰写的烧脑短篇,你不可错过

以下文字是我用ai先行者所创造的文字。我就输入烧脑故事四个关键字 昨晚&#xff0c;我像往常一样刷着朋友圈&#xff0c;准备结束一天的工作前放松一下。突然间&#xff0c;我的好友小林发了一条状态&#xff1a;“如果有人发现我不见了&#xff0c;请不要报警。”这句话配上…

【JAVA毕业设计】基于Vue和SpringBoot的加油站管理系统

本文项目编号 T 003 &#xff0c;文末自助获取源码 \color{red}{T003&#xff0c;文末自助获取源码} T003&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

金蝶云星空与金蝶云星空对接集成采购订单查询连通采购订单新增(采购订单)

金蝶云星空与金蝶云星空对接集成采购订单查询连通采购订单新增(采购订单) 对接系统金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用…

Prometheus+Grafana 监控 Kubernetes

文章目录 一、Prometheus介绍二、Prometheus组件与监控三、Prometheus基本使用&#xff1a;怎么来监控四、Kubernetes监控指标五、Prometheus的基本使用&#xff1a;部署1.基于docker部署prometheusgrafana2. 查看prometheus配置文件3. 监控Linux服务器3.1找到自己相应的系统去…

php外卖霸王餐独立小程序 霸王餐源码 功能用户分销 会员系统 自用/推广私域运营

前言 外卖霸王餐小程序是一种结合了外卖点餐和优惠返利功能的微信小程序&#xff0c;旨在为用户提供一种便捷的点餐体验和优惠福利。 用户以5-10元吃到原价15-25元的外卖&#xff0c;底层逻辑是帮外卖商家做店铺推广&#xff0c;解决新店基础销量、老店增加单量、品牌打万单店…

Apache Kafka 使用示例

Kafka快速入门指南 微信公众号&#xff1a;阿俊的学习记录空间小红书&#xff1a;ArnoZhangwordpress&#xff1a;arnozhang1994博客园&#xff1a;arnozhangCSDN&#xff1a;ArnoZhang1994 第一步&#xff1a;获取Kafka 下载2.13-3.8.0版本的Kafka版本并解压&#xff1a; $…

2d实时数字人聊天语音对话使用案例,对接大模型

参看: https://github.com/wan-h/awesome-digital-human-live2d 电脑环境: ubuntu 1060ti 下载: git clone https://github.com/wan-h/awesome-digital-human-live2d.gitdocker部署; cd awesome-digital-human-live2d docker-compose -f docker-compose-quickStart.ya…

React 子组件调用父组件的方法,以及互相传递数据

<script type"text/babel" data-type"module"> import React, { StrictMode, useState } from react; import { createRoot } from react-dom/client;const ParentComponent () > {const [message, setMessage] useState("")//父组件…

代理模式、BigDecimal详解

代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能 代理模式的主要作用是扩展目标对象的功…