Kubernetes-1.28.2 集群介绍及搭建

一、Kubernetes 概述

1、什么是Kubernetes?

  • K8S 的全称为 Kubernetes。用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。
  • 1.23.10 以前(包含)docker 1.24.0 containerd 中间件 k8s 和 docker dockers-shim
  • 可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。
  • K8S是Google开源的容器集群管理系统,在Docker等容器技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
  • K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。
  • 云原生基金会(CNCF)于2015年12月成立,隶属于Linux基金会。CNCF孵化的第一个项目就是Kubernetes,随着容器的广泛使用,Kubernetes已经成为容器编排工具的事实标准

2、Kubernetes 的整体架构

img

img

Kubernetes属于主从分布式架构,主要由Master Node和Worker Node组成(高可用的集群中,Master和Work一般都是多节点构成,可以是),以及包括客户端命令行工具kubectl和其它附加项。

  • Master Node:作为控制节点,对集群进行调度管理;Master Node由API Server、Scheduler、Cluster State Store和Controller-Manger Server所组成;
  • Worker Node:作为真正的工作节点,运行业务应用的容器;Worker Node包含kubelet、kube proxy和Container Runtime;
  • kubectl:用于通过命令行与API Server进行交互,而对Kubernetes进行操作,实现在集群中进行各种资源的增删改查等操作;
  • Add-on:是对Kubernetes核心功能的扩展,例如增加网络和网络策略等能力。
  • repliceation 用于伸缩副本数量
  • endpoint 用于管理网络请求
  • scheduler 调度器

官网:https://kubernetes.io

GitHub:https://github.com/kubernetes/kubernetes

2、Kubernetes特性

  • 弹性伸缩:使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
  • 自我修复:在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
  • 服务发现和负载均衡:K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
  • 自动发布(默认滚动发布模式)和回滚:K8S采用滚动策略更新应用,一个更新一个Pod,而不是同时删除所有的Pod,如果更新过程中出现问题,将回滚更改,确保升级不收影响业务。
  • 集中化配置管理和密钥管理:管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性,并可以将一些常用的配置存储在K8S中,方便应用程序使用。
  • 存储编排:支持外挂存储并对外挂存储资源进行编排,挂载外部存储系统,无论是来自本地存储,公有云(如:AWS),还是网络存储(如:NFS、Glusterfs、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
  • 任务批量处理运行:提供一次性任务,定时任务,满足批量数据处理和分析的场景。

3、Kubernetes主要功能

  • 跨主机编排容器。
  • 更充分地利用硬件资源来最大化地满足企业应用的需求。
  • 控制与自动化应用的部署与升级。
  • 为有状态的应用程序挂载和添加存储器。
  • 线上扩展或缩减容器化应用程序与它们的资源。
  • 声明式的容器管理,保证所部署的应用按照我们部署的方式运作。
  • 通过自动布局、自动重启、自动复制、自动伸缩实现应用的状态检查与自我修复。
  • 为多个容器提供服务发现和负载均衡,使得用户无需考虑容器IP问题。

二、Kubernetes 集群架构组件

  • K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。
  • 主节点一般被称为 Master 节点,master节点上有 apiserver、controller-manager、scheduler 以及使用 etcd 做Kubernetes集群存储;而从节点则被称为 Worker Node 节点,node节点上有 kubelet、kube-proxy、容器引擎(比如docker),每个 Node 都会被 Master 分配一些工作负载。
  • Master 组件可以在群集中的任何计算机上运行,但建议 Master 节点占据一个独立的服务器。因为 Master 是整个集群的大脑,如果 Master 所在节点宕机或不可用,那么所有的控制命令都将失效。除了 Master,在 K8S 集群中的其他机器被称为 Worker Node 节点,当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点上去。

1、Master 组件

1、Kube-apiserver
  • 用于暴露 Kubernetes API,任何资源请求或调用操作都是通过 kube-apiserver 提供的接口进行。以 HTTP Restful API 提供接口服务,所有对象资源的增删改查和监听操作都交给 API Server 处理后再提交给 Etcd 存储。
  • 可以理解成 API Server 是 K8S 的所有服务的请求入口。API Server 负责接收 K8S 所有请求(来自 UI 界面或者 CLI 命令行工具), 然后根据用户的具体请求,去通知其他组件干活。可以说 API Server 是 K8S 集群架构的大脑。
2、Kube-controller/kənˈtroʊlər/-manager
  • 运行管理控制器,是 K8S 集群中处理常规任务的后台线程,是 K8S 集群里所有资源对象的自动化控制中心。

  • 在 K8S 集群中,一个资源对应一个控制器,而 Controller manager 就是负责管理这些控制器的。

  • 由一系列控制器组成,通过 API Server 监控整个集群的状态,并确保集群处于预期的工作状态,比如当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。

  • 这些控制器主要包括:
    • Node Controller(节点控制器):负责在节点出现故障时发现和响应。

    • Replication Controller(副本控制器):负责保证集群中一个 RC(资源对象 Replication Controller)所关联的 Pod 副本数始终保持预设值。可以理解成确保集群中有且仅有 N 个 Pod 实例,N 是 RC 中定义的 Pod 副本数量。

    • Endpoints Controller(端点控制器):填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。 可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的 endpoint。

    • Service Account & Token Controllers(服务帐户和令牌控制器):为新的命名空间创建默认帐户和 API 访问令牌。

    • ResourceQuota Controller(资源配额控制器):确保指定的资源对象在任何时候都不会超量占用系统物理资源。

    • Namespace Controller(命名空间控制器):管理 namespace 的生命周期。

    • Service Controller(服务控制器):属于 K8S 集群与外部的云平台之间的一个接口控制器

3、Kube-scheduler/ˈskedʒuːlər/
  • 是负责资源调度的进程,根据调度算法为新创建的 Pod 选择一个合适的 Node 节点。

  • 可以理解成 K8S 所有 Node 节点的调度器。当用户要部署服务时,Scheduler 会根据调度算法选择最合适的 Node 节点来部署 Pod。

  • 调度算法:

    • 预选策略(predicate)

    • 优选策略(priorities)

  • API Server 接收到请求创建一批 Pod ,API Server 会让 Controller-manager 按照所预设的模板去创建 Pod,Controller-manager 会通过 API Server 去找 Scheduler 为新创建的 Pod 选择最适合的 Node 节点。比如运行这个 Pod 需要 2C4G 的资源,Scheduler 会通过预选策略过滤掉不满足策略的 Node 节点。Node 节点中还剩多少资源是通过汇报给 API Server 存储在 etcd 里,API Server 会调用一个方法找到 etcd 里所有 Node 节点的剩余资源,再对比 Pod 所需要的资源,如果某个 Node 节点的资源不足或者不满足 预选策略的条件则无法通过预选。预选阶段筛选出的节点,在优选阶段会根据优选策略为通过预选的 Node 节点进行打分排名, 选择得分最高的 Node。例如,资源越富裕、负载越小的 Node 可能具有越高的排名。

4、Etcd 配置存储中心
  • etcd 是分布式键值存储系统,是K8S 的存储服务,存储了 K8S 的关键配置和用户配置,K8S 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据。

  • etcd是Coreos团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值 (kev-value)数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。

  • etcd 作为服务发现系统,有以下的特点:

    • 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单

    • 安全:支持SSI证书验证

    • 快速:单实例支持每秒2k+读操作

    • 可靠:采用rat算法,实现分布式系统数据的可用性和一致性

  • etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信(这两个端口已经被IANA官方预留给etcd)。即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯。

  • etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。

3.Node 组件

1、Kubelet
  • Node 节点的监视器,以及与 Master 节点的通讯器。Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,它会定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施。
  • 从 Master 节点获取自己节点上 Pod 的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等), 直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上 Pod 的状态与期望状态不一致,则调用对应的容器平台接口(即 docker 的接口)达到这个状态。
  • 还负责管理镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源。
  • 即在 Kubernetes 集群中,在每个 Node 上都会启动一个 kubelet 服务进程。该进程用于处理 Master 下发到本节点的任务,管理 Pod 及 Pod 中的容器。每个 kubelet 进程都会在 API Server 上注册节点自身的信息,定期向 Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源。
2、Kube-Proxy
  • 在每个 Node 节点上实现 Pod 网络代理,是 Kubernetes Service 资源的载体,负责维护网络规则和四层负载均衡工作。 负责写入规则至iptables、ipvs实现服务映射访问的。
  • Kube-Proxy 本身不是直接给 Pod 提供网络,Pod 的网络是由 Kubelet 提供的,Kube-Proxy 实际上维护的是虚拟的 Pod 集群网络。
  • Kube-apiserver 通过监控 Kube-Proxy 进行对 Kubernetes Service 的更新和端点的维护。
  • 在 K8S 集群中微服务的负载均衡是由 Kube-proxy 实现的。Kube-proxy 是 K8S 集群内部的负载均衡器。它是一个分布式代理服务器,在 K8S 的每个节点上都会运行一个 Kube-proxy 组件。
3、Container Runtime
  • 容器引擎,运行容器,负责本机的容器创建和管理工作。当 kubernetes 把 pod 调度到节点上,节点上的 kubelet会指示 docker 启动特定的容器。接着,kubelet 会通过 docker 持续地收集容器的信息, 然后提交到主节点上。docker 会如往常一样拉取容器镜像、启动或停止容器。不同点仅仅在于这是由自动化系统控制而非管理员在每个节点上手动操作的。

三、Kubernetes 的工作流程

  1. 用户通过客户端发送创建pod的请求到master节点上的apiserver;
  2. apiserver会先把相关的请求信息写入到etcd中,再找controller-manager根据预设的资源模板创建pod清单;
  3. 然后controller-manager会通过apiserver去找scheduler为新创建的pod选择最适合的Node节点;
  4. scheduler会通过调度算法的预选策略和优选策略筛选出最适合的Node节点;
  5. 然后再通过apiserver找到对应的Node节点上的kubelet去创建和管理pod;
  6. kubelet会直接跟容器引擎交互来管理容器的生命周期;
  7. 用户通过创建承载在kube-proxy上的service资源,写入相关的网络规则,实现对pod的服务发现和负载均衡。

img

四、Kubernetes 的资源对象

  • Kubernetes 包含多种类型的资源对象:Pod、Label、Service、Replication Controller 等。
  • 所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具进行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。
  • Kubernets其实是一个高度自动化的资源控制系统,通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异,来实现自动控制和自动纠错等高级功能。

1、Pod

  • Pod是 Kubernetes 创建或部署的最小/最简单的基本单位,一个 Pod 代表集群上正在运行的一个进程。可以把 Pod 理解成豌豆荚,而同一 Pod 内的每个容器是一颗颗豌豆。
  • 一个 Pod 由一个或多个容器组成,Pod 中容器共享网络、存储和计算资源,在同一台 Docker 主机上运行。
  • 一个 Pod 里可以运行多个容器,又叫边车模式(SideCar)。而在生产环境中一般都是单个容器或者具有强关联互补的多个容器组成一个 Pod。
  • 同一个 Pod 之间的容器可以通过 localhost 互相访问,并且可以挂载 Pod 内所有的数据卷;但是不同的 Pod 之间的容器不能用 localhost 访问,也不能挂载其他 Pod 的数据卷。

2、Pod 控制器

  • ​ Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。

  • K8S 内提供了众多的 Pod 控制器,常用的有以下几种

    • Deployment:无状态应用部署。Deployment 的作用是管理和控制 Pod 和 ReplicaSet,管控它们运行在用户期望的状态中。

    • Replicaset:确保预期的 Pod 副本数量。ReplicaSet 的作用就是管理和控制 Pod,管控他们好好干活。但是,ReplicaSet 受控于 Deployment。

    • Daemonset:确保所有节点运行同一类 Pod,保证每个节点上都有一个此类 Pod 运行,通常用于实现系统级后台任务。

    • Statefulset:有状态应用部署

    • Job:一次性任务。根据用户的设置,Job 管理的 Pod 把任务成功完成就自动退出了。

    • Cronjob:周期性计划性任务

3、Label

  • 标签,是 K8S 特色的管理方式,便于分类管理资源对象。Label 可以附加到各种资源对象上,例如 Node、Pod、Service、RC 等,用于关联对象、查询和筛选。

  • 一个 Label 是一个 key-value 的键值对,其中 key 与 value 由用户自己指定。

  • 一个资源对象可以定义任意数量的Label,同一个Label 也可以被添加到任意数量的资源对象中,也可以在对象创建后动态添加或者删除。

  • 可以通过给指定的资源对象捆绑一个或多个不同的 Label,来实现多维度的资源分组管理功能。

  • 与 Label 类似的,还有 Annotation(注释)

  • 区别在于有效的标签值必须为63个字符或更少,并且必须为空或以字母数字字符([a-z0-9A-Z])开头和结尾,中间可以包含横杠(-)、下划线(_)、点(.)和字母或数字。注释值则没有字符长度限制。

4、Label 选择器(Label selector)

  • 给某个资源对象定义一个 Label,就相当于给它打了一个标签;随后可以通过标签选择器(Label selector)查询和筛选拥有某些 Label 的资源对象。
  • 标签选择器目前有两种:
    • 基于等值关系(等于、不等于)
    • 基于集合关系(属于、不属于、存在)

5、Service

  • 在K8S的集群里,虽然每个Pod会被分配一个单独的IP地址,但由于Pod是有生命周期的(它们可以被创建,而且销毁之后不会再启动),随时可能会因为业务的变更,导致这个 IP 地址也会随着 Pod 的销毁而消失。而Service 就是用来解决这个问题的核心概念。
  • K8S 中的 Service 并不是我们常说的“服务”的含义,而更像是网关层,可以看作一组提供相同服务的Pod的对外访问接口、流量均衡器。
  • Service 作用于哪些 Pod 是通过标签选择器来定义的。在 K8S 集群中,Service 可以看作一组提供相同服务的 Pod 的对外访问接口。客户端需要访问的服务就是 Service 对象。每个 Service 都有一个固定的虚拟 ip(这个 ip 也被称为 Cluster IP),自动并且动态地绑定后端的 Pod,所有的网络请求直接访问 Service 的虚拟 ip,Service 会自动向后端做转发。
  • Service 除了提供稳定的对外访问方式之外,还能起到负载均衡(Load Balance)的功能,自动把请求流量分布到后端所有的服务上,Service 可以做到对客户透明地进行水平扩展(scale)。
    而实现 service 这一功能的关键,就是 kube-proxy。kube-proxy 运行在每个节点上,监听 API Server 中服务对象的变化, 可通过以下三种流量调度模式: userspace(废弃)、iptables(濒临废弃)、ipvs(推荐,性能最好)来实现网络的转发。
  • Service 是 K8S 服务的核心,屏蔽了服务细节,统一对外暴露服务接口,真正做到了“微服务”。比如我们的一个服务 A,部署了 3 个副本,也就是 3 个 Pod; 对于用户来说,只需要关注一个 Service 的入口就可以,而不需要操心究竟应该请求哪一个 Pod。
    优势非常明显:一方面外部用户不需要感知因为 Pod 上服务的意外崩溃、K8S 重新拉起 Pod 而造成的 IP 变更, 外部用户也不需要感知因升级、变更服务带来的 Pod 替换而造成的 IP 变化。

6、Ingress

  • Service 主要负责 K8S 集群内部的网络拓扑,那么集群外部怎么访问集群内部呢?这个时候就需要 Ingress 了。Ingress 是整个 K8S 集群的接入层,负责集群内外通讯。
  • Ingress 是 K8S 集群里工作在 OSI 网络参考模型下,第7层的应用,对外暴露的接囗,典型的访问方式是 http/https。
  • Service 只能进行第四层的流量调度,表现形式是 ip+port。Ingress 则可以调度不同业务域、不同URL访问路径的业务流量。
  • 比如:客户端请求 http://www.abc.com:port —> Ingress —> Service —> Pod

7、Name

  • 由于 K8S 内部,使用 “资源” 来定义每一种逻辑概念(功能),所以每种 “资源”,都应该有自己的 “名称”。
  • “资源” 有 api 版本(apiversion)、类别(kind)、元数据(metadata)、定义清单(spec)、状态(status)等配置信息。
  • “名称” 通常定义在 “资源” 的 “元数据” 信息里。在同一个 namespace 空间中同一个类型的资源名称必须是唯一的。

8、Namespace

  • 随着项目增多、人员增加、集群规模的扩大,需要一种能够逻辑上隔离 K8S 内各种 “资源” 的方法,这就是 Namespace。
  • Namespace 是为了把一个 K8S 集群划分为若干个资源不可共享的虚拟集群组而诞生的。
    不同 Namespace 内的 “资源” 名称可以相同,相同 Namespace 内的同种 “资源”,“名称” 不能相同。
  • 合理的使用 K8S 的 Namespace,可以使得集群管理员能够更好的对交付到 K8S 里的服务进行分类管理和浏览。
  • K8S 里默认存在的 Namespace 有:default、kube-system、kube-public 等。查询 K8S 里特定 “资源” 要带上相应的 Namespace。

五、Kubernetes 请求访问过程

  1. service资源通过标签选择器关联具有相同标签的Pod;
  2. 每个service都有一个固定的clusterip,可供在Kubernetes集群内部被访问;
  3. service可以把通过cluster ip发来的请求负载均衡 4层代理转发到它所关联的后端pod上;
  4. ingress可以作为Kubernetes对外暴露的网关接口接收Kubernetes集群外部发来的请求流量;
  5. ingress支持7层代理转发,它可以通过根据不同的域名或者URL访问路径把请求流量转发到不同的service上。

img

创建Pod的整个流程,时序图如下:

img 1.

  1. 用户提交创建Pod的请求,可以通过API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml两种格式;
  2. API Server 处理用户请求,存储Pod数据到Etcd;
  3. Schedule通过和 API Server的watch机制,查看到新的pod,尝试为Pod绑定Node;
  4. 过滤主机:调度器用一组规则过滤掉不符合要求的主机,比如Pod指定了所需要的资源,那么就要过滤掉资源不够的主机;
  5. 主机打分:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等;
  6. 选择主机:选择打分最高的主机,进行binding操作,结果存储到Etcd中;
  7. kubelet根据调度结果执行Pod创建操作: 绑定成功后,会启动container, docker run, scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。

六、Kubernetes 部署集群

  • 初步搭建一个四节点Kubernetes 1.28.2 集群。先准备好机器
hosthostnameosrolehardware
192.168.96.101master01centos7.9control-planecpu:2c 内存: 3G 硬盘1:50G
192.168.96.104node01centos7.9workercpu:2c 内存: 3G 硬盘1:50G 硬盘2:50G
192.168.96.105node02centos7.9workercpu:2c 内存: 3G 硬盘1:50G 硬盘2:50G
192.168.96.106node03centos7.9workercpu:2c 内存: 3G 硬盘1:50G 硬盘2:50G
  • 预留了102、103节点,后续扩容集群做control-plane节点高可用。

  • 所有work节点各分配一块50硬盘,后续做ceph存储用。

1. 基础环境准备

  • 所有节点全部执行环境初始化,(后面如果要给集群新增节点也要做这个操作)
  • 所有节点按照表格修改主机名
1、所有节点全部关闭防火墙
[root@master01 ~]# systemctl stop firewalld
[root@master01 ~]# systemctl disable firewalld
[root@master01 ~]# systemctl is-enabled firewalld
2、配置ntp server同步时间
[root@master01 ~]# ntpdate ntp1.aliyun.com
[root@master01 ~]# vi /etc/crontab
1 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com && /sbin/hwclock -w
3、永久关闭selinux
[root@master01 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
[root@master01 ~]# setenforce 0
4、关闭swap分区
[root@master01 ~]# sed -i '/swap/s/^/#/g' /etc/fstab
[root@master01 ~]# swapoff -a  
5、配置hosts
[root@master01 ~]# cat >>/etc/hosts <<EOF
192.168.96.101 master01
192.168.96.104 node01
192.168.96.105 node02
192.168.96.106 node03
EOF
6、内核升级

简介: centos7 yum工具在线升级内核

1、查看当前内核版本
[root@master01 ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2、更新内核
[root@master01 ~]# yum update -y  # 网络不佳的情况下不要执行
3、导入ELPepo仓库公共密钥
[root@master01 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
4、安装ELPepo的仓库yum源
[root@master01 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
获取http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
获取http://elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:elrepo-release-7.0-4.el7.elrepo  ################################# [100%]
5、列出可用的系统内核包
[root@master01 ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
已加载插件:fastestmirror
Determining fastest mirrors
 * elrepo-kernel: mirrors.neusoft.edu.cn
elrepo-kernel                                                                                                                                                                                              | 2.9 kB  00:00:00     
elrepo-kernel/primary_db                                                                                                                                                                                   | 1.9 MB  00:00:01     
可安装的软件包
elrepo-release.noarch                                                                                            7.0-5.el7.elrepo                                                                                    elrepo-kernel
kernel-lt.x86_64                                                                                                 4.4.244-1.el7.elrepo                                                                                elrepo-kernel
kernel-lt-devel.x86_64                                                                                           4.4.244-1.el7.elrepo                                                                                elrepo-kernel
kernel-lt-doc.noarch                                                                                             4.4.244-1.el7.elrepo                                                                                elrepo-kernel
kernel-lt-headers.x86_64                                                                                         4.4.244-1.el7.elrepo                                                                                elrepo-kernel
kernel-lt-tools.x86_64                                                                                           4.4.244-1.el7.elrepo                                                                                elrepo-kernel
kernel-lt-tools-libs.x86_64                                                                                      4.4.244-1.el7.elrepo                                                                                elrepo-kernel
kernel-lt-tools-libs-devel.x86_64                                                                                4.4.244-1.el7.elrepo                                                                                elrepo-kernel
kernel-ml.x86_64                                                                                                 5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
kernel-ml-devel.x86_64                                                                                           5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
kernel-ml-doc.noarch                                                                                             5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
kernel-ml-headers.x86_64                                                                                         5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
kernel-ml-tools.x86_64                                                                                           5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
kernel-ml-tools-libs.x86_64                                                                                      5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
kernel-ml-tools-libs-devel.x86_64                                                                                5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
perf.x86_64                                                                                                      5.9.8-1.el7.elrepo                                                                                  elrepo-kernel
python-perf.x86_64                                                                                               5.9.8-1.el7.elrepo                                                                                  elrepo-kernel

说明:

  • lt长期维护版
  • ml最新稳定版
6、选择lt版本安装
[root@master01 ~]# yum -y  --enablerepo=elrepo-kernel install kernel-lt
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * elrepo: mirrors.neusoft.edu.cn
 * elrepo-kernel: mirrors.neusoft.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.163.com
base                                                                                                                                                                                                       | 3.6 kB  00:00:00     
elrepo                                                                                                                                                                                                     | 2.9 kB  00:00:00     
extras                                                                                                                                                                                                     | 2.9 kB  00:00:00     
updates                                                                                                                                                                                                    | 2.9 kB  00:00:00     
(1/5): extras/7/x86_64/primary_db                                                                                                                                                                          | 222 kB  00:00:00     
(2/5): base/7/x86_64/group_gz                                                                                                                                                                              | 153 kB  00:00:00     
(3/5): elrepo/primary_db                                                                                                                                                                                   | 481 kB  00:00:00     
(4/5): base/7/x86_64/primary_db                                                                                                                                                                            | 6.1 MB  00:00:02     
(5/5): updates/7/x86_64/primary_db                                                                                                                                                                         | 3.6 MB  00:00:03     
正在解决依赖关系
--> 正在检查事务
---> 软件包 kernel-lt.x86_64.0.4.4.244-1.el7.elrepo 将被 安装
--> 解决依赖关系完成
依赖关系解决
==================================================================================================================================================================================================================================
 Package                                            架构                                            版本                                                             源                                                      大小
==================================================================================================================================================================================================================================
正在安装:
 kernel-lt                                          x86_64                                          4.4.244-1.el7.elrepo                                             elrepo-kernel                                           40 M
事务概要
==================================================================================================================================================================================================================================
安装  1 软件包
总下载量:40 M
安装大小:182 M
Downloading packages:
kernel-lt-4.4.244-1.el7.elrepo.x86_64.rpm                                                                                                                                                                  |  40 MB  00:00:18     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告:RPM 数据库已被非 yum 程序修改。
  正在安装    : kernel-lt-4.4.244-1.el7.elrepo.x86_64                                                                                                                                                                         1/1 
  验证中      : kernel-lt-4.4.244-1.el7.elrepo.x86_64                                                                                                                                                                         1/1 
已安装:
  kernel-lt.x86_64 0:4.4.244-1.el7.elrepo                                                                                                                                                                                         
完毕!
7、设置内核默认启动
[root@master01 ~]#  sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (4.4.244-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-acf8c459ad794ca2b11bfcfa200b0ea6) 7 (Core)
[root@localhost ~]# grub2-set-default 0
8、重启系统
[root@master01 ~]# reboot
9、重启结束后,查看内核版本
[root@master01 ~]# uname -a
Linux localhost.localdomain 4.4.244-1.el7.elrepo.x86_64 #1 SMP Tue Nov 17 18:57:10 EST 2020 x86_64 x86_64 x86_64 GNU/Linux

2. 配置Kubernetes运行环境

  • 下面的操作所有节点全部执行,后面如果要给集群新增节点也要做这个操作
1、配置内核参数
[root@master01 ~]# cat > /etc/sysctl.d/Kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

# 使配置生效
[root@master01 ~]# sysctl --system

这些配置参数的含义是:

  1. net.bridge.bridge-nf-call-ip6tables = 1:当通过桥接网络接收到IPv6数据包时,将调用ip6tables的规则进行处理。
  2. net.bridge.bridge-nf-call-iptables = 1:当通过桥接网络接收到IPv4数据包时,将调用iptables的规则进行处理。
  3. net.ipv4.ip_forward = 1:允许IPv4的数据包转发,即使数据包的目标不是本机。
  4. vm.swappiness = 0 : vm.swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。

Kubernetes通过iptables实现服务发现和网络流量路由,pod通信。这一步很重要。没有设置的话会导致集群网络通信故障,如pod无法通信。

2、安装并设置开机加载ipvs相关内核模块
[root@master01 ~]# yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
[root@master01 ~]# cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

[root@master01 ~]# systemctl enable --now systemd-modules-load
  • ip_vsip_vs_rrip_vs_wrrip_vs_sh 是IPVS相关的内核模块。它们提供了不同的负载均衡算法(round-robin,加权轮询,最短任务优先)。
  • nf_conntracknf_conntrack_ipv4 是用于网络连接跟踪的内核模块,这在防火墙和NAT中非常重要。
  • linux kernel 4.19版本已经将nf_conntrack_ipv4 更新为 nf_conntrack
3、重启系统
[root@master01 ~]# reboot

确认一下是否加载成功

[root@master01 ~]# lsmod |egrep "ip_vs|nf_conntrack_ipv4"
nf_conntrack_ipv4      15053  26
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
ip_vs_sh               12688  0
ip_vs_wrr              12697  0
ip_vs_rr               12600  0
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  10 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
4、安装 containerd
  • 顺便介绍一下历史背景。早期docker势大,但docker没有实现CRI,Kubernetes只能用dockershim做适配器来兼容docker,使其可以接入cri,这个dockershim在Kubernetes1.24版本就被放弃维护了。containerd是从docker中分离出来的开源项目,强调简单性、健壮性和可移植性。它负责以下工作

    • 管理容器的生命周期(从创建容器到销毁容器)
    • 拉取/推送容器镜像
    • 存储管理(管理镜像及容器数据的存储)
    • 调用 runc 运行容器(与 runc 等容器运行时交互,runc是oci 开放容器标准的一个实现。oci就是创建容器需要做一些 namespaces 和 cgroups 的配置,以及挂载 root 文件系统等操作的规范)
    • 管理容器网络接口及网络
[root@master01 ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
# 添加阿里源
[root@master01 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 配置 containerd 
[root@master01 ~]# cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 立刻加载 overlay模块
[root@master01 ~]# modprobe overlay
# 立刻加载 br_netfilter模块
[root@master01 ~]# modprobe br_netfilter
# 安装containerd
[root@master01 ~]# yum install containerd.io -y
  • overlay 是一个文件系统类型,它支持在不改变底层文件的情况下,将改动保存在另一个分离的文件层。它常用于 Docker 和其他容器运行时中,用来创建容器的文件系统。(写时复制)
  • br_netfilter 是一个网络相关的内核模块,它允许 iptables 和其他网络工具对桥接流量进行过滤。这在 Kubernetes 网络设置中很重要,特别是在使用 overlay 网络(如 flannel、Calico 等)时。
5、配置containerd
[root@master01 ~]# mkdir -p /etc/containerd
[root@master01 ~]# containerd config default > /etc/containerd/config.toml
# 使用systemd管理cgroups
[root@master01 ~]# sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
# 配置sadnbox image从阿里云拉取
[root@master01 ~]# sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml

[root@master01 ~]# sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml

# 启动containerd
[root@master01 ~]# systemctl enable containerd
[root@master01 ~]# systemctl start containerd

3、安装kubeamd、kubelet、kubectl

  • 下面的操作所有节点全部执行,后面如果要给集群新增节点也要做这个操作
1、添加阿里源
[root@master01 ~]# cat >/etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2、安装并启动
# 查看可用版本
[root@master01 ~]# yum list kubelet --showduplicates |grep 1.28

# 开始安装   这篇文档写下时,最新版本为1.28.2  我直接安装的最新版
[root@master01 ~]# yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2

# 启动
[root@master01 ~]# systemctl enable kubelet
[root@master01 ~]# systemctl start kubelet

4、部署control-plane节点

  • 以下操作只在control-plane节点执行
1、使用kubeadm初始化
# 查看所需镜像
[root@master01 ~]# kubeadm config images list --kubernetes-version=v1.28.2
registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1

# 初始化
[root@master01 ~]# kubeadm init --kubernetes-version=1.28.2 \
--apiserver-advertise-address=192.168.31.200  \
--image-repository  registry.aliyuncs.com/google_containers \
--pod-network-cidr=172.16.0.0/16
  • apiserver-advertise-address写control-plane的ip
  • pod-network-cidr写个不冲突的网段
  • image-repository指定从阿里云拉取镜像

命令执行完成后会返回一长段内容,主要看最后部分

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
    export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.96.101:6443 --token l906wz.0fydt3hcfbogwlo9 \
        --discovery-token-ca-cert-hash sha256:2604d3aab372a483b26bcbdafdb54d7746226975c3a317db07d94eccdfca51be
  • 按提示操作配置认证
[root@master01 ~]# mkdir -p $HOME/.kube
[root@master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master01 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
  • $HOME/.kube/config这个文件可以复制到本地,这样就可以在本地执行kubectl命令了,前提是先安装kubectl

  • 查看节点状态和pod就绪状态

[root@master01 ~]# kubectl get node
NAME                     STATUS          ROLES            AGE       VERSION
control-plane01          NotReady        control-plane    50s       v1.28.2
[root@master01 ~]# kubectl get pods -A
[root@master01 ~]# kubectl get pods -n kube-system
NAME                                           READY   STATUS    RESTARTS      AGE
coredns-7bdc4cb885-fs2tz                       1/1     Pending   0             13d
coredns-7bdc4cb885-wk7c9                       1/1     Pending   0             13d
etcd-control-plane01                           1/1     Running   0             13d
kube-apiserver-control-plane01                 1/1     Running   0             13d
kube-controller-manager-control-plane01        1/1     Running   0             13d
kube-proxy-mfzmq                               1/1     Running   3 (25h ago)   13d
kube-scheduler-control-plane01                 1/1     Running   0             13d
  • master01状态为NotReady是因为coredns没有启动,dns启动是因为没有网络插件

  • 加入集群token过期或者遗忘,获取加入集群命令

[root@master01 ~]# kubeadm token create --print-join-command
2、部署calico
  • 安装calico网络插件
[root@master01 ~]#  curl https://docs.projectcalico.org/manifests/calico.yaml -O
[root@master01 ~]#  wget https://docs.projectcalico.org/manifests/calico.yaml
1、修改CIDR
PS:
 
该yaml文件中默认CIDR为192.168.0.0/16,需要与初始化时kube-config.yaml中的配置一致,如果不同请下载该yaml修改后运行
 
[root@master01 ~]# grep '# value' calico.yaml

img

  • 如果是kubeadm部署的k8s

  • 则对应项为

  • –pod-network-cidr=10.244.0.0/16

2、指定网卡
# Cluster type to identify the deployment type
  - name: CLUSTER_TYPE
  value: "k8s,bgp"
# 下面添加
  - name: IP_AUTODETECTION_METHOD
    value: "interface=eth0"
    # eth0为本地网卡名字

img

  • calico 自动探查互联网卡,如果有多快网卡,则可以配置用于互联的网络接口命名正则表达式,如上面的 eth0 (根据自己服务器的网络接口名修改);
    不指定网卡
  • 创建pod时会有如下报错
 Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "5d6557ac061d164d494042e7e9b6cc38c95688a358275a78f5bbb7dd3883c063" network for pod "ingress-nginx-admission-create-b9q9w": networkPlugin cni failed to set up pod "ingress-nginx-admission-create-b9q9w_ingress-nginx" network: error getting ClusterInformation: connection is unauthorized: Unauthorized, failed to clean up sandbox container "5d6557ac061d164d494042e7e9b6cc38c95688a358275a78f5bbb7dd3883c063" network for pod "ingress-nginx-admission-create-b9q9w": networkPlugin cni failed to teardown pod "ingress-nginx-admission-create-b9q9w_ingress-nginx" network: error getting ClusterInformation: connection is unauthorized: Unauthorized]
3、部署
[root@master01 ~]#  kubectl apply -f calico.yaml
[root@master01 ~]#  kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-6849cf9bcf-gv6xx   1/1     Running   0             13d
calico-node-2d7xx                          1/1     Running   0             13d
coredns-7bdc4cb885-fs2tz                   1/1     Running   0             13d
coredns-7bdc4cb885-wk7c9                   1/1     Running   0             13d
etcd-control-plane01                       1/1     Running   0             13d
kube-apiserver-control-plane01             1/1     Running   0             13d
kube-controller-manager-control-plane01    1/1     Running   0             13d
kube-proxy-mfzmq                           1/1     Running   3 (25h ago)   13d
kube-scheduler-control-plane01             1/1     Running   0             13d

[root@master01 ~]# syst
NAME                 STATUS          ROLES             AGE     VERSION
control-plane01          Ready        control-plane      13d      v1.28.2

5、worker节点加入集群

# 所有worker节点都执行
kubeadm join 192.168.96.101:6443 --token l906wz.0fydt3hcfbogwlo9 \
        --discovery-token-ca-cert-hash sha256:2604d3aab372a483b26bcbdafdb54d7746226975c3a317db07d94eccdfca51be
  • 查看状态
[root@master01 ~]# kubectl get nodes
NAME          STATUS   ROLES           AGE   VERSION
control-plane01   Ready    control-plane   13d   v1.28.2
node01   Ready    <none>          13d   v1.28.2
node02   Ready    <none>          13d   v1.28.2
node03   Ready    <none>          13d   v1.28.2

6、Kubernetes dashboard 安装

1、安装命令补全
[root@master01 ~]# yum -y install bash-completion
[root@master01 ~]# echo "source <(kubectl completion bash)" >> /etc/profile
[root@master01 ~]# source /etc/profile
2、kubernetes-dashboard安装(可选,kubesphere更好用)
# 下载yaml
[root@master01 ~]# https://github.com/kubernetes/dashboard/releases

[root@master01 ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

[root@master01 ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml

# 添加nodeport
 [root@master01 ~]# vim recommended.yaml
  • 修改如下内容
kind: Service
apiVersion: v1
metadata:
  labels:
    Kubernetes-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort       # 增加内容
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30000  # 增加内容(端口范围30000-32767)
  selector:
    Kubernetes-app: kubernetes-dashboard
# 安装
[root@master01 ~]# kubectl apply -f recommended.yaml

# 查看进度
[root@master01 ~]# kubectl get all -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS      AGE
pod/dashboard-metrics-scraper-5cb4f4bb9c-h549p   1/1     Running   3 (26h ago)   13d
pod/kubernetes-dashboard-6967859bff-cm4tl        1/1     Running   4 (26h ago)   13d

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.108.31.72    <none>        8000/TCP        13d
service/kubernetes-dashboard        NodePort    10.102.47.173   <none>        443:30000/TCP   13d

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dashboard-metrics-scraper   1/1     1            1           13d
deployment.apps/kubernetes-dashboard        1/1     1            1           13d

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/dashboard-metrics-scraper-5cb4f4bb9c   1         1         1       13d
replicaset.apps/kubernetes-dashboard-6967859bff        1         1         1       13d
  • 创建admin用户
[root@master01 ~]# vim admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kubernetes-dashboard  
---
apiVersion: v1
kind: Secret
metadata:
  name: kubernetes-dashboard-admin
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin"
type: kubernetes.io/service-account-token
# 创建admin用户token
[root@master01 ~]# kubectl -n kubernetes-dashboard create token admin

# 获取token
 [root@master01 ~]# Token=$(kubectl -n kubernetes-dashboard get secret |awk '/kubernetes-dashboard-admin/ {print $1}')
 [root@master01 ~]# kubectl describe secrets -n kubernetes-dashboard ${Token} |grep token |awk 'NR==NF {print $2}'
  • 然后就可以使用token登陆了,地址是 集群任意节点IP:30000

7、Kubernetes metrics-server 插件部署

1、metrics-server 介绍
  • heapster已经被metrics-server取代,如果使用kubernetes的自动扩容功能的话,那首先得有一个插件,然后该插件将收集到的信息(cpu、memory…)与自动扩容的设置的值进行比对,自动调整pod数量。关于该插件,在kubernetes的早些版本中采用的是heapster,1.13版本正式发布后,丢弃了heapster,官方推荐采用metrics-sever。

  • metrics server为Kubernetes自动伸缩提供一个容器资源度量源。metrics-server 从 kubelet 中获取资源指标,并通过 Metrics API 在 Kubernetes API 服务器中公开它们,以供 HPA 和 VPA 使用。

2、安装步骤
1、获取yaml文件。
[root@master01 ~]#  wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server.yaml
  • 编辑yaml文件。之前部署集群用的自签名证书,metrics-server直接请求kubelet接口会证书校验失败,因此deployment中增加- --kubelet-insecure-tls参数。另外镜像原先在registry.k8s.io,国内下载不方便,下面的配置中修改成了国内镜像仓库地址。内网环境中可以先下载,然后再推到内网镜像仓库,镜像也改成内网镜像地址。
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  # ...
  template:
  	spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls     # 需要新加的一行
        image: registry.cn-hangzhou.aliyuncs.com/rainux/metrics-server:v0.6.4
2、安装发布
[root@master01 ~]#  kubectl apply -f metrics-server.yaml
3、查看是否在运行
[root@master01 ~]#  kubectl get pods -n kube-system | grep metrics
4、获取集群的指标数据
[root@master01 ~]#  kubectl get --raw /apis/metrics.k8s.io/v1beta1 | python3 -m json.tool
  • 根据输出可见,集群提供nodes和pods的资源指标。
{
    "kind": "APIResourceList",
    "apiVersion": "v1",
    "groupVersion": "metrics.k8s.io/v1beta1",
    "resources": [
        {
            "name": "nodes",
            "singularName": "",
            "namespaced": false,
            "kind": "NodeMetrics",
            "verbs": [
                "get",
                "list"
            ]
        },
        {
            "name": "pods",
            "singularName": "",
            "namespaced": true,
            "kind": "PodMetrics",
            "verbs": [
                "get",
                "list"
            ]
        }
    ]
}
6、测试验证
#1-2分钟后查看结果
[root@master01 ~]#  kubectl top nodes
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master   256m         12%    2002Mi          52%       
k8s-node1    103m         5%     1334Mi          34%       
k8s-node2    144m         7%     1321Mi          34%  
7、top命令
  • kubectl top命令用来查看node节点和pod的资源使用情况。
# 查看 top 命令的帮助
[root@master01 ~]#  kubectl top --help
# 查看node节点的资源使用情况
[root@master01 ~]#  kubectl top node
# 查看pod的资源使用情况
[root@master01 ~]#  kubectl top pod
# 查看所有命名空间的pod资源使用情况
[root@master01 ~]#  kubectl top pod -A
  • 再回到dashboard界面可以看到CPU和内存使用情况了:

Alt text

源码

  • Github仓库:https://github.com/sunweisheng/Kubernetes
6、导出认证添加配置
[root@k8s-master01 dashboard]# vim /root/.kube/config    # 增加 token 内容 
- name: admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQxekNDQXIrZ0F3SUJBZ0lVTFFhcXpaaitVc0tRU1BiWVlMRmxDWnhDZVBNd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1lURUxNQWtHQTFVRUJoTUNRMDR4RVRBUEJnTlZCQWdUQ0VoaGJtZGFhRzkxTVFzd0NRWURWUVFIRXdKWQpVekVNTUFvR0ExVUVDaE1EYXpoek1ROHdEUVlEVlFRTEV3WlRlWE4wWlcweEV6QVJCZ05WQkFNVENtdDFZbVZ5CmJtVjBaWE13SUJjTk1qQXdOREU1TURVeE1UQXdXaGdQTWpBM01EQTBNRGN3TlRFeE1EQmFNR2N4Q3pBSkJnTlYKQkFZVEFrTk9NUkV3RHdZRFZRUUlFd2hJWVc1bldtaHZkVEVMTUFrR0ExVUVCeE1DV0ZNeEZ6QVZCZ05WQkFvVApEbk41YzNSbGJUcHRZWE4wWlhKek1ROHdEUVlEVlFRTEV3WlRlWE4wWlcweERqQU1CZ05WQkFNVEJXRmtiV2x1Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeG1MWWxNQXFEeGVreXljWWlvQXUKU2p5VzhiUCtxTzF5bUhDWHVxSjQ3UW9Vd0lSVEFZdVAyTklQeFBza04xL3ZUeDBlTjFteURTRjdYd3dvTjR5cApacFpvRjNaVnV1NFNGcTNyTUFXT1d4VU93REZNZFZaSkJBSGFjZkdMemdOS01FZzRDVDhkUmZBUGxrYVdxNkROCmJKV3JYYW41WGRDUnE2NlpTdU9lNXZXTWhENzNhZ3UzWnBVZWtHQmpqTEdjNElTL2c2VzVvci9LeDdBa0JuVW0KSlE3M2IyWUl3QnI5S1ZxTUFUNnkyRlhsRFBpaWN1S0RFK2tGNm9leG04QTljZ1pKaDloOFZpS0trdnV3bVh5cwpNREtIUzJEektFaTNHeDVPUzdZR1ZoNFJGTGp0VXJuc1h4TVBtYWttRFV1NkZGSkJsWlpkUTRGN2pmSU9idldmCjlRSURBUUFCbzM4d2ZUQU9CZ05WSFE4QkFmOEVCQU1DQmFBd0hRWURWUjBsQkJZd0ZBWUlLd1lCQlFVSEF3RUcKQ0NzR0FRVUZCd01DTUF3R0ExVWRFd0VCL3dRQ01BQXdIUVlEVlIwT0JCWUVGS1pCcWpKRldWejZoV1l1ZkZGdApHaGJnQ05MU01COEdBMVVkSXdRWU1CYUFGQWJLKzBqanh6YUp3R1lGYWtpWVJjZzZENkpmTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQ05Ra3pueDBlSDU3R2NKZTF5WUJqNkY4YmVzM2VQNGRWcUtqQVZzSkh6S3dRWnpnUjIKcnVpMmdZYTZjdWNMNGRWVllHb05mRzRvdWI0ekJDTUIzZkRyN2FPRFhpcGcrdWx3OFpRZGRaN3RIYnZRTlIyMApTTHhnWnlFYU9MSFdmRVNYNFVJZk1mL3pDaGZ0Yzdhb1NpcUNhMGo2NmY2S3VVUnl6SSsxMThqYnpqK1gwb1d1ClVmdVV3dk5xWHR5ZjlyUTVWQW40bjhiU25nZDBGOXgzNFlyeUNMQ0REOWdBaWR3SDlVM3I3eVVGQ1Rkbm9leEgKSTgyYjRLdHZzT2NGMk5Dd21WZDFBWDNJSEFmMENRMEZSQ21YWjF3aFNxd1lFeVAxTStMMEcxN29CTmU5cmttMwo4U0NyWjczaWtiN0k1NXlVOWRrMjdXbVByb1hXMjAvcXhHeDYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBeG1MWWxNQXFEeGVreXljWWlvQXVTanlXOGJQK3FPMXltSENYdXFKNDdRb1V3SVJUCkFZdVAyTklQeFBza04xL3ZUeDBlTjFteURTRjdYd3dvTjR5cFpwWm9GM1pWdXU0U0ZxM3JNQVdPV3hVT3dERk0KZFZaSkJBSGFjZkdMemdOS01FZzRDVDhkUmZBUGxrYVdxNkROYkpXclhhbjVYZENScTY2WlN1T2U1dldNaEQ3MwphZ3UzWnBVZWtHQmpqTEdjNElTL2c2VzVvci9LeDdBa0JuVW1KUTczYjJZSXdCcjlLVnFNQVQ2eTJGWGxEUGlpCmN1S0RFK2tGNm9leG04QTljZ1pKaDloOFZpS0trdnV3bVh5c01ES0hTMkR6S0VpM0d4NU9TN1lHVmg0UkZManQKVXJuc1h4TVBtYWttRFV1NkZGSkJsWlpkUTRGN2pmSU9idldmOVFJREFRQUJBb0lCQVFDdkRPRld3QWxjcjl3MQpkaFh0Z0JWWVpBWTgyRHBKRE53bExwUnpscEZsZDVQQUhBS3lSbGR6VmtlYjVJNmNYZ1pucEtYWTZVaDIxYWhxCndldHF1Szl4V2g0WE5jK0gxaklYMlBiQnRPVmI4VVRHeWJsUmdBV0ZoNjBkQmFuNjZtUTRIa0Z6eDBFcFNSNDMKMTZselg3eGpwOTFDRkkxNC9tVExQSkQreDhLYXYxcDVPU1BYQkxhdzR6V1JycmFVSnFrVUtZcmRJUVlkNC9XQQpLNVp3WGpRdklpZzlGclArb2Fnb1kyelFzODFXMmlVd1pXanhkQnV0dXZiQW5mVEc0ZkQvUjc3MnNzUU44dkFvCldDUGpTcTlLckJZQzJYaWd5L2JkSHFFT3lpSmxUQVpaazZLQXlBN0ExbCs5WDFSOWxyUTFPTkpOS1k5WWRybTIKajFudW1WSXhBb0dCQU5sS3B4MW9tQVBQK0RaOGNMdjkwZDlIWm1tTDJZYkppUUtNdEwrUTJLKzdxZHNwemtOaQorb1J2R0NOR0R1U3JZbDZwWjFDMk0xajkxNXJwbWFrZmJmV2NDRWtKenlVRjhSMzUyb2haMUdYeWQzcmkxMWxqCndpcnlmcHl2QnF1SWlKYWR4Rk1UdGRoTmFuRTNFeURrSVJ0UW03YXcyZHppUnNobHkxVXFGMEYvQW9HQkFPbTYKQjFvbnplb2pmS0hjNnNpa0hpTVdDTnhXK2htc1I4akMxSjVtTDFob3NhbmRwMGN3ekJVR05hTDBHTFNjbFRJbwo4WmNNeWdXZU1XbmowTFA3R0syVUwranlyK01xVnFkMk1PRndLanpDOHNXQzhTUEovcC96ZWZkL2ZSUE1PamJyCm8rMExvblUrcXFjTGw1K1JXQ2dJNlA1dFo2VGR5eTlWekFYVUV2Q0xBb0dBQjJndURpaVVsZnl1MzF5YWt5M3gKeTRTcGp3dC9YTUxkOHNKTkh3S1hBRmFMVWJjNUdyN3kvelN5US9HTmJHb1RMbHJqOUxKaFNiVk5kakJrVm9tRgp2QXVYbExYSzQ5NHgrKzJhYjI5d2VCRXQxWGlLRXJmOTFHenp0KytYY0oxMDJuMkNSYnEwUmkxTlpaS1ZDbGY4CmNPdnNndXZBWVhFdExJT2J6TWxraFkwQ2dZRUEyUnFmOGJLL3B4bkhqMkx5QStYT3lMQ1RFbmtJWUFpVHRYeWsKbTI0MzFGdUxqRW9FTkRDem9XUGZOcnFlcUVZNm9CbEFNQnNGSFNyUW81ZW1LVWk0cDZQYXpQdUJQZlg2QUJ2ZApVOHNvc01BMVdocERmQWNKcWZJei9SNURSTHlUNXFnRDRSREptemJXdGN3aXoybm5CV2toWkJTa0RaU29SQlBpCkxCZk9iL2tDZ1lFQXk1ZS9MaXgzSzVvdHhGRC8xVVV0cGc2dEJqMksxVkg5bDJJWFBidmFKMjZQYnZWYkEwQTUKM0Z5UmZnSTlZTTc3T3QxbTY0ZlRTV21YdTJKU0JpM3FFQ2xic3FRT2taZXZ1V2VsSVY5WnhWblc5NVMzMHVuUwp0ZEk3ZDVTUm1OSUpWK0l1Mk9IRGxkYXN4TzJmcVFoTnVxSFRiVStvNW42ZCtUUlpXVTdpN0drPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
    token: JSUzI1NiIsImtpZCI6Ikg5dThGMmc0c1ZBOTVkajVjMGRlb2poZjJMaExDSFp1T1NJWTdobkYtWmsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTRsYzkyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiNjc2MGRkZi1kN2FhLTRlZjctYWZkOS05YzA0ZThlMWE5NTQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.XCA6-Wo7q8tJY8td1PRGkruvuNOmtHenjzyToRq5fJjGmWjdLspMDRvDul7YjMeY5eNuhcMG1cJgnyTZZW4gypIiVK1cAtvNR-U4oS0Vv8PqknZdc5-U1ftjIUeayH33tPCAgj-rui31CTwg26s0Z0B312XHF6tLOZZYxkavd1zYVt7DJaJcJpVsC1yaagoLBTjrfpV42N2s49QxnXMaQwYJGy2vowbLcxekdOV2h-7Hv63DxqBRoFYNx_DawN2m3JFfIyQMP7lwENXvNK76wnY2boO8asbIS92V4poLnc9v0r4gtV80dFp3558_XYBWhnZq-_klFHsfxJ0Opt_iEA

[root@k8s-master01 dashboard]# cp /root/.kube/config /data/dashboard/k8s-dashboard.kubeconfig
[root@k8s-master01 dashboard]# sz k8s-dashboard.kubeconfig 
7、用文件认证登录

img

8、Kubernetes KuBoard 可视化部署(可选)

1、KuBoard 简介

Kuboard是一款免费的 Kubernetes 管理工具,提供了丰富的功能,结合已有或新建的代码仓库、镜像仓库、CI/CD工具等,可以便捷的搭建一个生产可用的 Kubernetes 容器云平台,轻松管理和运行云原生应用。您也可以直接将 Kuboard 安装到现有的 Kubernetes 集群,通过 Kuboard 提供的 Kubernetes RBAC 管理界面,将 Kubernetes 提供的能力开放给您的开发团队。

img

2、Kuboard 提供的功能有
  • Kubernetes 基本管理功能
    • 节点管理
    • 名称空间管理
    • 存储类/存储卷管理
    • 控制器(Deployment/StatefulSet/DaemonSet/CronJob/Job/ReplicaSet)管理
    • Service/Ingress 管理
    • ConfigMap/Secret 管理
    • CustomerResourceDefinition 管理
  • Kubernetes 问题诊断
    • Top Nodes / Top Pods
    • 事件列表及通知
    • 容器日志及终端
    • KuboardProxy (kubectl proxy 的在线版本)
    • PortForward (kubectl port-forward 的快捷版本)
    • 复制文件 (kubectl cp 的在线版本)
  • 认证与授权
    • Github/GitLab 单点登录
    • KeyCloak 认证
    • LDAP 认证
    • 完整的 RBAC 权限管理
  • Kuboard 特色功能
    • Grafana+Prometheus 资源监控
    • Grafana+Loki+Promtail 日志聚合
    • Kuboard 官方套件
    • Kuboard 自定义名称空间布局
    • Kuboard 中英文语言包
3、Kuboard 部署

KuBord官网:https://kuboard.cn/install/v3/install-in-k8s.html#%E5%AE%89%E8%A3%85

提供的安装命令如下:(支持1.27)

KuBord官网:https://kuboard.cn/install/v3/install.html
提供的安装命令如下:
[root@master01 ~]# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

错误异常pod一直不就绪 缺少 Master Role

  • 可能缺少 Master Role 的情况有:

    • 当您在 阿里云、腾讯云(以及其他云)托管 的 K8S 集群中以此方式安装 Kuboard 时,您执行 kubectl get nodes看不到 master 节点

    • 当您的集群是通过二进制方式安装时,您的集群中可能缺少 Master Role,或者当您删除了 Master 节点的

      node-role.kubernetes.io/master=
      

      标签时,此时执行

      [root@master01 ~]# kubectl get nodes
      

      ,结果如下所示:

      [root@master01 ~]# kubectl get nodes
      NAME               STATUS   ROLES    AGE   VERSION
      k8s-19-master-01   Ready    <none>   19d   v1.19.11
      k8s-19-node-01     Ready    <none>   19d   v1.19.11
      k8s-19-node-02     Ready    <none>   19d   v1.19.11
      k8s-19-node-03     Ready    <none>   19d   v1.19.11    
      
  • 在集群中缺少 Master Role 节点时,您也可以为一个或者三个 worker 节点添加

    k8s.kuboard.cn/role=etcd
    

    的标签,来增加 kuboard-etcd 的实例数量;

    • 执行如下指令,可以为

      your-node-name
      

      节点添加所需要的标签

      [root@master01 ~]# kubectl label nodes your-node-name k8s.kuboard.cn/role=etcd 
      
5、访问 Kuboard

在浏览器中打开链接 http://172.23.70.235:30080

输入初始用户名和密码,并登录

  • 用户名: admin
  • 密码: Kuboard123

部署完成后,进入30080端口可以看到这个命令,运行

1.8.png

[root@master01 ~]# curl -k 'http://172.23.70.235:30080/kuboard-api/cluster/default/kind/KubernetesCluster/default/resource/installAgentToKubernetes?token=VJr7EYvO0Dvh7eoB8JlYcN7S0GQhnPZE' > kuboard-agent.yaml
[root@master01 ~]# kubectl apply -f ./kuboard-agent.yaml

然后就可以看到集群信息了

1.9.png

七、Containerd 命令行工具 crictl、nerdctl

1、docker 和 containerd

  • docker 由 docker-client ,dockerd,containerd,docker-shim,runc 组成,所以 containerd 是 docker 的基础组件之一
  • 从 Kubernetes 的角度看,可以选择 containerd 或 docker 作为运行时组件:其中 containerd 调用链更短,组件更少,更稳定,占用节点资源更少。所以 Kubernetes 后来的版本开始默认使用 containerd 。
  • containerd 相比于 docker , 多了 namespace 概念,每个 image 和 container 都会在各自的 namespace 下可见。
  • docker 作为 Kubernetes 容器运行时,调用关系为:kubelet --> dockershim (在 kubelet 进程中) --> dockerd --> containerd
    containerd 作为 Kubernetes 容器运行时,调用关系为:kubelet --> cri plugin(在 containerd 进程中) --> containerd

2、命令区分

  • ctr 是 containerd 的一个客户端工具。

  • crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。

  • ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 Kubernetes 的版本,从结果显而易见你可以认为 crictl 是用于 Kubernetes 的。

[root@master01 ~]#  crictl -v
crictl version v1.26.0
[root@master01 ~]# ctr -v
ctr containerd.io 1.6.21
  • 所以说安装了 Kubernetes 后,命令行才会有 crictl 命令。而 ctr 是跟 Kubernetes 无关的,主机安装了 containerd 服务后就可以操作 ctr 命令。

3、常用命令

  • 又是一大波的命令来袭
命令dockerctr(containerd)crictl(kubernetes)
查看运行的容器docker psctr task ls/ctr container lscrictl ps
查看镜像docker imagesctr image lscrictl images
查看容器日志docker logscrictl logs
查看容器数据信息docker inspectctr container infocrictl inspect
查看容器资源docker statscrictl stats
启动/关闭已有的容器docker start/stopctr task start/killcrictl start/stop
运行一个新的容器docker runctr run无(最小单元为 pod)
修改镜像标签docker tagctr image tag
创建一个新的容器docker createctr container createcrictl create
导入镜像docker loadctr image import
导出镜像docker savectr image export
删除容器docker rmctr container rmcrictl rm
删除镜像docker rmictr image rmcrictl rmi
拉取镜像docker pullctr image pullctictl pull
推送镜像docker pushctr image push
在容器内部执行命令docker execcrictl exec
  • ctr并没有build命令,也就是没办法构建镜像,怎么办呢?

    • containerd 有一个子项目:nerdctl ,用来兼容 docker cli,可以像 docker 命令一样来管理本地的镜像和容器
  • containerd和docker的镜像是通用的

[root@master01 ~]# ctr image import my.tar
unpacking docker.io/library/mypython:latest (sha256:962b1654766f57616a6f36a67e8eaac6c67b13e79207f4864d85ab1a5641bdc5)...done
[root@node-129 kubernetes]# ctr i ls
REF                               TYPE                                                 DIGEST                                                                  SIZE      PLATFORMS   LABELS
docker.io/library/mypython:latest application/vnd.docker.distribution.manifest.v2+json sha256:962b1654766f57616a6f36a67e8eaac6c67b13e79207f4864d85ab1a5641bdc5 348.5 MiB linux/amd64 -
[root@master01 ~]# ctr i tag  docker.io/library/mypython:latest mypython:latest
mypython:latest
[root@master01 ~]# ctr i ls
REF                               TYPE                                                 DIGEST                                                                  SIZE      PLATFORMS   LABELS
docker.io/library/mypython:latest application/vnd.docker.distribution.manifest.v2+json sha256:962b1654766f57616a6f36a67e8eaac6c67b13e79207f4864d85ab1a5641bdc5 348.5 MiB linux/amd64 -
mypython:latest                   application/vnd.docker.distribution.manifest.v2+json sha256:962b1654766f57616a6f36a67e8eaac6c67b13e79207f4864d85ab1a5641bdc5 348.5 MiB linux/amd64 -

4、关于crictl

#查看containerd客户端即服务器版本信息
[root@master01 ~]# ctr version
#ctr全局命令概览
[root@master01 ~]# ctr --help
USAGE:	(注意看这个格式:ctr 全局选项 命令 命令选项 参数)
   ctr [global options] command [command options] [arguments...]
COMMANDS:
   plugins, plugin            provides information about containerd plugins
   version                    打印客户端和服务端版本
   containers, c, container   管理containers
   content                    管理content
   events, event              显示containerd events
   images, image, i           管理镜像
   leases                     管理leases
   namespaces, namespace, ns  管理namespaces
   pprof                      provide golang pprof outputs for containerd
   run                        运行一个container
   snapshots, snapshot        管理snapshots
   tasks, t, task             管理tasks
   install                    安装一个新的package
   oci                        OCI tools
   shim                       interact with a shim directly
   help, h                    显示命令帮助

全局选项:
   --debug                      在logs中开启enable输出
   --address value, -a value    containerd's GRPC server的地址 (默认: "/run/containerd/containerd.sock") 
   --timeout value              ctr命令超时时间(默认: 0s)
   --connect-timeout value      连接containerd超时时间 (默认: 0s)
   --namespace value, -n value  命名空间 (默认: "default")
   --help, -h                   显示帮助
   --version, -v                打印版本信息
  • 新版本的Kubernetes 1.26.2使用的是containerd和docker是2套不同的容器系统, 在Kubernetes中push和pull都是使用crictl, 所以生成pod时会发现docker images中存在镜像,但是kubelet提示" kubelet Failed to pull image “mynodejs:v1.0.0”: rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/mynodejs:v1.0.0""无法生成pod.

  • 此时使用crictl images会报错:“WARN[0000] image connect using default endpoints”, 解决办法如下:

1、重新生成containerd的配置文件
# 默认情况下containerd的sock存放于/run/containerd/containerd.sock
# 重新设置一下使用的runtime-endpoint, 生成后的crictl配置默认存放在/etc/crictl.yaml
[root@master01 ~]# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
2、编辑vim /etc/crictl.yaml
# 编辑/etc/crictl.yaml文件, 修改, 主要是新版本增加的image-endpoint
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"  #与上边runtime-endpoint一致即可
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
3、完成验证使用
# 重启内核, 查看Kubernetes镜像
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# crictl image
# containerd在导入镜像时, 使用ctr命令, 并且要指定Kubernetes默认的命名空间"k8s.io", 否则会查询不到
[root@master01 ~]# ctr -n k8s.io image import /home/mynodejs.tar.gz

八、Kubernetes 镜像管理

1、查看镜像

[root@master01 ~]# ctr -n=k8s.io images list

2、保存镜像

[root@master01 ~]# ctr -n=k8s.io images export Kubernetes_1.28.2.tar.gz \
docker.io/calico/cni:v3.26.2 \
docker.io/calico/kube-controllers:v3.26.2 \
docker.io/calico/node:v3.26.2 \
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2 \
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2 \
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2 \
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2 \
registry.aliyuncs.com/google_containers/pause:3.9 \
registry.aliyuncs.com/google_containers/etcd:3.5.9-0 \
registry.aliyuncs.com/google_containers/coredns:v1.10.1

3、导入k8s.io镜像

[root@master01 ~]# ctr -n=k8s.io images import  calico.tar.gz

4、查看镜像

[root@master01 ~]# ctr -n k8s.io images list

5、删除镜像

[root@master01 ~]# ctr images rm registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.0

6、查看容器

[root@master01 ~]# ctr c  list

九、harbor仓库搭建、ssl配置、containerd配置

本次安装为单机版离线安装,部署在一台虚拟机中。

之所以做vm部署,没有直接部署到Kubernetes中,是因为刚刚部署的Kubernetes还没有做存储,而做存储(rook-ceph)又需要拉取镜像仓库中的镜像,因为rook-ceph中的部分镜像因为墙的原因pull不下来的,试过替换为阿里的源,发现阿里的google_containers中还没有同步rook-ceph的部分镜像(rook-ceph 1.11.9版本)。所以在vm中单独搭一个仓库,供后续使用。

todo 后期改为高可用。

准备机器

hosthostnameoshardware
10.20.24.5010-20-24-50centos7.9cpu:2c 内存: 8G 硬盘:500G

1. 安装docker最新版及docker-compose

harbor要求docker版本不低于1.17 要下载高版本,直接装最新的。

[root@harbor ~]# yum remove docker \
  docker-common\
  docker-selinux \
  docker-engine
  
[root@harbor ~]#  yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2  
  
[root@harbor ~]#  yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  

[root@harbor ~]#  yum install docker-ce -y

[root@harbor ~]#  systemctl enable docker
[root@harbor ~]#  systemctl start docker

[root@harbor ~]#  docker version
docker version
Client: Docker Engine - Community
 Version:           24.0.4
 API version:       1.43
 Go version:        go1.20.5
 Git commit:        3713ee1
 Built:             Fri Jul  7 14:54:21 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.4
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.5
  Git commit:       4ffc614
  Built:            Fri Jul  7 14:53:26 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# 关闭防火墙 内网直接关比较省事,要暴露到公网的话要开启安全组
[root@harbor ~]#  systemctl stop firewalld
[root@harbor ~]#  systemctl disable firewalld
# 安装docker-compose
[root@harbor ~]#  wget https://github.com/docker/compose/releases/download/v2.19.1/docker-compose-linux-x86_64
[root@harbor ~]#  mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
[root@harbor ~]#  chmod 777 /usr/local/bin/docker-compose

[root@harbor ~]#  docker-compose --version
[root@harbor ~]#  Docker Compose version v2.19.1

2. 下载安装包

# 下载离线安装包
[root@harbor ~]#  wget https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz
[root@harbor ~]#  tar zxvf harbor-offline-installer-v2.8.2.tgz

[root@harbor ~]#  ls
harbor-offline-installer-v2.8.2.tgz    harbor

[root@harbor ~]#  cp harbor/harbor.yml.tmpl harbor/harbor.yml 

3. 生成ssl证书

生成证书颁发机构证书

[root@harbor ~]#  mkdir harborssl/

[root@harbor ~]#  ls
harbor-offline-installer-v2.8.2.tgz    harbor  harborssl

[root@harbor ~]#  cd harborssl

[root@harbor ~]#  openssl genrsa -out ca.key 4096 

[root@harbor ~]#  openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.20.24.50" -key ca.key -out ca.crt #CN写harbor仓库的ip,如果要域名访问的话就写域名。

ls -l
-rw-r--r--. 1 root root 2025 710 01:11 ca.crt
-rw-r--r--. 1 root root 3243 710 01:10 ca.key
  • 生成服务器证书
[root@harbor ~]#  openssl genrsa -out 10.20.24.50.key 4096  
[root@harbor ~]#  openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.20.24.50" -key 10.20.24.50.key -out 10.20.24.50.csr #CN写harbor仓库的ip,如果要域名访问的话就写域名。

[root@harbor ~]# ls -l
-rw-r--r--. 1 root root 1704 710 01:12 10.20.24.50.csr
-rw-r--r--. 1 root root 3243 710 01:11 10.20.24.50.key
-rw-r--r--. 1 root root 2025 710 01:11 ca.crt
-rw-r--r--. 1 root root 3243 710 01:10 ca.key

生成x509 v3文件

[root@harbor ~]# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:10.20.24.50 #如果是域名访问就写于明
EOF

[root@harbor ~]#  ls -l
-rw-r--r--. 1 root root 1704 710 01:12 10.20.24.50.csr
-rw-r--r--. 1 root root 3243 710 01:11 10.20.24.50.key
-rw-r--r--. 1 root root 2025 710 01:11 ca.crt
-rw-r--r--. 1 root root 3243 710 01:10 ca.key
-rw-r--r--. 1 root root  203 710 01:16 v3.ext
  • 使用刚生成的v3.ext文件生成证书
[root@harbor ~]#  openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in 10.20.24.50.csr -out 10.20.24.50.crt # 如果是域名访问替换成域名

ls -l
-rw-r--r--. 1 root root 2049 7月  10 01:17 10.20.24.50.crt
-rw-r--r--. 1 root root 1704 7月  10 01:12 10.20.24.50.csr
-rw-r--r--. 1 root root 3243 7月  10 01:11 10.20.24.50.key
-rw-r--r--. 1 root root 2025 7月  10 01:11 ca.crt
-rw-r--r--. 1 root root 3243 7月  10 01:10 ca.key
-rw-r--r--. 1 root root   17 7月  10 01:17 ca.srl
-rw-r--r--. 1 root root  203 7月  10 01:16 v3.ext

4. 为Harbor和docker提供证书

  • 为docker提供证书
[root@harbor ~]#  openssl x509 -inform PEM -in 10.20.24.50.crt -out 10.20.24.50.cert # 如果是域名访问替换成域名

[root@harbor ~]#  mkdir -p /etc/docker/certs.d/10.20.24.50/ # 如果是域名访问替换成域名
cp 10.20.24.50.cert /etc/docker/certs.d/10.20.24.50/
cp 10.20.24.50.key /etc/docker/certs.d/10.20.24.50/
cp ca.crt /etc/docker/certs.d/10.20.24.50

[root@harbor harborssl]# ll /etc/docker/certs.d/10.20.24.50/
总用量 16
-rw-r--r--. 1 root root 2049 710 01:19 10.20.24.50.cert
-rw-r--r--. 1 root root 3243 710 01:20 10.20.24.50.key
-rw-r--r--. 1 root root 2025 710 01:20 ca.crt

# 重启docker
[root@harbor ~]# systemctl restart docker

为harbor提供证书

[root@harbor ~]# mkdir -p /data/cert/
[root@harbor ~]# cp 10.20.24.50.crt /data/cert/
[root@harbor ~]# cp 10.20.24.50.key /data/cert/

[root@harbor ~]# cd ../harbor

[root@harbor ~]# vim harbor.yaml
  • 编辑内容
hostname: 10.20.24.50  # 修改为harbor的ip

http:  
  port: 80

https:
  port: 443
  certificate: /data/cert/10.20.24.50.crt  # 指定证书位置
  private_key: /data/cert/10.20.24.50.key  # 指定证书位置

安装

# 安装
[root@harbor ~]# ./install.sh

# 开启ssl
[root@harbor ~]#  ./prepare

# 重启harbor
[root@harbor ~]#  docker-compose down -v
[root@harbor ~]#  docker-compose up -d

5. 为Kubernetes的containerd配置证书

不配置的话在pull镜像时会报x509: certificate signed by unknown authority

[root@harbor ~]#  cd ../harborssl
[root@harbor ~]#  vi copy_cert.sh

# 写入一下内容

#!/bin/bash
# file name: copy_cert.sh

if [ $# -eq 0 ]
then
    echo "No arguments supplied. Please provide IP addresses."
    exit 1
fi

for IP in "$@"
do
    scp ca.crt root@$IP:/etc/containerd/10.20.24.50
done

# 保存后赋予执行权限
[root@harbor ~]#  chmod +x copy_cert.sh

# 运行脚本
[root@harbor ~]#  ./copy_cert.sh 192.168.96.101 192.168.96.104 192.168.96.105 192.168.96.106

登陆到Kubernetes的每个节点中

[root@harbor ~]#  vi /etc/containerd/config.toml
# 找到registry配置部分,修改为以下内容

    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = ""

      [plugins."io.containerd.grpc.v1.cri".registry.auths]


      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.20.24.50"]
           endpoint = ["https://10.20.24.50"]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."10.20.24.50".tls]
           ca_file = "/etc/containerd/10.20.24.50/ca.crt"
        [plugins."io.containerd.grpc.v1.cri".registry.configs."10.20.24.50".auth]
           username = "admin"
           password = "Harbor12345"

    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
      tls_cert_file = ""
      tls_key_file = ""
      
# 保存后重启
[root@harbor ~]#  systemctl daemon-reload
[root@harbor ~]#  systemctl restart containerd

配置crictl用于调试

[root@harbor ~]#  vi /etc/crictl.yaml
# 添加一下内容
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true

# 保存就可以了,立刻生效

# 测试
[root@harbor ~]# crictl pull 10.20.24.50/library/xxxxxx:xxx

完成

十、Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

1、概述

  • 作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockershim。在V1.24起的版本的kubelet就彻底移除了dockershim,改为默认使用Containerd了,当然也使用 cri-dockerd 适配器来将 Docker Engine 与 Kubernetes 集成。可以参考官方文档

在这里插入图片描述

2、Containerd 常见命令操作

更换Containerd后,以往我们常用的docker命令也不再使用,取而代之的分别是 crictlctr 两个命令客户端。

  • crictl 是遵循CRI接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像。

  • ctrcontainerd 的一个客户端工具。

  • ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 Kubernetes 的版本,从结果显而易见你可以认为 crictl 是用于 Kubernetes 的。

  • 一般来说你某个主机安装了 Kubernetes 后,命令行才会有 crictl 命令。而 ctr 是跟 Kubernetes 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。

  • 使用crictl命令之前,需要先配置/etc/crictl.yaml如下:

runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
  • 也可以通过命令进行设置:
[root@master01 ~]#  crictl config runtime-endpoint unix:///run/containerd/containerd.sock
[root@master01 ~]#  crictl config image-endpoint unix:///run/containerd/containerd.sock
命令dockerctr(containerd)crictl(kubernetes)
查看运行的容器docker psctr task ls/ctr container lscrictl ps
查看镜像docker imagesctr image lscrictl images
查看容器日志docker logscrictl logs
查看容器数据信息docker inspectctr container infocrictl inspect
查看容器资源docker statscrictl stats
启动/关闭已有的容器docker start/stopctr task start/killcrictl start/stop
运行一个新的容器docker runctr run无(最小单元为pod)
打标签docker tagctr image tag
创建一个新的容器docker createctr container createcrictl create
导入镜像docker loadctr image import
导出镜像docker savectr image export
删除容器docker rmctr container rmcrictl rm
删除镜像docker rmictr image rmcrictl rmi
拉取镜像docker pullctr image pullctictl pull
推送镜像docker pushctr image push
登录或在容器内部执行命令docker execcrictl exec
清空不用的容器docker image prunecrictl rmi --prune
  • 更多命令操作,可以直接在命令行输入命令查看帮助。
[root@master01 ~]#  docker --help
[root@master01 ~]#  ctr --help
[root@master01 ~]#  crictl --help
  • 由于Containerd也有namespaces的概念,对于上层编排系统的支持,ctr 客户端 主要区分了3个命名空间分别是k8s.iomobydefault,以上我们用crictl操作的均在k8s.io命名空间,使用ctr 看镜像列表就需要加上-n参数。crictl是只有一个k8s.io命名空间,但是没有-n参数。

【温馨提示】ctr images pull 拉取的镜像默认放在default,而crictl pull 和 kubelet 默认拉取的镜像都在k8s.io命名空间下。所以通过ctr导入镜像的时候特别注意一点,最好指定命名空间。

# 注意-n不能放在命令最后面,下面几行查看的镜像是一样的
[root@master01 ~]#  ctr -n=k8s.io image ls
[root@master01 ~]#  ctr -n k8s.io image ls

# crictl 没有-n参数,操作都在`k8s.io`命名空间下。
[root@master01 ~]#  crictl image ls
[root@master01 ~]#  crictl images
# crictl image list = ctr -n=k8s.io image list
# crictl image ls = ctr -n=k8s.io image ls
# crictl images = ctr -n=k8s.io image list
# crictl images = ctr -n=k8s.io image ls

# 使用ctr命令指定命名空间导入镜像
[root@master01 ~]# ctr -n=k8s.io image import dashboard.tar

#查看镜像,可以看到可以查询到了
[root@master01 ~]#  crictl images

在这里插入图片描述

3、container 客户端工具 nerdctl

推荐使用nerdctl,使用效果与docker命令的语法一致
github下载链接:https://github.com/containerd/nerdctl/releases

  • 精简 (nerdctl–linux-amd64.tar.gz): 只包含nerdctl
  • 完整 (nerdctl-full–linux-amd64.tar.gz): 包含 containerd, runc, and CNI等依赖

nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。具体看nerdctl。

在这里插入图片描述
延迟拉取镜像功能可以参考这篇文章:Containerd 使用 Stargz Snapshotter 延迟拉取镜像

1、安装 nerdctl(精简版)
[root@master01 ~]#  wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz
# 解压
[root@master01 ~]#  tar -xf nerdctl-0.22.2-linux-amd64.tar.gz

[root@master01 ~]#  ln -s /opt/Kubernetes/nerdctl/nerdctl /usr/local/bin/nerdctl
2、安装 nerdctl(完整版,这里不装)
[root@master01 ~]# wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gz
[root@master01 ~]# tar -xf nerdctl-full-0.16.0-linux-amd64.tar.gz -C /usr/local/
[root@master01 ~]# cp /usr/local/lib/systemd/system/*.service /etc/systemd/system/

启动服务buildkit

[root@master01 ~]#  systemctl enable  buildkit containerd --now
[root@master01 ~]#  systemctl status buildkit containerd
3、安装 buildkit 支持构建镜像

buildkit GitHub地址: https://github.com/moby/buildkit

使用精简版 nerdctl无法直接通过containerd构建镜像,需要与buildkit组全使用以实现镜像构建。当然你也可以安装上面的完整nerdctl;buildkit项目是Docker公司开源出来的一个构建工具包,支持OCI标准的镜像构建。它主要包含以下部分:

  • 服务端buildkitd,当前支持runc和containerd作为worker,默认是runc;
  • 客户端buildctl,负责解析Dockerfile,并向服务端buildkitd发出构建请求。

buildkit是典型的C/S架构,client和server可以不在一台服务器上。而nerdctl在构建镜像方面也可以作为buildkitd的客户端。

# https://github.com/moby/buildkit/releases
wget https://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz

tar -xf buildkit-v0.10.4.linux-amd64.tar.gz  -C /usr/local/

配置buildkit的启动文件,可以从这里下载:https://github.com/moby/buildkit/tree/master/examples/systemd
buildkit需要配置两个文件

  • /usr/lib/systemd/system/buildkit.socket
cat > /usr/lib/systemd/system/buildkit.socket <<EOF
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Socket]
ListenStream=%t/buildkit/buildkitd.sock
SocketMode=0660
[Install]
WantedBy=sockets.target
EOF
  • /usr/lib/systemd/system/buildkit.service
cat > /usr/lib/systemd/system/buildkit.service << EOF
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit
[Service]
# Replace runc builds with containerd builds  
ExecStart=/usr/local/bin/buildkitd --addr fd://
[Install]
WantedBy=multi-user.target
EOF

启动buildkit

systemctl daemon-reload
systemctl enable buildkit --now

在这里插入图片描述

4、实战操作

1、修改containerd配置文件
containerd config default > /etc/containerd/config.toml

配置如下:

[plugins."io.containerd.grpc.v1.cri".registry]
      config_path = ""

      [plugins."io.containerd.grpc.v1.cri".registry.auths]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".tls]
          insecure_skip_verify = true  #跳过认证
          ca_file = "/etc/containerd/myharbor-minio.com/ca.crt"
        [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.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."myharbor-minio.com"]
          endpoint = ["https://myharbor-minio.com"]

在这里插入图片描述
重启containerd

#重新加载配置
systemctl daemon-reload
#重启containerd
systemctl restart containerd

注意:这个配置文件是给crictlkubelet使用,ctr是不可以用这个配置文件的,ctr 不使用 CRI,因此它不读取plugins."io.containerd.grpc.v1.cri"配置。

2、ctr 拉取推送镜像
# 推送镜像到harbor
ctr --namespace=k8s.io images push myharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0 --skip-verify --user admin:Harbor12345

# --namespace=k8s.io 指定命名空间,不是必须,根据环境而定
# --skip-verify 跳过认证
# --user 指定harbor用户名及密码

ctr  images pull --user admin:Harbor12345  --tlscacert=/etc/containerd/myharbor-minio.com/ca.crt myharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0

不想-u user:password每次必须使用 ctr pull/ctr push, 可以使用nerdctl

3、镜像构建
cat > Dockerfile <<EOF
FROM nginx:alpine
RUN echo 'Hello Nerdctl From Containerd' > /usr/share/nginx/html/index.html
EOF

然后在文件所在目录执行镜像构建命令:

# 不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下
nerdctl -n k8s.io build -t nginx:nerctl -f ./Dockerfile . 
### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
#  --no-cache:不缓存

在这里插入图片描述

4、打标签 tag
# crictl没有tag命令,只能使用nerdctl和ctr,必须指定命名空间,要不然kubelet无法使用。
ctr -n k8s.io i tag 
nerdctl -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctl
# ctr -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctl
# 查看镜像
nerdctl  -n k8s.io  images myharbor-minio.com/bigdata/nginx:nerctl
5、将镜像推送到 Harbor

第一种情况:http方式,配置如下:

# 以下两个哪个都可以
# mkdir -p /etc/docker/certs.d/myharbor-minio.com:443
mkdir -p /etc/containerd/certs.d/myharbor-minio.com:443

cat > /etc/containerd/certs.d/myharbor-minio.com\:443/hosts.toml <<EOF
server = "https://docker.io"

[host."http://myharbor-minio.com:80"]
  capabilities = ["pull", "resolve","push"]
  #skip_verify = true
  #ca = "ca.crt"   #相对路径
  #ca = "/opt/auth/ca.crt"  #绝对路径
  #ca = ["/opt/auth/ca.crt"]
  #ca = ["ca.crt"]
  #client = [["/opt/auth/nginx.cclinux.cn.crt", "/opt/auth/nginx.cclinux.cn.key"]]

EOF

第一种情况:https方式,配置如下:

# 以下两个哪个都可以
# mkdir -p /etc/docker/certs.d/myharbor-minio.com:443
mkdir -p /etc/containerd/certs.d/myharbor-minio.com:443

cat > /etc/containerd/certs.d/myharbor-minio.com\:443/hosts.toml <<EOF
server = "https://docker.io"

[host."https://myharbor-minio.com:443"]
  capabilities = ["pull", "resolve","push"]
  skip_verify = true
  #ca = "ca.crt"   #相对路径
  #ca = "/opt/auth/ca.crt"  #绝对路径
  #ca = ["/opt/auth/ca.crt"]
  ca = ["/etc/containerd/myharbor-minio.com/ca.crt"]
  #client = [["/opt/auth/nginx.cclinux.cn.crt", "/opt/auth/nginx.cclinux.cn.key"]]
EOF

通过 nerdctl 登录 harbor

echo Harbor12345 | nerdctl login --username "admin" --password-stdin  myharbor-minio.com:443

# nerdctl login --username "admin" --password Harbor12345 myharbor-minio.com:443

# 登出
# nerdctl logout

在这里插入图片描述

开始将镜像推送到harbor

### 推送到Harbor
# --insecure-registry        skips verifying HTTPS certs, and allows falling back to plain HTTP
nerdctl --insecure-registry --namespace=k8s.io push myharbor-minio.com/bigdata/nginx:nerctl
# ctr --namespace=k8s.io images push myharbor-minio.com/bigdata/nginx:nerctl --skip-verify --user admin:Harbor12345

# --namespace=k8s.io 指定命名空间,跟-n一样,不是必须,根据环境而定
# --skip-verify 跳过认证
# --user 指定harbor用户名及密码

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐