k8s 自身原理 1

news2024/11/15 19:59:59

咱们从 pod 一直分享到最近的 Statefulset 资源,到现在好像我们只是知道如何使用 k8s,如何按照 k8s 设计好的规则去应用,去玩 k8s

仔细想想,对于 k8s 自身的内在原理,我们好像还不是很清楚,对于每一个资源背后是如何实现的,我们好像也不得而知

或许也就只知道 k8s 是 golang 写的吧

我认为咱们学习一项技能,一项知识点的学习顺序应该是

  • 学习如何应用,培养自己感觉和兴趣
  • 学习应用背后的内在原理,知晓其细节
  • 能够对其原有功能做二次开发,加入自己的理解

前面基本分享了所有资源的使用方式以及实战,今天开始,我们来逐步了解和分享 k8s 内在自身原理

k8s 基本架构

学习 k8s 的时候,若一开始就学 k8s 的架构和组成,其实吸收的东西会比较少,自己的对于这项技术也没有啥概念,当然这也是一个熟悉的过程,慢慢学着会使用了,再来了解和学习他的原理,效果会更好

k8s 中分为 主节点 master 和 工作节点 worker

我们可以是 1 个 master ,也可以是多 master 的

一般 master 节点会有如下 4 个核心组件:

  • etcd ,用作持久化存储
  • Api Server,提供各种 Restful Api
  • sheduler 调度器
  • controller manager 控制器管理器

woker 节点一般会放这几个组件:

  • kube-proxy kubelet 服务代理
  • kubelet
  • 实际的服务对应的容器

从上图我们就可以知道,k8s 中所有的主控都是 master 节点来进行控制的,实际运行的容器是运行在工作节点上面的

通过上图我们还可以知道,对于 访问和修改 etcd,只有 Api Server 才能够直接去交互,其他的组件都是不能直接访问的

如何在 k8s 中查看上述组件的状态呢?

我们可以使用 kubectl get componentstatuses 即可查看到 k8s 集群中的组件状态,我们也可以写缩写,例如 kubectl get cs

我的当前环境是 minikube,可以暂时可以先不用关注截图中的 error 信息

是不是会有点纳闷,说好的这么多组件,咋没有看到 ApiServer 呢?

都在下面了,我们可以使用 kubetl get po -n kube-system 查看 kube-system 命名空间下的 pod,我们就可以看到关于 apiserver,etcd,controller-manager,kube-proxy,scheduler 等信息了

同样的,我们也可以把这些当成普通的 pod 一样,咱还是可以使用 kubectl describe 或者 kubectl edit 等指令来操作他们

例如:

我们可以尝试命令kubectl edit po etcd-minikube -n kube-system,来查看到 etcd-minikube 的信息

注意,这里一定需要加上 -n kube-system 指定命名空间 ,因为当前我们默认的 命名空间是 default ,如果不在命令中指令命名空间,则 k8s 会去默认的命名空间查找 pod

如果不指定命名空间,那么 k8s 在 default 默认命名空间中找不到 etcd-minikube 这个 pod

我们可以看到,系统组件 etcd,其实在 k8s 运行环境中也是一个正常的 Pod ,我们可以从 pod 清单中可以看到 kind: Pod

spec 中具体的定义,使用了 k8s.gcr.io/etcd:3.5.0.0-0 版本的镜像,以及 启动 改容器,需要自行的命令和参数等等

那么 k8s 的 etcd 是干啥的?

还记得 etcd 我们在微服务开发时候,仅仅是用于存放 key-value 键值对的,那么 k8s 里面又是如何使用 etcd 的呢?

k8s 中的 etcd,是环境中唯一存储集群状态和元数据的地方,相当重要哦

k8s 中的 etcd 是用来存储 k8s 中每个资源清单信息的,例如 pod,RC,Service,私钥,持久化方式等等,呈现方式也是 键值对

并且在 k8s ,如果 1 个 etcd 不够用了,我们也是可以横向扩容,运行多个 etcd 的实例就可以了

前面我们也提到了,在 k8s 中的各个系统组件,只能通过 ApiServer 进行通信,另外 ApiServer 是和 etcd 通信的唯一组件,也就是说 ApiServer 是 etcd 的唯一客户端,其他的组件是没有办法修改 etcd 里面的数据的

这是为什么呢?所有组件都要通过 ApiServer 才能访问和 修改 etcd,这样做是有啥好处呢

好处 1

可以增强 k8s 验证系统的健壮性,来源只有 1 个,简单清晰

好处 2

就只有 etcd 和 Apiserver 交互,不存在其他组件的耦合,那么替换存储机制也是比较方便的

好处 3

k8s 中多 master 的时候,仍然适用于 控制平台操作存储模块的时候,同样是需要通过和 ApiServer 交互,这样咱们的 k8s 集群状态才会总是一致的

k8s 的 Apiserver 具体是做了哪些事情呢?

简单来说 Apiserver 组件主要就是提供 RESTful API ,接收其他组件的请求,对请求的数据做校验,并将请求给到 etcd

例如,查询集群状态,修改 pod ,删除 RS ,创建指定资源等等

细心的 xdm 应该就可以发现,我们是如何访问 ApiServer 的呢?ApiServer 的客户端又是谁呢?

是滴,就是我们一直都在使用的 kubectl,一直以来,我们都在使用 kubectl 来和 ApiServer 进行通信,那么是否会有这样的疑问:

我多开几个 master 的窗口,同时使用 kubectl 创建会有冲突的资源,那么 ApiServer 会如何处理呢?

这一点,xdm 大可放心, ApiServer 自身会有一致性的机制,

第一,就是 ApiServer 是唯一和 etcd 通信的客户端

第二,ApiServer 自身还会处理乐观锁,会保证最终一致性,在并发更新资源的情况下,A 对对象做的更改不会去覆盖 B 对对象做的更改

那么其他组件访问 ApiServer 的时候,ApiServer 内部处理流程是什么样的呢?

  • ApiServer 会去校验客户端是否通过认证
  • ApiServer 会去校验客户端是否通过授权
  • ApiServer 会去校验客户端是否通过准入插件的验证(对资源进行创建,删除,编辑的时候会校验)
  • 若以上都通过了,那么 ApiServer 会将数据给到 etcd,并给客户端做响应

用一个图展示,可以是这样的:

那么 ApiServer 又是如何通知 客户端资源变更的?

你可能会认为是 ApiServer 自己去控制和通知具体的控制器去做事情,并不是的,其实是通过 k8s 内部的监听机制,如图:

当 ApiServer 收到客户端的请求时,ApiServer 校验完成后去更新 etcd,最终会启动对应的控制器,客户端自己会做监听,收到监听的变更信息之后,就会去对应的更新对象了

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

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

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

相关文章

【linux】-进程概念之环境变量的详解(命令行参数的介绍)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

介绍另外一个容器技术, Apptainer

一说到容器,我们往往会脱口而出, Docker, 实际上Docker 仅仅是Linux 容器化的一种, 今天介绍的Apptainer 就是另外一种容器技术。 那么Apptainer 具体是一个什么东西呢? 跟Docker 有什么区别呢? 首先&#…

剑指 Offer !!56 - II. 数组中数字出现的次数 II

剑指 Offer 56 - II. 数组中数字出现的次数 II 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums [3,4,3,3] 输出:4 示例 2:输入:nums …

智慧停车场:城市出行新潮流,轻松驶入未来

在如今城市日益拥堵的交通环境下,停车难题成为人们日常生活中的一大困扰。然而,随着科技的不断进步,智慧停车场的建设正为我们带来更为便捷、高效的出行体验,成为现代城市发展的重要一环。 智慧停车场利用先进的技术手段&#xff…

Nginx安装以及LVS-DR集群搭建

Nginx安装 1.环境准备 yum insatall -y make gcc gcc-c pcre-devel #pcre-devel -- pcre库 #安装openssl-devel yum install -y openssl-devel 2.tar安装包 3.解压软件包并创建软连接 tar -xf nginx-1.22.0.tar.gz -C /usr/local/ ln -s /usr/local/nginx-1.22.0/ /usr/local…

windows 安装免费3用户ccproxy ubuntu 代理上网

Windows 上进行安装 ubuntu 上进行设置 方法一 (临时的手段) 如果仅仅是暂时需要通过http代理使用apt-get,您可以使用这种方式。 在使用apt-get之前,在终端中输入以下命令(根据您的实际情况替换yourproxyaddress和proxyport)。 终…

水果音乐制作软件fl studio汉化中文修改版下载,FL Studio哪个版本更合适新手

水果音乐制作软件fl studio汉化中文修改版下载由兔八哥爱分享小编精心为大家整理了fl studio软件所有版本合集。水果音乐制作软件fl studio汉化中文修改版下载其中包含了fl studio、以及fl studio汉化补丁、fl studio修改程序、fl studio注册机等等,fl studio是一款…

【某SH公E司IN 数据挖掘工程师-提前批笔试2023-8-8】

题目(回忆版): 给一棵树,每个节点要么是白色要么是红色,并且有节点编号,要求查询每个节点所在子树中红色节点的数量。 先是一个正整数 n,表示树有 n 个节点。 第二行给出 n-1 个数字&#xff0…

标准的OSI七层模型(其实了解tcp足矣)

七层模型,亦称OSI(Open System Interconnection)。参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。 它是一个七层的、抽象的模型体&#x…

Mermaid语法使用

Mermaid语法使用 1. 基础类1.1 流程图1.2 时序图 2. 工程图2.1 类图2.2 Git图 1. 基础类 1.1 流程图 graph TBid1(圆角矩形)--普通线-->id2[矩形];subgraph 子图id2粗线>id3{菱形}id3-. 虚线.->id4>右向旗帜]id3--无箭头---id5((圆形))end方向定义 用词含义TB从…

Spring(13) IOC的工作流程

目录 一、定义二、Bean的声明方式三、IOC的工作流程 一、定义 IOC:全称是 Inversion Of Control,也就是控制反转,它的核心思想是把对象的管理权限交给容器。应用程序如果需要使用某个对象的实例,那么直接从 IOC 容器里面去获取就…

Win10无法投影关闭3D模式

Win10不小心开启了3D模式,插上投影仪就一闪一闪的,无法正投影 解决办法: 1. 打开注册表工具regedit,删除以下注册表,重启电脑 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configurat…

PAT(Advanced Level) Practice(with python)——1023 Have Fun with Numbers

Code N int(input()) D_N 2*N # print(Yes)if len(str(D_N))>len(str(N)):print(No) else:for s in str(D_N):if s not in str(N) or str(D_N).count(s)!str(N).count(s):print("No")breakelse:print(Yes) print(D_N)

R语言5_安装Giotto

环境Ubuntu22/20, R4.1. 已开启科学上网。 第一步,更新服务器环境,进入终端,键入如下命令, apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev libhdf5-dev libmagick9-dev …

第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

deque插入和删除 功能描述: 向deque容器中插入和删除数据 函数原型: 两端插入操作: push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…

flutter开发实战-TextPainter计算文本内容的宽度

flutter开发实战-TextPainter计算文本内容的宽度 最近开发过程中根据Text文本的大小判断是否需要进行显示跑马灯效果,获取文本的大小,需要TextPainter来获取Size 一、TextPainter TextPainter主要用于实现文本的绘制。TextPainter类可以将TextSpan渲染…

【从零开始学习JAVA | 第四十四篇】TCP协议中的握手与挥手

前言: TCP(传输控制协议)作为计算机网络中的重要协议,扮演着确保数据可靠传输的角色。在TCP的通信过程中,握手与挥手问题是不可忽视的关键环节。握手是指在建立连接时,客户端与服务器相互确认彼此的身份并…

Json简述(C++)

目录 1.介绍 2.格式 3.底层 3.1数据对象表示 3.2序列化接口 3.3反序列化接口 4.使用 1.介绍 Json(JavaScript Object Notation)是一种轻量级的数据交换格式,其最早是为JavaScript编程语言设计的格式。不过发发展至今,Jso…

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目录 [RoarCTF 2019Online Proxy]sql巧妙盲注解题脚本脚本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解题 在源代码界面发现:Current Ip 我们会联想到:X-Forwarded-For来修改ip: 结果我们发现,response会讲Last Ip回显出…