【探索 Kubernetes|集群搭建篇 系列 5】简化 Kubernetes 的部署,深入解析其工作流程

news2024/10/7 14:23:37

前言

大家好,我是秋意零。

在前面 4 个章节中,我们充分了解了容器技术和 Kubernes 原生时代引擎的架构和设计思想,今天分享的主要内容是,探索 Kubernetes 部署,深入解析其工作流程

👿 简介

  • 🏠 个人主页: 秋意零
  • 🧑 个人介绍:在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国赛”,并斩获多项奖项荣誉证书
  • 🎉 目前状况:24 届毕业生,拿到一家私有云(IAAS)公司 offer,暑假开始实习
  • 🔥 账号:各个平台, 秋意零 账号创作者、 云社区 创建者
  • 💕欢迎大家:欢迎大家一起学习云计算,走向年薪 30 万

系列文章目录


【云原生|探索 Kubernetes-1】容器的本质是进程
【云原生|探索 Kubernetes-2】容器 Linux Cgroups 限制
【云原生|探索 Kubernetes 系列 3】深入理解容器进程的文件系统
【云原生|探索 Kubernetes 系列 4】现代云原生时代的引擎



正文开始

  • 快速上船,马上开始掌舵了(Kubernetes),距离开船还有 3s,2s,1s…
    在这里插入图片描述

文章目录

  • 前言
  • 系列文章目录
  • 一、解决部署 Kubernetes 复杂性问题
  • 二、kubeadm 为什么没有容器化部署 kubelet ?
  • 三、kubeadm init 工作流程
    • Preflight Checks
    • 生成证书文件
    • 生成访问 kube-apiserver 所需的配置文件
    • kubeadm 为运行在 Master 上的组件生成 Pod 配置文件
    • configmap(cluster-info)
    • 安装默认插件
  • 四、kubeadm join 的工作流程
  • 五、配置 kubeadm 部署参数
  • 总结
  • 留个问题

一、解决部署 Kubernetes 复杂性问题

万事开头难,Kubernetes 项目的部署一直以来都是初学者的 “拦路虎”。起初用户部署需要二进制安装,除了将各个组件编译成二进制文件外,复制二进制文件编写对应的配置文件,配置启动服务脚本以及对 kube-apiserver 配置授权文件等繁琐的步骤。

在 kubeadm 部署工具诞生之前,一般使用 Ansible、SlatStack等自动化运维工具部署 Kubernetes 项目。但是使用自动化工具还是比较繁琐,在使用 Ansible、SlatStack 或其他自动化工具之前,首先需要学习它们,而它们的学习成本都不低于 Kubernetes 项目,有可能还会更高。

这种情况下就急需一种简单部署 Kubernetes 项目的工具。2016年6月社区许多用户表达了 Kubernetes 部署的复杂性,直到2017年1月:kubeadm 项目在 Kubernetes 1.5 版本中首次发布为实验性功能。

kubeadm 的主要目标是提供一个简化的部署流程,而这个流程可以简化为下列两条命令,即可部署完 Kubernetes 项目:

  • 1.初始化集群:用户在 master 控制节点,使用 kubeadm init 命令初始化一个空白的 Kubernetes 集群,kubeadm 会自动生成所组件需要的证书和密钥,并容器部署配置 etcd、kube-apiserver、kube-controller-manager 和 kube-scheduler 的初始化工作;
  • 2.加入集群:用户在 node 计算节点,使用 kubeadm join 命令将 node 计算节点加入到 Kubernetes 集群中。这个命令使用主节点生成的连接令牌,使得其他节点能够自动连接到集群并完成加入过程。

这样一看 Kubernetes 的部署过程,是不是非常方面啊?

需要注意的是:在执行 kubeadm init 初始化集群之前,需要关闭交换分区、开启 ipv4(ipv6) 桥接流量转发、安装 Docker(或其他容器项目)、配置 Cgroup 类型与容器运行时的类型(如:systemd)一致等基础环境配置。如果您不清楚的话,可以查看下面这篇哦!!

配置基础环境和部署 Kubernetes 集群,可以查看这篇:部署kubernetes-v1.25.3(k8s)- 基于containerd容器运行时

二、kubeadm 为什么没有容器化部署 kubelet ?

使用 kubeadm 部署 Kubernetes 集群时,你会发现容器化部署并没有 kubelet 的身影。

coredns 组件: 用于 Kubernetes 集群中的 DNS服务器和服务发现组件。
kube-proxy 组件:主要负责实现 Kubernetes 服务的网络代理和负载均衡功能。

在这里插入图片描述

为什么 kubelet 没有使用容器化部署呢?

深入探究 Kubernetes 这个系列专栏中,在 第 4 篇文章介绍过,kubelet 组件需要和 CRI、Device Plugin、CNI、CSI 接口交互,而这些接口下层操作务必需要操作宿主机系统,如果 kubelet 使用容器化部署,那么直接操作宿主机就会变得非常麻烦。

  • 对于网络配置来说还好,kubelet 容器可以通过不开启 Network Namespace(即 Docker 的 host network 模式)的方式,直接共享宿主机的网络栈;
  • 可是,要让 kubelet 隔着容器的 Mount Namespace 和文件系统,操作宿主机的文件系统,就有点儿困难了。比如:在容器中执行 mount -t nfs 命令,由于被隔离在了单独的 Mount Namespace,kubelet 做的挂载操作,不能被 “传播” 到宿主机上。

因上所述,Kubeadm 并没有把 kubelet 也部署在容器中,而是直接运行在宿主机上。所以我们在使用 kubeadm 的第一步,是在宿主机上执行 yum install -y kubeadm kubelet kubectl 命令安装。

三、kubeadm init 工作流程

Preflight Checks

在执行 kubeadm init 命令后,为保证 Kubernetes 集群正常部署完成,kubeadm 首先是进行一些列的环境检查,这个检查步骤,我们称为:“Preflight Checks”。

  1. Linux 内核的版本是否是 3.10 以上
  2. Linux Cgroups 模块是否可用?
  3. 机器的 hostname 是否标准?在 Kubernetes 项目里,机器的名字以及一切存储在 Etcd 中的 API 对象,都必须使用标准的 DNS 命名(RFC 1123)。
  4. 用户安装的 kubeadm 和 kubelet 的版本是否匹配?
  5. Kubernetes 的工作端口 10250/10251/10252 端口是不是已经被占用?
  6. 检查节点的 CPU 资源是否满足要求。
  7. 检查节点上的 SELinux 配置是否与 Kubernetes 兼容。
  8. 检查节点的防火墙规则是否允许 Kubernetes 组件之间的通信。
  9. 检查节点的系统时间是否与其他节点同步。
  10. 更多 Checks 信息参考. . . . . .

生成证书文件

Preflight Checks 之后,生成 Kubernetes 对外提供服务所需的各种证书和对应的目录。
Kubernetes 对外提供服务时,除非开启 “不安全模式”,否则都是通过 HTTPS 才能访问 kube-apiserver,由于是 HTTPS 协议,就需要为 Kubernetes 集群配置好证书文件。

kubeadm 生成的证书文件都放在 Master 控制节点的 /etc/kubernetes/pki/ 目录下,在这个目录下,最主要的证书文件是 ca.crt 和对应的私钥 ca.key。

在这里插入图片描述
用户使用 kubectl 操作容器时,需要通过 kube-apiserver 向 kubelet 发起请求,这个连接也必须时安全的。kubeadm 为这一步生成的是 apiserver-kubelet-client.crt 文件,对应的私钥是 apiserver-kubelet-client.key。

生成访问 kube-apiserver 所需的配置文件

证书生成后,kubeadm 接下来会为其他组件生成访问 kube-apiserver 所需的配置文件。这些文件的路径是:/etc/kubernetes/xxx.conf

  • 这些文件中记录了,当前这个 Master 节点的服务器地址、监听端口、证书目录等信息。这样,对应的客户端(这里如:scheduler,kubelet 组件),可以直接加载相应的文件,使用里面的信息与 kube-apiserver 建立安全连接了。

在这里插入图片描述

kubeadm 为运行在 Master 上的组件生成 Pod 配置文件

Kubernetes 有三个 Master 组件 kube-apiserver、kube-controller-manager、kube-scheduler,并使用 Pod 的方式部署起来。Etcd 和这三个组件 Pod 的 YAML 文件存放路径为:/etc/kubernetes/manifests/,这种以文件保存,并使用文件启动 Pod 的方式被称为:“Static pod”。
在这里插入图片描述
上面这些 YAML 文件及保存的位置,被 kubelet 监视,kubelet 就会自动创建这些 YAML 文件中定义的 Pod。

Master 容器启动后,kubeadm 会通过检查 https://localhost:6443/healthz 这个 Master 组件的健康检查 URL,等待 Master 组件完全运行起来。检查完之后,kubeadm 就会为集群生成一个 bootstrap token(引导令牌)。在后面,只要持有这个 token,任何一个安装了 kubelet 和 kubadm 的节点,都可以通过 kubeadm join 加入到这个集群当中。

可以通过 kubeadm token create --print-join-command 命令生成 Node 节点加入集群的命令 token。

在这里插入图片描述
在这里插入图片描述

configmap(cluster-info)

在 token 生成之后,kubeadm 会将 ca.crt 等 Master 节点的重要信息,通过 ConfigMap 的方式保存在 Etcd 当中,供后续部署 Node 节点使用。这个 ConfigMap 的名字是 cluster-info。

安装默认插件

kubeadm init 的最后一步,就是安装默认插件。Kubernetes 默认 kube-proxy 和 coredns 这两个插件是必须安装的。kube-porxy 采用 Deamonset 方式部署,coredns 采用 Deployment 方式部署。

  • kube-proxy:提供整个集群外的服务发现,如 service 的 nodeport 暴露策略是提供 Kubernetes 集群以外的其他服务的发现访问,但是需要提供七层代理的话这时候就需要采用 ingress 的插件来实现;
  • coredns :提供 DNS(域名解析) 功能,给 K8S 整个集群内部的 pod 直接的访问。

总结:kube-proxy 对集群外、coredns 对集群内

大佬求解:

这两个插件 YAML 文件按道理来说,对应 YAML 是会存在宿主机上的,查阅了资料说: /etc/kubernetes/manifests/ 目录下的文件,可能存在的 coredns.yaml 和 kube-proxy.yaml 文件。但是我自己集群上并没有对应的文件,我使用的 Kubernetes 集群版本为 v1.23.1 和 v1.25.3。

四、kubeadm join 的工作流程

kubeadm init 生成 bootstrap token(引导令牌)之后,就可以在安装了 kubelet 和 kubeadm 的机器上执行 kubeadm join 加入集群的命令了。

为什么我们需要生成这样一个令牌呢?

想要成为 Kubernetes 集群中的一个节点,就必须在集群的 kube-apiserver 上注册。但是,跟 kube-apiserver 打交道,这台机器就必须要获取到相应的证书文件(CA 文件)。为了实现一键安装,就不能让用户去 Master 节点上手动拷贝这些文件。

这种情况下,kubeadm 至少需要发起一次 “不安全模式” 的访问到 kube-apiserver,从而拿到保存在 ConfigMap 中的 cluster-info(它保存了 APIServer 的授权信息)。有了 bootstrap token,就可以发起这种 “不安全模式” 的访问到 kube-apiserver,并且通过安全验证。

只要有了 cluster-info 里的 kube-apiserver 的地址、端口、证书,kubelet 就可以以 “安全模式” 连接到 apiserver 上,这样一个新的节点就部署完成了。

五、配置 kubeadm 部署参数

我们怎么实现,定制我的集群组件参数呢?

推荐:使用 kubeadm config print init-defaults > kubeadm.yaml 命令生成定制集群文件:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

这样我们在使用 kubeadm init 初始化时,就使用下列这条命令即可:

kubeadm init --config kubeadm.yaml

总结

这里,我们分享了 kubeadm 部署 kubernetes 的使用方式。

我们从为何出现 kubeadm,解决了什么问题开始了我们这篇文章的开头。然后我们了解到 kubeadm 部署 Master 组件方式时采用容器化部署,而为什么 kubelet 组件没有采用容器化部署的原因。

最后,我们聊了聊 kubeadm 的 init 工作过程和 join 工作过程。init 工作过程大致上就是:检查环境、生成证书,配置访问 apiserver 的配置文件、以 Pod 部署方式部署 Master 组件。

通过这些,我们应该对 kubeadm 部署 Kuberentes 的方式有一个充分的认识。

留个问题

kubeadm 部署 Kubernetes 集群的方式,可以应用到生产环境当中吗?

欢迎给位大佬在评论区讨论交流!(我会在评论区中或者下一篇文章中给出答案)

在这里插入图片描述

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

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

相关文章

OpenCV 项目开发实战--对图像进行对齐 (ECC)-附带 ( C++ / Python )代码实现

文末附基于Python和C++两种方式实现的测试代码下载链接 图 1. 左图:来自 Prokudin-Gorskii 收藏的图像。右:相同的图像,通道对齐。 左边的图片是名为Prokudin-Gorskii收藏的历史照片集的一部分。这张照片是一位俄罗斯摄影师在 1900 年代早期使用早期彩色相机拍摄的。由于相…

升级丨AMAA汽车社媒营销归因升级,提升ROI还用愁吗?

“如其抱怨,不如享受卷的过程。昨天的手机行业,就是今天的汽车行业。” “以后国内可能只剩下五个 ‘东西南北中’,打麻将一样。” 在刚结束不久的2023年中国汽车重庆论坛(CACS)上,来自车企大佬们的“声音…

【JVM】JVM 判断对象存活算法(引用计数算法与根可达性分析算法)

文章目录 引用计数算法介绍问题 根可达性分析算法介绍GC Root 在 JVM 中,需要检查出还有哪些存活对象(就是哪些对象还在使用),哪些未存活对象,未存活对象又被称之为垃圾对象,只有知道了哪种是垃圾对象&…

实战必看!工程项目中简单高效的示教编程

大家好,我是华山自控编程朱老师 示教编程是一种简单高效的方法,通过可视化界面和图像采集,可以指导编程操作,提高生产效率。 在本视频中,我们将分享一个项目,重点介绍如何进行简单高效的示教编程。 实战必…

端午节到了,用Python画一个粽子吧!

文章目录 粽子曲面真粽子曲面正弦曲面 粽子曲面 之前通过matplotlib绘制了圆锥曲面,但matplotlib绘制曲面图有几个问题,其中plot_surface需要有规范的xOy坐标,然后根据其坐标绘制z轴参数;plot_trisurf则必须有明确的三角面的顶点…

【AI人工智能】你们都是用它来干嘛?

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

基于Python的接口自动化测试框架

目录 前言: 项目背景 工具选择 框架思路 第三方库介绍 代码实现 不足之处 前言: Python是一种流行的编程语言,Python的易学性和易用性使得它成为编写接口自动化测试框架的理想选择。在Python中,有许多库可以帮助我们执行HTTP请求…

【探索 Kubernetes|作业管理篇 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法

前言 大家好,我是秋意零。 本专栏上一篇中,我们介绍了 Pod 的核心思想以及 Pod 的工作原理。今天我们还是探讨 Pod ,聊一聊 Pod 的基本概念。 👿 简介 🏠 个人主页: 秋意零🧑 个人介绍&#x…

Centos7安装OpenJDK8到指定目录

系统配置 阿里云轻量应用服务器(Linux, centos7.9 x64) 安装步骤 1、官方下载OpenJDK 1.8 Java Platform, Standard Edition 8 ReferenceImplementations 2、通过WinScp工具,将下载好的安装包,上传到服务器 WinScp下载地址&…

ES7、ES8、ES9、ES10、ES11、ES12都增加了那些新特性?

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 ES7 ES2016(ES7)中新增了如下特性👇 Array.prototype…

批量压缩和修复Access数据库 Batch Access Database Compactor Crack

批量压缩和修复Access数据库 Batch Access Database Compactor 快速压缩和修复访问数据库。它是一个批处理Access数据库压缩程序,可以在不安装Office的情况下压缩和修复Access数据库。 Batch Access数据库压缩程序是一种软件工具,正如其标题所示&#x…

AC电源延长转换线:同为科技(TOWE)品牌,专注品质,安全连接

AC电源转换线虽是连接用电设备的一个配件,结构也相对简单,然而对用电设备的安全稳定运行起着重要的作用。AC电源转换线是通过电压较高的交流电的线材,因此产品质量需要具有一定安全标准。 即使AC电源转换线结构并不十分复杂,但也不…

学会使用这些Lumion照片级渲染技巧,秒出大片

Lumion 是一种渲染软件,可帮助建筑师以清晰、感性的方式传达他们的设计。十年来,人们发现 Lumion 的每个新版本都有新的功能、工作流程和控制方法。他们可以在 Revit、SketchUp 或其他 BIM 程序等软件中建模,并将模型导入 Lumion 进行渲染&am…

隐语“官网”新版上线!彩蛋连连,速来探索

距2022年7月隐语开源马上就要1周年啦🎉~隐语官网也迎来了2.0全新大改版。为了方便用户快速找到所需的文档,我们新增了“关键词”检索功能。前往官网,立即体验 https://www.secretflow.org.cn~还有惊喜彩蛋等你来探索&a…

国内精选五大优质互联网理财软件app最新排名(综合测评)

随着移动网络技术的飞速发展和大众经济水平的逐渐提高,现在市场上有很多互联网理财软件,选择一款好的软件是非常重要的。首先,要确保软件的安全性和可靠性,因为金融交易需要非常高的安全保障。 其次,要考虑软件的交易…

Channel通道使用进阶:通道关闭原则、生产者消费者问题、高并发map

1.Channel情况总结 在进行Channel通道使用之前,先根据总结有缓冲型channel使用的情况,若对下表有疑问可以前往Golang Channel 实现原理与源码分析进行阅读,如下所示: 从上表中我们可以发现,若我们已经对channel初始化…

测试老鸟整理,Selenium自动化测试POM模式分层实战(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 POM是Page Object…

3. SpringCloudAlibaba、nacos 实现配置中心

一、微服务中配置文件的问题 1.1 配置文件的问题: 配置文件的数量会随着服务的增加持续递增单个配置文件无法区分多个运行环境配置文件内容无法动态更新,需要重启服务 1.2 引入配置中心 引入配置中心:刚才架构就会成为这样。是由配置中心统…

ASP.NET Core Web API入门之二:Swagger详细使用路由设置

ASP.NET Core Web API入门之二:Swagger详细使用 一、引言二、Swagger的作用以及优点2.1 作用2.2 优点 三、API接口添加注释3.1 编辑项目文件3.2 修改 Startup.cs 文件的 ConfigureServices 方法3.3 修改浏览器的网页标题3.4 注册路由中间件3.4 接口添加注释 四、运行…

基于html+css的图展示125

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…