关于k8s集群高可用性的探究
1. k8s的高可用的核心是什么?
说到核心、本质
意味着要从物理层来考虑技术
k8s是一个容器编排管理工具,k8s受欢迎的时机
是docker容器受欢迎时,因为太多的docker容器,管理起来是一个大工程
那么刚好k8s是google自己用了十来年的borg系统的开源版
google早就用这个来编排管理容器了,所以开源之后,竞品也选择了支持k8s
一起发展
google把这个开源并给了cloud native computing foundation云原生基金会之后
还给了一个项目,算是cloud native foundation云原生基金会的第二个项目
是borgmon,全称是 borg monitor,borg的班长,borg的监视器,也就是borg的监控
borg变成了k8s
borgmon变成了prometheus
这也是为什么监控k8s集群,基本上都是用prometheus了。
那么k8s高可用的核心本质是什么呢?
是容器镜像和数据库
image 和 etcd
如果一个k8s集群的image是ok的,etcd是ok的
整个集群暂时由于计算压力也好,网络问题也好,暂时休息了
那么用image和etcd就可以快速恢复集群。
image属于生产资料级别的东西
可以认为,对于计算机来讲,最底层的价值生产资料是物理层的设备
具体来讲,主要是光、电、半导体材料。
我们不延伸,因为精密如芯片,也是由半导体材料来实现,包括光
比如极紫外光
那么计算机的底层原来是电荷记录数据,光纤和铜缆传输电荷记录的数据,
半导体材料存储电荷,和高低电荷的各种逻辑运算,加减乘除,与或非
这些东西是计算机通用的底层
那么k8s的底层是什么
k8s是在物理硬件(光、电、半导体材料)的基础上,以容器镜像image为生产资料
产生一大堆的pod,对于pod不够清晰的管理员来讲,理解为容器,也可以,更加直观
因为pod里面的核心是主容器
虽然主容器还带着一堆小弟
比如打前站的initcontainer,初始化容器
开局热场选手,poststart hook 开始后的钩子函数,
用脚本要把什么服务开局的时候搞起来;
散会的时候,prestop hook 停止前的钩子函数,主容器关闭的时候要干点什么,
用自定义脚本写进去。
还有三个容器探针
就跟三个上级一样,一个人干活,三个人管
一个主容器干活,三个探针管着它
startupprobe,监控主容器启动的时候,什么服务跟着启动了没
没启动的话,怎么搞?资源文件里面的自定义脚本写出来
startupprobe这个上级就开始按着这个脚本管理主容器了
如果主容器没有实现它开局要弄的效果,它就会决定怎么搞
重启主容器还是怎么样
livenessprobe,意思是容器还在转着没,running没,
如果容器没有在转着,那么它就去用镜像重建容器还是怎样,
如果容器在正常跑着,容器里面装的就是进程
容器就是这个进程需要的依赖环境,包括环境变量什么的
但是不包括操作系统,这也是容器化和虚拟化本质的区别之一
比较重要,虚拟化是得给虚拟机搞出来一个虚拟操作系统
虽然这个虚拟操作系统的很多东西可以直接用真机操作系统的
但总归是得搞出来个虚拟操作系统给虚拟机用
而容器化不需要这个
容器里面就是什么环境变量啊、依赖包啊
比如nginx进程的容器,需要nginx的主程序
nginx软件包的那一堆东西,包括一些要用的nginx模块
比如stub_states_on,统计网站访问数据的这个功能模块
就是这些必须要有的东西,得弄到镜像里,起容器的时候
把这些0和1读起来,产生一个读写层
读写层再怎么折腾,跟镜像没关系
因为镜像是只读的一层一层的文件
容器是在这个只读层上面再新建一个读写层
除非要用容器做镜像,否则容器再怎么折腾
不影响产生容器的模版,也就是镜像这个多层的只读文件。
还有一个readinessprobe,字面意思上也可以看出来
就是ready了还是没ready?
谁ready了还是没ready?
就是主容器
因为这个readinessprobe探针,也是主容器的上级
等于它有三个上级,
startupprobe 管容器启动情况
livenessprobe 管容器运行情况
readinessprobe 管容器准备好跑服务了没
如果没就怎样,探针资源文件里面写了嵌入式脚本
如果都ok,那就ok
这三个探针和两个钩子函数和初始化容器
和核心的主容器
都是放在pod里面的东西
所以pod可以理解为一个主容器和它的领导以及伙伴们。
-------------------------------------------------------------------------------------
再说回k8s高可用的核心
k8s要跑任务,真正在一线干活的是主容器
其它很多都是辅助,后勤,还有很多领导
那么从跑计算任务的角度来讲
主容器是核心
那么主容器的核心又是什么呢?
就是镜像了,image
只要镜像ok
那么主容器就可以ok
用runtime拿着镜像跑容器就行了
这个相对来说不难
因为runtime现在默认的是containerd
可以理解为一个符合oci标准的docker
docker run 就能跑容器
containerd 也能run
跑容器出来
podman这个管容器的程序,也可以
所以核心不是docker还是containerd、podman
核心是这个镜像
如果是官方镜像,那么从官方拉一个也不是特别麻烦
如果是自定义的镜像,而且自定义的配置有点多,这个镜像的高可用就比较重要
用私有镜像仓库harbor来管理自己的私有镜像
而harbor是一个服务,用程序运行的服务
harbor支持分布式,所以,项目镜像数据非常重要的时候,
配置harbor仓库的分布式高可用,是一个比较重要的点,
对于k8s的高可用来说。
-------------------------------------------------------------------------------------------
对于k8s的高可用的另一个核心,是etcd数据库
etcd数据库里面存放的是k8s集群的各种各样状态信息
谁干了什么,哪个组件又怎么样了,怎么配置的,怎么使用的
kube-apiserver忙来忙去都忙了写什么
各个节点都在干啥
各个pod都在干啥
什么服务什么时候干了什么
这些事情,都记录在etcd数据库里面
所以,其他服务,不管是计算的还是监控的,还是利用内核,在内核那注册服务的kube-proxy这些
可以简单这么理解,k8s集群上所有产生数据的动作都在etcd数据库里面记录了
那么如果k8s集群因为什么原因,休息了
那么etcd数据库是ok的
就可以利用etcd数据库里面的数据来恢复集群
跟那个mysql数据库的binlog日志有点像
只要是写的操作,就记录在这个binlog日志里面
mysql的主从同步就是从机器用io线程从主机器那里把binlog日志读过来
然后在从机器上用sql线程把这个binlog日志重跑一遍
那么数据库所有写操作的东西就复制过来了
而binlog日志,其实是binary log
也就是二进制的日志,可以理解为各种0和1的组合
的日志,对于数据库来讲,记录的是写操作的数据,
把这些跑一遍,数据库就备份了。
那么etcd数据库是k8s高可用的核心
所以k8s要做成高可用集群
核心就是etcd数据库高可用
和harbor仓库高可用
这两个都可以单点跑
也可以做成分布式集群
etcd用raft一致性算法来保证数据的一致性和顺序性
所有的写操作都需要通过raft算法达成一致后才能提交
那么把etcd数据库做成高可用,一般是3个节点,如果高可用非常重要
那么就部署5个节点以上
有两种部署方式
一种是把master节点做成3个,每个master节点上
有kube-apiserver scheduler controller-manager etcd
当然也有kube-proxy和kubelet
kube-proxy是旁路模式,调用ipvs内核模块,来进行负载均衡
比如一个clusterip服务创建出来了,那么clusterip通过selector选择器选择
的那些pod,自动进行负载均衡,比如一个clusterip服务,对应着
3个后端pod,那么clusterip服务接到的流量,为什么能够负载均衡的给
pod呢,这个就是kube-proxy干的事
它去找内核模块ipvs说,你看,我这搞了个服务
这个得负载均衡,你给我给这个clusterip生成一个ip地址
就是虚的
然后把这几个后端pod的ip加入到lvs负载均衡集群
就让它们负载均衡的去跑就行了
------------------------------------------------------------------------------------
etcd数据库高可用的另一种方式
是把etcd数据库和k8s集群的master组件不部署在同一个节点上
专门把etcd数据库集群独立出来,搞一个高可用的
etcd数据库集群,k8s集群要读和写数据,就可以etcd数据库交互就可以了
那么这样,
把etcd和harbor仓库都独立出来
虽然harbor仓库本身就是独立的机器
暂且这么说
就会有一个图
前面是一个etcd高可用分布式集群,中间是k8s主节点和计算节点集群,后面是harbor镜像仓库集群
那么,这样一个架构
保证etcd数据库的分布式高可用,后生产资料harbor仓库的分布式高可用
那么整个k8s集群的高可用基本就ok了
看着核心是k8s集群,但是考虑高可用方面来讲
似乎核心不在k8s,而在前面的etcd数据和后面的harbor镜像仓库
这个就跟一些竞争一样
前面的侦测信息
和后面的后勤保障
很重要
说,兵马未动,粮草先行
再说,那啥那啥的是经济
----------------------------------------------------------------------------------------
放到k8s的高可用来说,核心是前面的etcd数据库分布式集群,和后面的harbor镜像仓库分布式集群
有了这个,服务休息了,可以启动,k8s的工作节点怎么样了,也可以直接用数据库恢复服务。
那么问题是,kube-apiserver kube-controller-manager schdeluer,这几个主节点上的核心组件
的配置信息和各种信息怎么办
这些也都在etcd数据库上记录着
关于用kubeadm init初始化集群的时候,我们用到的一些文件信息,需要做备份保存。
-------------------------------------------------------------------------------------------
那么对于k8s集群中,各种资源文件,之前都是自己写的
需要写一个保存一个吗
不用
只要对etcd数据库做了快照备份snapshot save
那么用etcdctl snapshot restore用数据库把集群恢复起来之后
用kubectl get ... -o yaml > filename
就可以把yaml格式的资源文件恢复出来
------------------------------------------------------------------------------------------------
总的来说,做三个步骤
1. etcd数据库的分布式集群,加定期备份快照
2. harbor仓库的分布式集群
3. 初始化集群用到的kubeadm配置文件,kube-apiserver、controller-manager、scheduler的配置文件,证书和密钥文件。做备份。
那么如果k8s集群休息了
k8s集群需要从零开始重新搭建
利用这三个部分的准备工作的内容
就可以从零把集群再恢复起来。
这个也就是k8s高可用的核心部分了。
------------------------------------------------------------------------------------------------
那么针对这些核心内容,要实践中做到高可用,可以用跨地区备份的方式
和多云平台的备份方式,来进一步加强高可用性。
etcd数据库高可用的两种方式:堆叠式和外部式
资料来源:k8s官网
高可用拓扑选项 | Kubernetes本页面介绍了配置高可用(HA)Kubernetes 集群拓扑的两个选项。你可以设置 HA 集群:使用堆叠(stacked)控制平面节点,其中 etcd 节点与控制平面节点共存 使用外部 etcd 节点,其中 etcd 在与控制平面不同的节点上运行 在设置 HA 集群之前,你应该仔细考虑每种拓扑的优缺点。说明: kubeadm 静态引导 etcd 集群。 阅读 etcd 集群指南以获得更多详细信息。堆叠(Stacked)etcd 拓扑 堆叠(Stacked)HA 集群是一种这样的拓扑, 其中 etcd 分布式数据存储集群堆叠在 kubeadm 管理的控制平面节点上,作为控制平面的一个组件运行。每个控制平面节点运行 kube-apiserver、kube-scheduler 和 kube-controller-manager 实例。 kube-apiserver 使用负载均衡器暴露给工作节点。每个控制平面节点创建一个本地 etcd 成员(member),这个 etcd 成员只与该节点的 kube-apiserver 通信。 这同样适用于本地 kube-controller-manager 和 kube-scheduler 实例。这种拓扑将控制平面和 etcd 成员耦合在同一节点上。相对使用外部 etcd 集群, 设置起来更简单,而且更易于副本管理。然而,堆叠集群存在耦合失败的风险。如果一个节点发生故障,则 etcd 成员和控制平面实例都将丢失, 并且冗余会受到影响。你可以通过添加更多控制平面节点来降低此风险。因此,你应该为 HA 集群运行至少三个堆叠的控制平面节点。这是 kubeadm 中的默认拓扑。当使用 kubeadm init 和 kubeadm join --control-plane 时, 在控制平面节点上会自动创建本地 etcd 成员。https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/ha-topology/
这张图能大概说明kube-proxy组件的工作流程,但是也有一点需要清晰。
clusterIP这个服务本身,和这个服务对应的ip,比如10.254.xx.xx
是由kube-apiserver,也就是api服务器来产生的
就是apiserver这个服务器创建了clusterIP这个服务,并且给它了一个预定义范围内的
ip地址,当然这个ip地址也可以固定指定
然后kube-proxy是监听着apiserver的,
一旦apiserver创建了服务
kube-proxy就会去找ipvs内核模块,做出来一个lvs负载均衡规则,
将clusterip和后端pod连起来,并且由负载均衡的规则,比如轮询,加权轮询,最少连接数
--------------------------------------------------------------------------------
那么再说一下,服务本身和服务的ip由apiserver产生
服务到后端的负载均衡由kube-proxy监听apiserver然后找ipvs内核模块
生成负载均衡规则
那么用到ingress,比如为什么可以通过服务名就访问到后端的服务呢
ingress的配置规则就是访问什么url
就给到后端的服务名加端口号
这是怎么连上的呢
是通过coredns的自动注册功能
当apiserver创建一个服务时
coredns会监听着apiserver并感知到这一个行为
coredns会根据服务的元数据生成dns记录
总之,有了dns解析,就可以通过服务名找到具体的服务。
相关文章:

关于k8s集群高可用性的探究
1. k8s的高可用的核心是什么? 说到核心、本质 意味着要从物理层来考虑技术 k8s是一个容器编排管理工具,k8s受欢迎的时机 是docker容器受欢迎时,因为太多的docker容器,管理起来是一个大工程 那么刚好k8s是google自己用了十来年…...

保姆级Pinpoint(APM)实战教程
什么是Pinpoint Pinpoint是由韩国NAVER公司开发并开源的一款应用程序管理工具,主要针对大规模分布式系统进行性能监控和故障诊断。通过跟踪分布式应用程序之间的事务,帮助分析系统的整体结构以及其中的组件是如何相互连接的。 与其对标的还有Twitter的Zi…...
使用SpringBoot自定义注解+AOP+redisson锁来实现防接口幂等性重复提交
1 前提,整合好springboot和redis,redisson的环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 2 编写自定义注解,注解的作用是标记…...
k8s和ipvs、lvs、ipvsadm,iptables,底层梳理,具体是如何实现的
计算节点的功能: 提供容器运行的环境 kube-proxy的主要功能: 术业有专攻, kube-proxy的主要功能可以概括为4个字 网络规则 那么kube-proxy自己其实是个daemonset控制器跑的 每个节点上都有个的pod 它负责网络规则 其实呢 它还是个小…...
三、归一化与标准化
归一化与标准化 前言一、最小最大值归一化1.1 原理(公式)1.2 API 介绍1.2.1 参数介绍1.2.2 属性介绍1.2.3 注意事项1.2.4 代码演示 1.3 举例说明 二、标准化2.1 原理(公式)2.2 API 介绍2.2.1 参数介绍2.2.2 属性介绍2.2.3 注意事项…...

B2105 矩阵乘法
B2105 矩阵乘法 #include <iostream> using namespace std; int main(){int n,m,k;cin>>n>>m>>k;int arr1[n][m];int arr2[m][k];for(auto & line:arr1){for(auto & x: line){cin>>x;}}for(auto & line:arr2){for(auto & x: lin…...

centos之下的mysql8的安装
文章目录 1.mysql.com进入(网址栏)2.xshell操作2.1拖拽上传2.2安装发布包2.3检查情况2.4安装mysql2.5手动启动2.6查看状态2.7查看随机密码2.8登录2.9重置密码 1.mysql.com进入(网址栏) 找下面的这个download按钮: 一直往下面划:找到下面的这个 下面的这个…...

计算机导论
概述 计算机简史 1935年代,英国数学家图灵(Alan Turing)提出“图灵机”,奠定了计算机的理论基础。 1952年,冯诺依曼确定了计算机由运算器、控制器、存储器、输入、输出等5部分组成(Von Neumann 体系结构)。 60年代…...
力扣209-长度最小的子数组-滑动窗口思想
题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&am…...

Xilinx 7系列FPGA PCI Express IP核简介
前言:Xilinx7系列FPGA集成了新一代PCI Express集成块,支持8.0Gb/s数据速率的PCI Express 3.0。本文介绍了7系列FPGA PCIe Gen3的应用接口及一些特性。 1. PCI Express规范演进 PCIe是一种高速串行计算机扩展总线标准,旨在替代传统的PCI和AG…...
红包雨html
1、分享一个红包雨html代码。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>红包雨小游戏</ti…...
js 基础补充3
1. 闭包 在函数内部定义的函数,可以访问改函数的属性和方法 私有属性 延长变量的生命周期,更好的避免命名冲突 缺点:内存消耗比较大,不建议频繁使用 2. js 原型 原型链 访问对像的属性方法,不光会在对象上查找还会在…...
Invalid bean definition with name ‘employeeMapper‘ defined in file
参考以下博客: <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version> </dependency> 总结: 1. 拉取老项目的时候要特…...

悦享驾驶,乐在旅途,首选江铃集团新能源易至EV3青春版
金秋时节,天高气爽,正是出游的好时节。不论是家庭自驾游,还是朋友结伴出游,一款好看又好开的车绝对是提升旅行品质的重要因素。江铃集团新能源易至汽车EV3青春版,凭借其超高安全性、便捷操作性、卓越性能,成…...
测试WIFI和以太网的TCP带宽、UDP带宽和丢包率、延时
一、测试TCP、UDP的带宽 作为服务器:iperf3 -s -i 1 (或者用CloudCampus软件,或者iperf magic) Wi-Fi 发送、接收吞吐率的测试_magic iperf-CSDN博客 车机作为iperf3服务器,电脑作为iperf3得客户端,分别…...
redis 第155节答疑 源码分析Hash类型ziplist结构和zlentry实体解析
155属性 zlbytes zltail zllen entryX zlend 类型 uint32 t uint32 t uint16 t 列表节点 uint8 t 长度 4字节 4字节 2字节 不定 1字节 用途 记录整个压缩列表占用的内存字节数:在对压缩列表进行内存重分配,或者计算 zlend 的位置时使用 记录压缩列表表尾节点距离压缩…...
IDE使用技巧与插件推荐
集成开发环境(IDE)是开发者日常工作中的重要工具,合理使用IDE和合适的插件,能大大提高开发效率。本文将分享常见IDE(如VS Code、IntelliJ IDEA等)的一些高效使用技巧,以及开发过程中常用的插件推…...
1020接口测试面试题随记
1.测试中对于上下游承接的业务是怎么处理的 针对上下游承接的业务,我会采取以下措施进行处理:首先,明确上下游系统的接口和依赖关系,确保理解数据流和业务逻辑的连接点。其次,进行接口测试,验证上下游系统…...

Zotero7最新(2024)翻译问题——配置 百度API翻译
在使用翻译之前,首先要确保已经安装了插件:Translate for Zotero 关于插件的安装可以参考这篇文章: Zotero7最新(2024)安装、配置步骤-CSDN博客 接下来进入正题。 当使用Zotero7对英文文献翻译时,可能会…...
python程序设计员—练习笔记
目录 基础处理 字符串列表字典运算符正则表达式re库requestsBeautiful Soupjieba库分词模式基于TF-IDF算法的关键词提取 基于TextRank算法的关键词提取pandas 打开有多个表的.xlsx文件 基础处理 字符串 str_ str_.lower()lower()函数:将字符中的大写字母转换成小…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...