k8s新版本使用container而不是docker
使用 Harbor 仓库作为 Kubernetes 集群私有仓库
Harbor 仓库信息
- 内网地址:
hub.rainsc.com - IP 地址:
192.168.66.100
问题背景
在许多版本的教程中,会建议在 Docker 的配置中添加忽略证书的列表。然而,截至 2024 年 8 月 24 日,这些教程支持的 Kubernetes 版本已经无法直接安装。一方面是因为这些教程大多基于 CentOS 7,使用的是 4.4 内核,而 CentOS 相关的所有镜像源都已经删除了内核相关文件。
当前我的内核版本是:
[root@master01 ~]# uname -a
Linux master01 5.14.0-496.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Aug 12 20:37:54 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
我直接按照当前内核支持的版本安装了最新的 kubectl 工具:
[root@master01 ~]# kubectl version
Client Version: v1.29.8
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.29.8
[root@master01 ~]# kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.containerRuntimeVersion}'
containerd://1.7.20 containerd://1.7.20 containerd://1.7.20
容器运行时的变化
Kubernetes 并不直接管理容器运行时,而是通过 kubelet 与容器运行时进行交互。在不同的 Kubernetes 版本中,支持的容器运行时有所变化:
Kubernetes 1.20 及之前版本
- 默认容器运行时: Docker
- Docker Shim: Kubernetes 通过 Docker Shim(dockershim)与 Docker 交互。
Kubernetes 1.21 至 1.23
- 容器运行时: Kubernetes 1.21 开始,逐步弃用 Docker Shim,鼓励使用其他 CRI 兼容的容器运行时。
- 推荐替代容器运行时:
containerd和CRI-O。
Kubernetes 1.24 及之后版本
- 弃用 Docker Shim: Docker Shim 被正式弃用,不再支持通过 Docker Shim 与 Docker 交互。
- 推荐容器运行时:
containerd和CRI-O。
Harbor 部署及问题解决
在环境中,我在 192.168.66.100 上部署了 Docker 版本的 Harbor。尝试使用以下命令创建 Pod 时遇到问题:
kubectl run nginx-deployment --image=hub.rainsc.com/library/mynginx:v1 --port=80
该操作提示证书错误,尝试将 Harbor 的证书添加到受信任列表,并修改 Docker 配置文件,但无效。
类似于下面这段 可能不完全一样 因为已经救活了 就不去作死了
下面这个错误展示的是配置文件写错了 但是ai会直接告诉你证书问题 相关tls之类的提示全都说证书问题 千万别碰证书 没有意义
[root@master01 ~]# crictl --runtime-endpoint /run/containerd/containerd.sock pull hub.rainsc.com/library/helloworld:v1
I0824 19:51:33.643312 65083 util_unix.go:103] "Using this endpoint is deprecated, please consider using full URL format" endpoint="/run/containerd/containerd.sock" URL="unix:///run/containerd/containerd.sock"
E0824 19:51:33.691725 65083 remote_image.go:171] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"hub.rainsc.com/library/helloworld:v1\": failed to resolve reference \"hub.rainsc.com/library/helloworld:v1\": failed to do request: Head \"https://hub.rainsc.com/v2/library/helloworld/manifests/v1\": tls: failed to verify certificate: x509: certificate signed by unknown authority" image="hub.rainsc.com/library/helloworld:v1"
FATA[0000] pulling image: rpc error: code = Unknown desc = failed to pull and unpack image "hub.rainsc.com/library/helloworld:v1": failed to resolve reference "hub.rainsc.com/library/helloworld:v1": failed to do request: Head "https://hub.rainsc.com/v2/library/helloworld/manifests/v1": tls: failed to verify certificate: x509: certificate signed by unknown authority
解决方案
由于 Kubernetes 1.24 之后不再使用 Docker,而是使用 containerd,我们需要正确配置 containerd 的 config.toml 文件。
- 编辑
/etc/containerd/config.toml文件,找到[plugins."io.containerd.grpc.v1.cri".registry.auths]配置节,添加以下内容:
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."hub.rainsc.com".tls]
insecure_skip_verify = true
[plugins."io.containerd.grpc.v1.cri".registry.configs."hub.rainsc.com".auth]
username = "admin"
password = "Harbor12345"
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."hub.rainsc.com"]
endpoint = ["http://hub.rainsc.com"]
- 编辑
/var/lib/kubelet/config.yaml文件,指定containerRuntimeEndpoint:
containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
- 绑定
containerd容器给crictl
这个文件默认是不存在的 需要手动创建后填
echo "runtime-endpoint: unix:///run/containerd/containerd.sock" | sudo tee /etc/crictl.yaml > /dev/null
[root@node02 ~]# cat /etc/crictl.yaml
cat: /etc/crictl.yaml: 没有那个文件或目录
[root@node02 ~]# echo "runtime-endpoint: unix:///run/containerd/containerd.sock" | sudo tee /etc/crictl.yaml > /dev/null
[root@node02 ~]# cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
- 配置完成后,使用以下命令拉取镜像:
[root@master01 ~]# crictl pull hub.rainsc.com/library/helloworld:v1
Image is up to date for sha256:6974669be52b12a9103072cbad3e13fbf119b76aa09747f19a821a5eaad34be1
- 创建 Pod:
[root@master01 ~]# kubectl run helloworld --image=hub.rainsc.com/library/helloworld:v1 --port=8123
pod/helloworld created
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld 1/1 Running 0 9s
总结
通过正确配置 containerd 和 Kubernetes 配置文件,解决了由于弃用 Docker Shim 引发的镜像拉取问题。现在可以正常使用 Harbor 仓库来创建和管理 Pod。
k8s新版本使用container而不是docker的更多相关文章
- K8S系列第三篇(Docker网络)
目录 docker 网络 Docker 的四种网络模 一.网络基础 1.网络名称空间介绍 2.创建一个命名空间 1)Veth设备对 2)Veth设备操作 1> 创建Veth设备对 2> 绑 ...
- k8s 新版本 部署 Ingress-nginx controller
k8s 新版本 部署 Ingress-nginx controller 本篇主要记录一下 k8s 新版本 1.23.5 中如何搭建 ingress controller 以及里面的注意项 新版本和老版 ...
- k8s 使用 Init Container 确保依赖的服务已经启动
k8s 使用 Init Container 确保依赖的服务已经启动 Intro 最近 helm 3 正式发布了,dotnetcore 3.1 也正式发布了,最近打算把我的活动室预约项目做一个升级,项目 ...
- Visual Studio container tools require Docker to be running
处理项目在生成时报错"Visual Studio container tools require Docker to be running" 最初win10上安装docker,项目 ...
- Docker & k8s 系列一:快速上手docker
Docker & k8s 系列一:快速上手docker 本篇文章将会讲解:docker是什么?docker的安装,创建一个docker镜像,运行我们创建的docker镜像,发布自己的docke ...
- Docker&K8S学习笔记(一)—— Docker安装
最近一年在工作上经常使用Docker与K8S,除了利用其打镜像,部署服务外,还基于Docker与K8S开发了一套CICD流水线平台,为了加深相关知识点的理解,所以从今天开始会定期更新学习笔记,本套学习 ...
- docker无法删除镜像,Error: No such container,附docker常用命令
最近打算删除掉docker镜像但是发现有几个镜像就是删除不了,加了-f强制删除也不行,一直报Error: No such container的错误,最后终于找到了办法直接删除文件,步骤如下: 切换到r ...
- Killing container with id docker:*******:Container failed liveness probe.. Container will be killed and recreated.
我在工作中出现此问题是因为容器内存溢出,启动失败. 归根结底应该是容器启动失败了,k8s会一直尝试
- 如何查看运行的docker container 的 执行 docker run的命令
前言 就是我备份了一下 mysql_container, 然后我想启用 新的备份的mysql_container 但是之前的docker run image xxxxxx这些都已经忘记了 我想找一下之 ...
- Windows Server 2019 container容器化-Docker安装
一.启用服务器Hyper-V,Containers特性 Install-WindowsFeature -Name Hyper-V,Containers -IncludeAllSubFeature -I ...
随机推荐
- .NET 个人博客-给文章添加上标签
个人博客-给文章添加上标签 优化计划 置顶3个且可滚动或切换 推荐改为4个,然后新增历史文章,将推荐的加载更多放入历史文章,按文章发布时间降序排列. 标签功能,可以为文章贴上标签 推荐点赞功能 本篇文 ...
- Linux基本编程环境安装
前言 可以采用组合式安装,如:https://oneinstack.com/ 选择好要安装的,然后复制安装命令就可以一键搞定很多东西了 VMware安装Centos7 按照物理机CPU实际情况,选择处 ...
- AIGC的行业发展
1. AIGC的行业发展 AIGC(Artificial Intelligence Generated Content,人工智能生成内容)是利用人工智能技术来自动生成内容的一种新型内容创作方式.它基于 ...
- CentOS中增加网络连接数的方法
CentOS默认对外访问,发起的TCP链接总数小于28232个. 可以通过以下命令的结果计算出来 $ cat /proc/sys/net/ipv4/ip_local_port_range 我这里得到的 ...
- JavaSE进阶核心之class类
Java顶级对象之Object 什么是Object类 Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入 Object类是所有java类的 ...
- 痞子衡嵌入式:瑞萨RA8系列高性能MCU开发初体验
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是瑞萨RA8系列高性能MCU开发上手体验. 我们知道瑞萨半导体的通用 MCU 产品线主要包含基于自有内核 8/16bit RL78 系列以 ...
- [oeasy]python0079_控制序列_光标位置设置_ESC_逃逸字符_CSI
光标位置 回忆上次内容 上次我们研究的比较杂 类型转化 进制转化 捕获异常 版本控制 生成帮助文档 变量的常用类型 变量的生命周期控制 数据类型主要研究了两个 字符串 str 整型数字 int ...
- Python 基于pymongo操作Mongodb学习总结
实践环境 Python 3.6.4 pymongo 4.1.1 pymongo-3.12.3-cp36-cp36m-win_amd64.whl 下载地址:https://pypi.org/simple ...
- 跟着ChatGPT学习设计模式 - 工厂模式
1. 前言 在工作过程中,越发觉得设计模式的重要性.经常会有人说工作5年的人,大学生随便培训1-2月也能做同样的工作,没错,大学生的确可以做. 但其写的代码,可维护性.可扩展性.添加新功能时方便还是简 ...
- LVM综合实验
实验目标 创建并管理一个 LVM 卷组 (VG). 在卷组中创建.扩展和缩小逻辑卷 (LV). 创建和使用快照. 实验环境 Linux 服务器 三个可用的磁盘分区: /dev/sdb1, /dev/s ...