9.3 k8s介绍

news2024/11/13 12:36:02

⼀、编排分类

单机容器编排: docker-compose
容器集群编排: docker swarm、mesos+marathon、kubernetes
应⽤编排: ansible(模块,剧本,⻆⾊)

⼆、系统管理进化史

1. 传统部署时代

早期,各个组织是在物理服务器上运⾏应⽤程序。 由于⽆法限制在物理服务器中运⾏的应⽤程序资源使⽤,因此会导致资源分配问题。
例如,如果在同⼀台物理服务器上运⾏多个应⽤程序, 则可能会出现⼀个应⽤程序占⽤⼤部分资源的情况,⽽导致其他应⽤程序的性能下降。
⽽⼀种解决⽅案是将每个应⽤程序都运⾏在不同的物理服务器上,但是当某个应⽤程序资源利⽤率不⾼时,剩余资源⽆法被分配给其他应⽤程序,⽽且维护许多物理服务器的成本很⾼。

2. 虚拟化部署时代

⽽后,虚拟化技术被引⼊了。虚拟化技术允许在单个物理服务器的CPU 上运⾏多台虚拟机(VirtureMachine)。 虚拟化能使应⽤程序在不同 VM 之间被彼此隔离,且能提供⼀定程度的安全性, 因为⼀个应⽤程序的信息不能被另⼀应⽤程序随意访问。
虚拟化技术能够更好地利⽤物理服务器的资源,并且因为可轻松地添加或更新应⽤程序,⽽因此可以具有更⾼的可扩缩性,以及降低硬件成本等等的好处。通过虚拟化,你可以将⼀组物理资源呈现为可丢弃的虚拟机集群。
每个 VM 是⼀台完整的计算机,在虚拟化硬件之上运⾏所有组件,包括其⾃⼰的操作系统,所以由此看来,虚拟机技术占⽤资源量⼤,在⼀台主机上最多运⾏⼗⼏台,效率不⾼。

3. 容器部署时代

容器,衍⽣于虚拟技术,但具有更宽松的隔离特性,使容器可以在共享操作系统的同时,还能保持其轻量级的特点。⽽且每个容器都具有⾃⼰的⽂件系统、CPU、内存、进程空间等,且具有最良好的可移植性和平台兼容性。

敏捷应⽤程序的创建和部署:与使⽤ VM 镜像相⽐,提⾼了容器镜像创建的简便性和效率
持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
关注开发与运维的分离:在构建、发布时创建应⽤程序容器镜像,⽽不是在部署时,从⽽将应⽤程序与基础架构分离。
可观察性:不可以显示OS 级别的信息和指标,还可以显示应⽤程序的运⾏状况和其他指标信。
跨开发、测试和⽣产的环境⼀致性:在笔记本计算机上也可以和在云中运⾏⼀样的应⽤程序。
跨云和操作系统发⾏版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、GoogleKubernetes Engine 和其他任何地⽅运⾏。
以应⽤程序为中⼼的管理:提⾼抽象级别,从在虚拟硬件上运⾏OS 到使⽤逻辑资源在OS 上运⾏应⽤程序。
松散耦合、分布式、弹性、解放的微服务:应⽤程序被分解成较⼩的独⽴部分, 并且可以动态部署和管理-⽽不是在⼀台⼤型单机上整体运⾏。
资源隔离:可预测的应⽤程序性能。
资源利⽤:⾼效率和⾼密度。

三、Kubernetes 简介

Kubernetes 缩写:K8S,k 和 s 之间有⼋个字符,所以因此得名。

Kubernetes 由 google 的 Brog 系统作为原型,后经 Go 语⾔延⽤Brog 的思路重写,并捐献给 CNCF 基⾦会开源。
Kubernetes 是⼀个可移植的、可扩展的开源平台,⽤于管理容器化的⼯作负载和服务,可促进声明式配置和⾃动化。
官⽹:https://kubernetes.io
Github:https://github.com/kubernetes/kubernetes

四、Kubernetes 功能

Kubernetes 的⽬标是让部署容器化的应⽤简单并且⾼效,提供了应⽤部署,规划,更新,维护的⼀种机制。
Kubernetes 在 Docker 等容器技术的基础上,为容器化的应⽤提供部署运⾏、资源调度、服务发现和动态伸缩等⼀系列完整功能,提⾼了⼤规模容器集群管理的便捷性。

主要功能:

1. 使⽤ Docker 等容器技术对应⽤程序包装(package)、实例化(instantiate) 、运⾏(run)。
2. 以集群的⽅式运⾏、管理跨机器的容器,解决 Docker 跨机器容器之间的通讯问题。
3. K8S 的⾃我修复机制使得容器集群总是运⾏在⽤户期望的状态。

五、Kubernetes 特性

1. ⾃动装箱:Kubernetes可以根据所需资源和其他限制条件智能地定位容器,⽽不会影响可⽤性。
2. 弹性伸缩:使⽤命令、UI 或者基于 CPU 使⽤情况⾃动快速扩容和缩容应⽤程序实例,保证应⽤业务⾼峰并发时的⾼可⽤性;业务低峰时回收资源,以最⼩成本运⾏服务。
3. ⾃我修复:在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
4. 服务发现和负载均衡:K8S为多个容器提供⼀个统⼀访问⼊⼝(内部IP地址和⼀个DNS名称),并且负载均衡关联的所有容器,使得⽤户⽆需考虑容器 IP 问题。
5. ⾃动发布(默认滚动发布模式)和回滚:K8S采⽤滚动策略更新应⽤,⼀个更新⼀个Pod,⽽不是同时删除所有的Pod,如果更新过程中出现问题,将回滚更改,确保升级不收影响业务。
6. 集中化配置管理和密钥管理:管理机密数据和应⽤程序配置,⽽不需要把敏感数据暴露在镜像⾥,提⾼敏感数据安全性,并可以将⼀些常⽤的配置存储在K8S中,⽅便应⽤程序使⽤。
7. 存储编排:⽀持外挂存储并对外挂存储资源进⾏编排,挂载外部存储系统,⽆论是来⾃本地存储,公有云(如:AWS),还是⽹络存储(如:NFS、Glusterfs、Ceph)都作为集群资源的⼀部分使⽤,极⼤提⾼存储使⽤灵活性。
8. 任务批量处理运⾏:提供⼀次性任务,定时任务,满⾜批量数据处理和分析的场景。

六、K8S 解决裸跑 Docker 的痛点

1. 单机使⽤,⽆法有效集群。
2. 随着容器数量的上升,管理成本攀升。
3. 没有有效的容灾、⾃愈机制。
4. 没有预设编排模板,⽆法实现快速、⼤规模容器调度。
5. 没有统⼀的配置管理中⼼⼯具。
6. 没有容器⽣命周期的管理⼯具。
7. 没有图形化运维管理⼯具。

七、Kubernetes 架构

K8S 属于主从设备模型(Mater-Slave 架构),由 Master 节点负责集群的调度、管理和运维(分配活的),Slave 节点是运算⼯作负载节点(⼲活的),被称为 Worker Node 节点。
Master 需要占据⼀个独⽴服务器运⾏,因为其是整个集群的“⼤脑”,⼀旦宕机或不可⽤,那么所有控制命令都将失效,可对主节点进⾏⾼可⽤配置。
当 Worker Node 节点宕机时,其上的⼯作负载会被 Master ⾃动转移到其他节点上。

1. Master 节点组件

API Server

*整个集群的控制中枢,提供集群中各个模块之间的数据交换*,并将集群状态和信息存储到分布式键-值(key-value)存储系统 Etcd 集群中。
同时它也是集群管理、资源配额、提供完备的集群安全机制的⼊⼝,为集群各类资源对象提供增删改查以及 watch 的 REST API 接⼝。

Controller-manager

集群状态管理器,以保证 Pod 或其他资源达到期望值*。*当集群中某个 Pod 的副本数或其他资源因故障和错误导致⽆法正常运⾏,没有达到设定的值时,Controller Manager 会尝试⾃动修复并使其达到期望状态。

Scheduler

*集群 Pod 的调度中⼼,主要是通过调度算法将 Pod 分配到最佳的Node 节点*,它通过APIServer 监听所有 Pod 的状态,⼀旦发现新的未被调度到任何 Node 节点的Pod(PodSpec.NodeName为空),就会根据⼀系列策略选择最佳节点进⾏调度。

Etcd

*⽤于可靠地存储集群的配置数据,是⼀种持久性、轻量型、分布式的键-值 (key-value) 数据存储组件*,作为Kubernetes集群的持久化存储系统。

注:⽣产环境建议存放到单个的SSD硬盘,并且做好冗余。

2. Work Node 节点

Kubelet

*负责与 Master 通信协作,管理该节点上的 Pod,对容器进⾏健康检查及监控,同时负责上报节点和节点上⾯ Pod 的状态。*

Kube-proxy

*运⾏在每个 node 节点上,实现 pod 的⽹络代理,维护⽹络规则和四层负载均衡规则*,负责写⼊规则到 iptables 或 ipvs 实现服务映射访问。

Runtime

*负责容器的管理* (新版本 K8S 使⽤的是 Containerd)。

CoreDNS

⽤于 Kubernetes 集群内部 Service 的解析,可以让 Pod 把Service 名称解析成 Service 的 IP 然后通过 Service 的 IP 地址进⾏连接到对应的应⽤上.

Calico

符合 CNI 标准的⼀个⽹络插件,它*负责给每个 Pod 分配⼀个不会重复的 IP,并且把每个节点当做⼀各“路由器”*,这样⼀个节点的Pod 就可以通过 IP 地址访问到其他节点的 Pod。

Docker

*运⾏容器,负责本机的容器创建和管理⼯作。*

⼋、Pod 概念

Pod 是 Kubernetes 中的基本构建块,它代表⼀个或⼀组相互关联的容器。Pod 是Kubernetes 的最⼩部署单元,可以包含⼀个或多个容器,这些容器共享存储、⽹络和运⾏配置。

容器之间可以使⽤ localhost:port 相互访问,可以使⽤ volume 等实现数据共享。根据 Docker 的构造,Pod 可被建模为⼀组具有共享命令空间、卷、IP 地址和 Port 端⼝的容器。

Pod 的主要特点包括:
1. 共享存储:Pod 中的所有容器都可以访问同⼀个存储卷(Persistent Volume),实现数据共享。
2. 共享⽹络:Pod 中的所有容器都共享同⼀个⽹络命名空间,可以相互通信。
3. 共享运⾏配置:Pod 中的所有容器都共享相同的运⾏配置,例如容器的启动参数、环境变量等。

Pause 容器:

Pod 的⽗容器,它主要负责僵⼫进程的回收管理,同时通过 Pause容器可以使同⼀个 Pod ⾥⾯的不同容器进⾏共享存储、⽹络、PID、IPC等。

九、Kubernetes ⼯作流程

1. 运维⼈员使⽤ kubectl 命令⼯具向 API Server 发送请求,APIServer 接收请求后写⼊到 Etcd 中。
2. API Server 让 Controller-manager 按照预设模板去创建 Pod。
3. Controller-manager 通过 API Server 读取 Etcd 中⽤户的预设信息,再通过 API Server 找到 Scheduler,为新创建的 Pod 选择最合适的 Node ⼯作负载节点。
4. Scheduler 通过 API Server 在 Etcd 找到存储的 Node 节点元信息、剩余资源等,⽤预选和优选策略选择最优的 Node 节点。
5. Scheduler 确定 Node 节点后,通过 API Server 交给这个 Node节点上的 Kubelet 进⾏ Pod 资源的创建。
6. Kubelet 调⽤容器引擎交互创建 Pod,同时将 Pod 监控信息通过 API Server 存储到 Etcd 中。
7. 当⽤户访问时,通过 Kube-proxy 负载、转发,访问相应的Pod。
8. 注:决定创建 Pod 清单的是 Controller-manager 控制器,Kubelet 和容器引擎只是⼲活的。

⼗、K8S 创建 Pod 流程

1. 详细流程

1)⾸先 Kubectl 创建⼀个 Pod,在提交时转化为 json。
2)再经过 auth 认证(鉴权),然后传递给 API Server 进⾏处理。
3)API Server 将请求信息存储到 Etcd 中。
4)Scheduler 和 Controller-manager 会监听 API Server 的请求。
5)在 Scheduler 和 Controller-manager 监听到请求后,Scheduler会提交给API Server⼀个list清单 —— 包含的是获取node节点信息。
6)当 API Server 从 Etcd 获取后端 Node 节点信息后,会同时被Scheduler 监听到,然后 Scheduler 进⾏优选打分制,最后将评估结果传递给 API Server。
7)⽽后,API Server 会提交清单给对应节点的 Kubelet(代理)。Kubelet 代理通过 K8S 与容器的接⼝ (例如 containerd) 进⾏交互,假设是 docker 容器,那么此时 kubelet 就会通过dockershim 以及 runc 接⼝与 docker 的守护进程docker-server进⾏交互,来创建对应的容器,再⽣成对应的 Pod。
8)Kubelet 同时会借助 Metric Server 收集本节点的所有状态信息,然后提交给 API Server。
9)最后 API Server 将该节点的容器和 Pod 信息存储到 Etcd 中。

2. 简化流程

1)⽤户通过 kubectl 或其他 API 客户端提交 Pod Spec 给 APIServer。
2)API Server 尝试将 Pod 对象的相关信息存⼊ etcd 中,待写⼊操作执⾏完成,API Server 即会返回确认信息⾄客户端。
3)Controller 通过 API Server 的 Watch 接⼝发现新的 Pod,将Pod 加⼊到任务队列,并启动 Pod Control 机制创建与之对应的Pod。
4)所有 Controler 正常后,将结果存⼊ etcd。
5)Scheduler 通过 API Server 的 Watch 接⼝监测发现新的 Pod,经过给主机打分之后,让 Pod 调度到符合要求的 Node 节点,并将结果存⼊到 etcd 中。
6)Kubelet 每隔⼀段时间向 API Server 通过 Node name 获取⾃身Node 上要运⾏的 Pod 并通过与⾃身缓存⽐较,来创建新Pod。
7)Containerd 启动容器。
8)最后 API Server 将本节点的容器和Pod信息存储到etcd。

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

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

相关文章

getLocation:fail, the permission value is offline verifying

getLocation:fail, the permission value is offline verifying 后端会根据appid和secret生成 签名,前端wx配置时一定用appid来验证签名的正确 本次错误为配置初始化失败:前端与后端的appId不一致,我的失误也

TikTok直播为什么要用独立IP

TikTok直播作为一种受欢迎的社交媒体形式,吸引了越来越多的用户和内容创作者。在进行TikTok直播时,选择使用独立IP地址是一种被广泛推荐的做法。本文将探讨为什么在TikTok直播中更推荐使用独立IP,并解释其优势和应用。 独立IP是指一个唯一的互…

探索Linux项目自动化构建:make/Makefile的使用方法

🌱博客主页:青竹雾色间 🌱系列专栏:Linux 😘博客制作不易欢迎各位👍点赞 ⭐收藏 ➕关注 标题: 使用 Makefile 实现项目自动化构建 - 从零开始学习 Makefile 摘要: Makefile 是一个用…

如何在 OpenCloudOS 上安装 OpenTenBase 数据库

OpenTenBase 是由开放原子开源基金会孵化及运营的开源项目,是一款企业级的分布式 HTAP 数据库,具备高扩展性、商业数据库语法兼容、分布式 HTAP 引擎、多级容灾和多维度资源隔离等能力,目前已经成功应用于金融、医疗、航天等诸多行业的核心业…

Github Coplit和Poe不再订阅,改用Token和LobeChat

优化AI使用方式 1.取消Poe和Github Coplit的年度订阅 今天把200$ 的Poe和100$的Github Coplit的年度订阅取消了,确保到期不会续定,包年用AI的时代,在这里结束了。 2.改用Token购买模式 使用的AI质量必须不变,改用Token的方式&…

【Prometheus】Prometheus安装部署流程详解,配置参数webUI使用方法解析说明

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

二十、Java8新特性

文章目录 引入一、Lambda表达式1.1 快速入门1.2 Lambda语法 二、函数式(Functional)接口2.1 函数式(Functional)接口介绍2.2 Java内置函数式接口 三、方法引用与构造器引用3.1 方法引用3.2 构造器引用 四、强大的Stream API4.1 创建 Stream 的4种方式4.2 Stream 的中间操作4.2.…

PHP图书馆在指尖图书借阅小程序助力全民阅读系统小程序源码

​图书馆在指尖 —— 图书借阅小程序助力全民阅读 📚【开篇:指尖上的知识海洋】📚 在这个快节奏的时代,你是否曾渴望随时随地都能沉浸在书海中?现在,有了图书借阅小程序,图书馆就真正来到了你…

【MySQL08】【死锁】

文章目录 一、前言二、查看事务加锁情况1. 使用 information_schema 数据库中表获取锁信息1.1 INNODB_TRX1.2 INNODB_LOCKS1.3 INNODB_LOCK_WAITS 2. 使用 SHOW ENGIN INNODB STATUS 获取锁信息 三、死锁四、参考内容 一、前言 最近在读《MySQL 是怎样运行的》、《MySQL技术内…

GPU版pytorch安装(win/linux)

参考: Pytorch环境配置——cuda、、cudnn、torch、torchvision对应版本(最全)及安装方法-CSDN博客 Previous PyTorch Versions | PyTorch 法1:命令安装 如: conda install pytorch2.1.0 torchvision0.16.0 torchau…

Leetcode面试经典150题-63.不同路径II

解法都在代码里,不懂就留言或者私信 class Solution {/**本题是典型的动态规划,但是需要注意的是这个网格中是有障碍的,障碍不能走所以其实还是一样的,计算所有点到(m-1,n-1)有多少种方式,返回(0,0)位置的解就行了 */…

Python | Leetcode Python题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; class Solution:def validUtf8(self, data: List[int]) -> bool:MASK1, MASK2 1 << 7, (1 << 7) | (1 << 6)def getBytes(num: int) -> int:if (num & MASK1) 0:return 1n, mask 0, MASK1while num & m…

Python文件自动分类

假如这样的步骤全部手动做下来耗时是6秒&#xff0c;在文件数量不多的情况下&#xff0c;比如10个文件&#xff0c;总共耗时一分钟其实是能够接受的。 但当文件数量特别多时&#xff0c;或者这个操作特别频繁每天都要做十几二十次时&#xff0c;手动操作就会变得耗时又繁琐…

哪款宠物空气净化器能更好的清除浮毛?希喂、范罗士测评

七年前开始养了第一只小猫咪&#xff0c;没想到从此家里就开始一直养&#xff0c;到现在都已经养了5只。之前第一只的时候&#xff0c;就觉得很可爱&#xff0c;而且当时刚毕业&#xff0c;算是一时上头才养了它&#xff0c;后面发现我们经常是要出门上班、出差、游玩&#xff…

冲击大厂算法面试=>链表专题【链表反转之局部反转升级版】

目录标题 多重局部反转之K 个一组翻转链表上代码题解呀实在不会的时候记住 多重局部反转之K 个一组翻转链表 上代码 整个函数通过不断地检查剩余节点数量和进行局部反转&#xff0c;实现了链表的分组反转&#xff0c;最后返回反转后的链表。这种方法有效地利用了额外的 pre 和…

VBA学习(71):Excel VBA 访问带密码保护的Access数据库/用户窗体设置/EXCEL用户+密码登录界面(Access版)

前两天我们分享了一个用户密码登录EXCEL的案例【Excel VBA 用户窗体设置/一步一步代你设计EXCEL用户密码登录界面】&#xff0c;文中提及数据存储在Access中的情况&#xff0c;今天我就来把数据表&#xff08;tb用户&#xff09;移到Access中&#xff0c;修改一下代码&#xff…

使用jmeter压测数据库

写在文章开头 除了wrk以外,jmeter一直是笔者比较喜欢的一个压测工具,从使用场景和功能范围来看,算是一款比较全面且上手快速的压测工具,本文将基于MySQL数据库为读者演示一下如何通过jmeter压测数据库,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的…

FreeRTOS学习笔记—②RTOS的认识(持续更新中)

由于正在学习韦东山大佬的RTOS课程&#xff0c;结合了网上的一些资料&#xff0c;整理记录了下自己的感悟&#xff0c;用于以后自己的回顾。如有不对的地方请各位大佬纠正。 课程链接&#xff1a;https://www.bilibili.com/video/BV1844y1g7ud/?spm_id_from333.337.search-car…

Postman环境变量:简化API测试的利器

引言 在当今快速发展的互联网时代&#xff0c;API&#xff08;应用程序接口&#xff09;的重要性不言而喻。无论是内部系统间的通信还是对外服务的提供&#xff0c;API都扮演着至关重要的角色。然而&#xff0c;在API的开发与测试过程中&#xff0c;经常需要处理各种各样的配置…

Java语言程序设计基础篇_编程练习题**17.21 (十六进制编辑器)

目录 题目&#xff1a;**17.21 (十六进制编辑器) 代码示例 结果展示 题目&#xff1a;**17.21 (十六进制编辑器) 编写一个 GUI 应用程序&#xff0c;让用户在文本域输入一个文件名&#xff0c;然后按回车键&#xff0c;在文本域显示它的十六进制表达形式。用户也可以修改十六…