中间层 k8s(Kubernetes) 到底是什么,架构是怎么样的?

news2024/11/20 13:45:37

你是一个程序员,你用代码写了一个博客应用服务,并将它部署在了云平台上。
但应用服务太过受欢迎,访问量太大,经常会挂。

所以你用了一些工具自动重启挂掉的应用服务,并且将应用服务部署在了好几个服务器上,总算抗住了。

后来你又上线了商城应用服务和语音应用服务,随着应用服务变多,需求也千奇百怪。有的应用服务不希望被外网访问到,有的部署的时候要求内存得大于 xxGB 才能正常跑。
你每次都需要登录到各个服务器上,执行手动操作更新。不仅容易出错,还贼浪费时间

原本就没时间找女朋友的你,现在哭得更大声了。

那么问题就来了,有没有一个办法,可以解决上面的问题?当然有,没有什么是加一个中间层不能解决的,如果有,那就再加一层
这次我们要加的中间层,叫 Kubernetes


Kubernetes的位置

Kubernetes 是什么?

Kubernetes,它是 G 家开源的神器,因为单词太长,所以我们习惯省略中间 8 个字母,简称它为 k8s


k8s名称的由来

它介于应用服务服务器之间,能够通过策略,协调和管理多个应用服务,只需要一个 yaml 文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,还能让它们挂了自动重启,自动扩缩容。

听起来有些厉害,它是怎么实现这些功能的呢?

Kubernetes 架构原理

为了实现上面的功能,Kubernetes 会将我们的服务器划为两部分,一部分叫控制平面(control plane,以前叫master),另一部分叫工作节点,也就是 Node。简单来说它们的关系就是老板和打工人, 用现在流行的说法就是训练师和帕鲁。控制平面负责控制和管理各个 Node,而 Node 则负责实际运行各个应用服务。


k8s控制平面和Node的关系

我们依次看下这两者的内部架构。

控制平面内部组件

  • • 以前我们需要登录到每台服务器上,手动执行各种命令,现在我们只需要调用 k8s 的提供的 api 接口,就能操作这些服务资源,这些接口都由 API Server 组件提供。

  • • 以前我们需要到处看下哪台服务器 cpu 和内存资源充足,然后才能部署应用,现在这部分决策逻辑由 Scheduler(调度器)来完成。

  • • 找到服务器后,以前我们会手动创建,关闭服务,现在这部分功能由 Controller Manager(控制器管理器)来负责。

  • • 上面的功能都会产生一些数据,这些数据需要被保存起来,方便后续做逻辑,因此 k8s 还会需要一个存储层,用来存放各种数据信息,目前是用的 etcd,这部分源码实现的很解耦,后续可能会扩展支持其他中间件。

以上就是控制平面内部的组件。


k8s控制平面组件

我们接下来再看看 Node 里有哪些组件。

Node 内部组件

Node 是实际的工作节点,它既可以是裸机服务器,也可以是虚拟机。它会负责实际运行各个应用服务。多个应用服务共享一台 Node 上的内存和 CPU 等计算资源。


Node可以是裸机服务器或虚拟机

在文章开头,我们聊到了部署多个应用服务的场景。以前我们需要上传代码到服务器,而用了 k8s 之后,我们只需要将服务代码打包成Container Image(容器镜像),就能一行命令将它部署。

如果你不了解容器镜像的含义,你可以简单理解为它其实就是将应用代码和依赖的系统环境打了个压缩包,在任意一台机器上解压这个压缩包,就能正常运行服务。为了下载和部署镜像,Node 中会有一个 Container runtime 组件。


将容器镜像粗略理解为压缩包

每个应用服务都可以认为是一个 Container(容器), 并且大多数时候,我们还会为应用服务搭配一个日志收集器 Container 或监控收集器 Container,多个 Container 共同组成一个一个 Pod,它运行在 Node 上。


一个pod内有多个容器

k8s 可以将 pod 从某个 Node 调度到另一个 Node,还能以 pod 为单位去做重启和动态扩缩容的操作。
所以说 Pod 是 k8s 中最小的调度单位


Node调度Pod

另外,前面提到控制平面会用 Controller Manager (通过API Server)控制 Node 创建和关闭服务,那 Node 也得有个组件能接收到这个命令才能去做这些动作,这个组件叫 kubelet,它主要负责管理和监控 Pod。最后,Node 中还有个 Kube Proxy ,它负责 Node 的网络通信功能,有了它,外部请求就能被转发到 Pod 内。


控制平面和Node的组件

Cluster

控制平面和Node 共同构成了一个 Cluster,也就是集群。在公司里,我们一般会构建多个集群, 比如测试环境用一个集群,生产环境用另外一个集群。同时,为了将集群内部的服务暴露给外部用户使用,我们一般还会部署一个入口控制器,比如 Ingress 控制器(比如Nginx),它可以提供一个入口让外部用户访问集群内部服务。


生产和测试环境

kubectl 是什么

上面提到说我们可以使用 k8s 提供的 API 去创建服务,但问题就来了,这是需要我们自己写代码去调用这些 API 吗?答案是不需要,k8s 为我们准备了一个命令行工具 kubectl,我们只需要执行命令,它内部就会调用 k8s 的 API。


kubectl调用k8s的API

接下来我们以部署服务为例子,看下 k8s 是怎么工作的。

怎么部署服务?

首先我们需要编写 YAML 文件,在里面定义 Pod 里用到了哪些镜像,占用多少内存和 CPU 等信息。然后使用 kubectl 命令行工具执行 kubectl apply -f xx.yaml ,此时 kubectl 会读取和解析 YAML 文件,将解析后的对象通过 API 请求发送给 Kubernetes 控制平面内 的 API Server。API Server 会根据要求,驱使 Scheduler 通过 etcd 提供的数据寻找合适的 Node, Controller Manager 会通过 API Server 控制 Node 创建服务,Node 内部的 kubelet 在收到命令后会开始基于 Container runtime 组件去拉取镜像创建容器,最终完成 Pod 的创建。

至此服务完成创建。


部署应用服务

整个过程下来,我们只需要写一遍 yaml 文件,和执行一次 kubectl 命令,比以前省心太多了!部署完服务后,我们来看下服务是怎么被调用的。

怎么调用服务?

以前外部用户小明,直接在浏览器上发送 http 请求,就能打到我们服务器上的 Nginx,然后转发到部署的服务内。用了 k8s 之后,外部请求会先到达 Kubernetes 集群的 Ingress 控制器,然后请求会被转发到 Kubernetes 内部的某个 Node 的 Kube Proxy 上,再找到对应的 pod,然后才是转发到内部容器服务中,处理结果原路返回,到这就完成了一次服务调用。


用户调用k8s内应用服务的流程

到这里我们就大概了解了 k8s 的工作原理啦,它本质上就是应用服务和服务器之间的中间层,通过暴露一系列 API 能力让我们简化服务的部署运维流程。

并且,不少中大厂基于这些 API 能力搭了自己的服务管理平台,程序员不再需要敲 kubectl 命令,直接在界面上点点几下,就能完成服务的部署和扩容等操作,是真的嘎嘎好用。

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

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

相关文章

【C++】实验六

题目: 1、苹果和虫子 描述:你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果? 输入…

Linux基础复习(三)

前言 接Linux基础复习二 一、常用命令及其解释 Tab补全 在上一篇文章配置了IP然后通过远程SSH连接软件控制主机,在配置过程中会发现有些命令过于长,那么,Tab键补全就可以很好的帮助我们去快速的敲出命令,同时如果有些命令有遗…

AJAX(1)——axios库的使用

什么是AJAX? AJAX是异步的JavaScript和XML。简单来说,就是使用XMLHttpRequest对象与服务器通信。它可以使用JSON,XML,HTML和text文本等格式发送和接收数据。AJAX最吸引人的就是它异步的特性,也就是说它可以在不重新刷新页面的情况下与服务器通信&#…

免费【2024】springboot 宠物救助管理系统的设计与实现

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

成为git砖家(4): git status 命令简介

1. untracked 和 tracked 状态 Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, o…

Feign自定义调用第三方接口并实现负载均衡

Feign自定义调用第三方接口并实现负载均衡 Feign简介: Feign 是一个声明式的、模板化的HTTP客户端,用于简化HTTP客户端的开发。它是Spring Cloud Netflix微服务套件中的一部分,使得编写Java HTTP客户端变得更加容易。它的原理主要是代理模式…

Rust |了解+ 环境配置(rust+vscode)

1 了解rust 1️⃣0️⃣0️⃣秒了解Rust_哔哩哔哩_bilibili 2 安装rust 前提安装过vs,有c环境 1.下载 根据自己的系统下载对应的版本:安装地址 查看自己版本: 右键 此电脑 ;点击 属性 ;查看 系统类型 点击 下载RU…

智慧城管解决方案

1. 项目整体概述 智慧城管项目面临历史发展机遇,十九大提出以人为核心保障民生,推进新型城镇化。市民对政府服务有新诉求,同时云计算、物联网、移动互联网等技术迅速发展。 2. 传统城管业务模式问题 传统城管业务模式存在问题,…

树莓派学习记录

一,型号 第一代Raspberry Pi 1 Model B 第一代升级版 Raspberry Pi 1 B 第二代 Rasberry Pi 2 Model B 第三代及升级版 Rasberry Pi 3 Model B/B 第四代 Rasberry Pi 4 Model B Model A版 比B版便宜 Zero 版 售价更便宜 总结 二,树莓派接口 如下图…

Hello 算法:动画图解、一键运行的数据结构与算法教程

Hello 算法 《Hello 算法》是一份开源、免费的数据结构与算法入门教程,特别适合新手。全书采用动画图解,内容清晰易懂,学习曲线平滑,引导初学者探索数据结构与算法的知识地图。源代码可以一键运行,帮助读者通过练习提…

【教学类-70-01】20240728一个茶壶两个茶杯(果茶)

‘ 背景需求: 用通义万相下载简笔画茶壶、茶杯 茶杯,简单笔画,卡通,黑白,未着色,幼儿插图,线条画,没有背景,没有颜色,黑白漫画线条艺术:,空背景…

JAVAWeb实战(后端篇)

因为前后端代码内容过多,这篇只写后端的代码,前端的在另一篇写 项目实战一: 1.创建数据库,表等数据 创建数据库 create database schedule_system 创建表,并添加内容 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------…

十一、Dockerfile解析

目录 一、Dockerfile简介 二、dockerfile的构建的三个步骤 三、Dockerfile的构建过程 1、DockerFile内容的基础知识 2、Docker执行Dockerfile的大致流程 四、dockerfile常用的保留字 1、FROM 2、MAINTAINER 3、RUN 4、EXPOSE 5、WORKDIR 6、USER 7、ENV 8、VOLUME …

VScode使用Github Copilot插件时出现read ECONNREST问题的解决方法

文章目录 read ECONNREST查看是否仍是 Copilot 会员查看控制台输出网络连接问题浏览器设置问题笔者的话 read ECONNREST 最近使用 Copilot 时一直出现 read ECONNREST 问题,这个表示连接被对方重置了,就是说在读取数据时连接被关闭。 我首先怀疑是不是…

QT常用的控件

QT常用控件 一.控件概述二.QWidget 核心属性2.1 核心属性概览2.2 enabled代码示例:使用代码创建一个禁用状态的按钮代码示例: 通过按钮2 切换按钮1 的禁用状态. 2.3 geometry代码示例: 控制按钮的位置代码示例: ⼀个随机按钮程序代码示例: 感受 geometry 和frameGeo…

Python | TypeError: ‘NoneType’ object is not iterable

Python | TypeError: ‘NoneType’ object is not iterable 在Python编程中,TypeError: NoneType object is not iterable 是一个常见的错误,通常表明你尝试对一个值为 None 的对象进行迭代操作,而 None 类型的对象是不可迭代的。本文将深入…

python count返回什么

描述 count() 方法用于统计字符串中某个子字符串出现的次数,可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法: S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数,…

Windows11和Win10如何彻底永久关闭Windows defender

Windows11和Win10如何彻底永久关闭Windows defender 亲测简单快捷有效关闭病毒和威胁防护。 使用关闭windows defender工具。 随时可以重新开启病毒和威胁防护。

【Spring Boot】Spring 的安全框架:Spring Security

Spring 的安全框架:Spring Security 1.Spring Security 初识1.1 核心概念1.2 认证和授权1.2.1 验证(authentication)1.2.2 授权(authorization) 1.3 模块 2.核心类2.1 Securitycontext2.2 SecurityContextHolder2.2.1 …

刷题心得之位运算技巧 gcd 和 lcm

位运算 gcd 和 lcm 位运算技巧遍历 n 的所有子集, 不包括空集遍历 n 的所有子集, 包括空集提取出 n 二进制中第一次出现的1消除 n 二进制中第一次出现的1判断 n 是否是 2 的幂次方 gcd [最大公约数]lcm [最小公倍数] 位运算技巧 遍历 n 的所有子集, 不包括空集 #include <…