首页 > 其他分享 >一文掌握Containerd配置Harbor私有仓库

一文掌握Containerd配置Harbor私有仓库

时间:2024-09-09 09:55:36浏览次数:5  
标签:Harbor Containerd harbor zx 私有 containerd 镜像

一文掌握Containerd配置Harbor私有仓库

目录

1 概念

1.1 什么是Containerd

Containerd 是一个高效的容器运行时,是 Kubernetes 生态中最常用的容器运行时接口(CRI)。Containerd 提供了从镜像管理、容器执行到存储和网络等容器生命周期的核心功能,是容器生态系统的基础组件。

Containerd 的优点:

  • 轻量、稳定、可扩展。
  • 提供了与镜像仓库对接的 API 支持。
  • 支持 OCI(Open Container Initiative)镜像格式。

1.2 什么是Harbor

Harbor 是一个开源的企业级容器镜像仓库,支持镜像的管理、安全扫描、复制和身份验证等高级功能。相比于简单的 Docker Registry,Harbor 提供了丰富的企业级特性,例如基于角色的访问控制(RBAC)、镜像复制、漏洞扫描以及镜像签名等功能。

Harbor 常用功能:

  • 存储 Docker 和 OCI 镜像。
  • 镜像的安全扫描和签名。
  • 审计日志和访问控制。

1.3 什么是ctr和crictl

  • ctr: Containerd 自带的命令行工具,用于直接与 Containerd 交互,可以管理镜像、容器、任务等资源。它是一个较为底层的工具,适合调试和开发使用。
  • crictl: 是一个更高级别的 CLI 工具,专门为 Kubernetes 设计,用于通过 CRI 与容器运行时交互。它简化了与容器运行时的交互,能够与 Kubernetes 紧密集成。

2 配置 Containerd 使用 Harbor 作为私有仓库

❔ 说明:上文《一文读懂Harbor以及部署实践攻略》中,在测试环境已经部署好带https协议的Harbor,但是如果kubernetes环境直接拉取Harbor的镜像会出现以下报错。

如果你在Kubernetes使用未认证的Harbor私有仓库,可能会出现x509: certificate signed by unknown authority错误,这是因为你没有将Harbor的自签名证书或CA证书添加到Containerd的信任镜像列表中。

Events:
  Type     Reason     Age              From               Message
  ----     ------     ----             ----               -------
  Normal   Scheduled  3s               default-scheduler  Successfully assigned default/nginx-84b646ffc7-4qz2d to k8s-worker2
  Normal   Pulling    2s               kubelet            Pulling image "harbor.zx/hcie/nginx:stable"
  Warning  Failed     2s               kubelet            Failed to pull image "harbor.zx/hcie/nginx:stable": failed to pull and unpack image "harbor.zx/hcie/nginx:stable": failed to resolve reference "harbor.zx/hcie/nginx:stable": failed to do request: Head "https://harbor.zx/v2/hcie/nginx/manifests/stable": tls: failed to verify certificate: x509: certificate signed by unknown authority
  Warning  Failed     2s               kubelet            Error: ErrImagePull
  Normal   BackOff    1s (x2 over 2s)  kubelet            Back-off pulling image "harbor.zx/hcie/nginx:stable"
  Warning  Failed     1s (x2 over 2s)  kubelet            Error: ImagePullBackOff

将Harbor相关证书上传到Kubernetes的节点上

在所有Kubernetes节点上创建证书目录,your-harbor-domain 代替为你证书的CN:

sudo mkdir -p /etc/containerd/certs.d/your-harbor-domain/
# 例如:
sudo mkdir -p /etc/containerd/certs.d/harbor.zx/


将Harbor的ca证书复制到该目录中:

sudo cp /path/to/harbor.crt /etc/containerd/certs.d/your-harbor-domain/

# 例如:
cp /data/harbor.crt /etc/containerd/certs.d/harbor.zx/


更新Containerd配置

在Containerd的配置文件添加harbor私有仓库和指定信任的证书目录。

编辑Containerd的配置文件(如果没有,执行以下命令生成一个默认配置):

sudo containerd config default | sudo tee /etc/containerd/config.toml

在配置文件中指定证书路径, 修改 /etc/containerd/config.toml

  [plugins."io.containerd.grpc.v1.cri".registry.configs]
  # 如果针对某个项目使用,可以在harbor里创建的用户,并授权访问指定项目
    [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.zx".auth]
      username = "project-admin"
      password = "xxxx"

    [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.zx".tls]
      # 是否跳过证书认证
      insecure_skip_verify = false
      # 指定harbor的CA证书
      ca_file = "/etc/containerd/certs.d/harbor.zx/ca.crt"
      # 如果是双向认证,需要添加客户端的公钥和私钥
      #cert_file = "/etc/containerd/certs.d/harbor.zx/client.cert"
      #key_file = "/etc/containerd/certs.d/harbor.zx/client.key"

    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.zx"]
     # 私有仓库地址
        endpoint = ["https://harbor.zx"]

重启Containerd服务

应用配置并重启Containerd:

systemctl daemon-reload
systemctl restart containerd

验证配置是否成功

2.4.1 使用 ctr 验证

可以使用 ctr 工具来验证 Containerd 是否能够成功与 Harbor 仓库交互,执行以下命令拉取私有镜像:

sudo ctr image pull harbor.zx/library/stress:latest

如果以下输出还是报错

INFO[0000] trying next host                              error="failed to do request: Head \"https://harbor.zx/v2/library/stress/manifests/latest\": x509: certificate signed by unknown authority" host=harbor.zx
harbor.zx/library/stress:latest: resolving      |--------------------------------------|
elapsed: 0.1 s                   total:   0.0 B (0.0 B/s)
ctr: failed to resolve reference "harbor.zx/library/stress:latest": failed to do request: Head "https://harbor.zx/v2/library/stress/manifests/latest": x509: certificate signed by unknown authority

执行以下命令,再拉取镜像

sudo ctr image pull -k harbor.zx/library/stress:latest

❔ 说明: -k参数是跳过ssl证书校验

拉取成功输出:

[root@k8s-master1 ~]# sudo ctr image pull -k harbor.zx/library/stress:latest
harbor.zx/library/stress:latest:                                                  resolved       |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:b6144f84f9c15dac80deb48d3a646b55c7043ab1d83ea0a697c09097aaad21aa: done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:8d43371bad93504d09422b0aadb993110ae5313aead99b2796e64124f456eda6:    done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:df58d15b053d1ac1378fa685cbc1f71a0a1716a4c6f6f105df9c4d7b7f1ee5bb:   done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:63bc94deeb2884fd684a72d356164664538ee55cd82a9e65afe300a432092744:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 0.2 s                                                                    total:  739.0  (3.6 KiB/s)     
unpacking linux/amd64 sha256:b6144f84f9c15dac80deb48d3a646b55c7043ab1d83ea0a697c09097aaad21aa...
done: 1.411427987s

❔ 说明:如果镜像拉取成功,说明 Containerd 已成功配置 Harbor 仓库。

2.4.2 使用 crictl 验证:

如果 Kubernetes 使用的是 Containerd 作为CRI,可以通过 crictl 来验证配置,执行以下命令:

 crictl pull  harbor.zx/library/stress:latest

拉取成功输出:

Image is up to date for sha256:df58d15b053d1ac1378fa685cbc1f71a0a1716a4c6f6f105df9c4d7b7f1ee5bb

❔ 说明: 如果镜像成功下载并显示在结果中,则表明 Harbor 已正确配置为私有镜像仓库。

3 配置Harbor默认Secret并部署验证

❔ 说明: 以下是整个配置默认仓库的流程:

为了演示方便直接使用default命令空间和default用户, 第2、4步骤是k8s默认完成。

步骤操作
1创建一个 Secret 对象
2创建一个 ServiceAccount 对象
3将 ServiceAccount 与 Secret 对象关联
4在 Pod 使用 ServiceAccount 对象

3.1 创建私有仓库的Secret

创建docker-registry的secret,执行以下命令

kubectl create secret docker-registry myharbor --docker-server=https://harbor.zx \
--docker-username=admin \
--docker-password=admin12345 \
[email protected]

❔ 参数说明:

参数说明
docker-registryk8s内置参数,表示镜像仓库类型的secret
myharborsecret自定义名称
–docker-server镜像仓库地址
–docker-username镜像仓库登录用户
–docker-password镜像仓库登录密码
–docker-email通知email地址

3.2 将镜像仓库的 Secret 添加到服务账号

接下来更改默认命令空间的默认服务账号,将该 Secret 用作 imagePullSecret,执行以下命令。

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myharbor"}]}'

3.3 部署Deployment测试是否配置成功

编辑test.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: tomcat
  name: tomcat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: tomcat
    spec:
      nodeName: k8s-master1
      containers:
      - image: harbor.zx/hcie/tomcat:8.0
        name: tomcat
        ports:
        - containerPort: 80
          hostPort: 888
          name: http
        resources:
        imagePullPolicy: Always
      restartPolicy: Always

创建Deployment

kubectl apply -f test.yaml

查看详细信息

Events:
  Type     Reason   Age                    From     Message
  ----     ------   ----                   ----     -------
  Normal   Pulled   6m23s                  kubelet   Successfully pulled image "harbor.zx/hcie/tomcat:8.0" in 225m s (225ms including waiting)
  Normal   Pulled   6m14s                  kubelet  Successfully pulled image "harbor.zx/hcie/tomcat:8.0" in 162ms (162ms including waiting)
  Normal   Pulled   5m57s                  kubelet  Successfully pulled image "harbor.zx/hcie/tomcat:8.0" in 148ms (148ms including waiting)
  Normal   Created  5m22s (x4 over 6m23s)  kubelet  Created container tomcat
  Normal   Started  5m22s (x4 over 6m23s)  kubelet  Started container tomcat

❔ 说明: k8s事件说明可以通过secret直接拉取harbor私用仓库的镜像。

标签:Harbor,Containerd,harbor,zx,私有,containerd,镜像
From: https://blog.csdn.net/u013522701/article/details/142045913

相关文章

  • 从零搭建 Docker 私有库
    对于涉及机密的公司,不可能提供镜像给公网中的镜像仓库,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。DockerRegistry是官方提供的工具,可以用于构建私有镜像仓库。‍搭建私有库私有库的搭建也很简单,也是下载一个镜像,然后run就可以了。下载镜像:$doc......
  • VoceChat - 发现私有云社交的魅力
    VoceChat使用反馈:发现私有云社交的魅力 在这个信息浩如烟海的时代,如何保持有效的沟通与信息共享,成为了我们每一个人都需要面对的挑战。很高兴在这段时间里,体验了VoceChat这款支持独立部署的个人云社交媒体聊天服务。作为一个高度灵活且保护用户数据隐私的通讯工具,VoceChat的表......
  • Harbor有哪些组件
    Harbor是一个开源的容器镜像仓库,主要用于存储和分发Docker镜像。它在传统的DockerRegistry基础上进行了增强,提供了许多企业级功能。以下是Harbor的主要组件:1.Core描述:Harbor的核心组件,负责处理所有的API请求、身份验证、权限管理等。功能:管理用户、项目、镜像等基......
  • Harbor高可用怎么实现
    要实现Harbor的高可用性(HA),需要考虑多个组件的冗余和负载均衡。以下是实现Harbor高可用的一些关键步骤和最佳实践:1.使用多个Harbor实例描述:部署多个Harbor实例,每个实例可以运行在不同的节点上。实现方式:使用负载均衡器将流量分配到各个Harbor实例。确保每个实例......
  • 电子电气架构---私有总线通信和诊断规则
    电子电气架构—私有总线通信和诊断规则我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益......
  • Kubernetes 1.25 containerd 环境部署 SuperMap iManager
    超图官网目提供的Kubernetes版本为1.20版本,容器运行时为docker本次部署使用已有的Kubernetes1.25版本集群,容器运行时为containerdKubernetes,containerd部署请自行了解,本次不做介绍,下面介绍在此环境上如何部署iManager11i并创建云套件1.环境介绍虚拟机CPU......
  • 【K8s】专题十三:Kubernetes 容器运行时之 Docker 与 Containerd 详解
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口Linux专栏 | Docker专栏 | Kubernetes专栏往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决方法【Docker】(全网首发)Kyli......
  • 构建私有CA和证书
    一、准备两台虚拟机192.168.252.148CA192.168.252.149客户端二、构建私有CA192.168.252.148CA安装openssl1.检查是否存在rpm-qaopenssl2.安装或者更新opensslyuminstallopensslopenssl-devel-y查看CA相关配置/etc/pki/tls/openssl.cnf这个文件是CA的配置......
  • 在私有化过程中不要忽视LLMs的双重逻辑能力:医学领域的数据密集型分析
    链接:https://arxiv.org/abs/2309.04198原标题:Don’tIgnoreDualLogicAbilityofLLMswhilePrivatizing:AData-IntensiveAnalysisinMedicalDomain日期:Submittedon8Sep2023摘要大量的研究致力于通过喂养特定领域的数据,将通用领域的LargeLanguageModels......
  • 有手就会之使用Dify构建RAG聊天应用(基于私有知识库和搜索引擎)
    之前我的文章里写的是通过langchain来构建RAG应用,对于很多人来说。langchain作为一个框架上手难度大,代码不够直观。但是通过dify你将学会可视化搭建工作流。什么是dify?Dify是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(BackendasService)和LLMOps的......