Kubernetes 笔记(02)— 基本架构、工作机制简述、Master 组件、Node 组件

news2024/11/14 22:41:20

1. Kubernetes 的基本架构

结构
Kubernetes 采用了现今流行的“控制面 / 数据面”(Control Plane / Data Plane)架构,集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制面来执行集群的管理维护工作,其他的大部分节点都被划归数据面,用来跑业务应用。

  • 控制面的节点在 Kubernetes 里叫做 Master Node,一般简称为 Master,它是整个集群里最重要的部分,可以说是Kubernetes 的大脑和心脏。

  • 数据面的节点叫做 Worker Node,一般就简称为 Worker 或者 Node,相当于 Kubernetes 的手和脚,在 Master 的指挥下干活。

Node 的数量非常多,构成了一个资源池,Kubernetes 就在这个池里分配资源,调度应用。因为资源被“池化”了,所以管理也就变得比较简单,可以在集群中任意添加或者删除节点。

在这张架构图里,我们还可以看到有一个 kubectl,它就是 Kubernetes 的客户端工具,用来操作 Kubernetes,但它位于集群之外,理论上不属于集群。

你可以使用命令 kubectl get node 来查看 Kubernetes 的节点状态:

$ kubectl get node
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   18h   v1.23.3

可以看到当前的 minikube 集群里只有一个 Master,那 Node 怎么不见了?

这是因为 MasterNode 的划分不是绝对的。当集群的规模较小,工作负载较少的时候,Master 也可以承担 Node 的工作,就像我们搭建的 minikube 环境,它就只有一个节点,这个节点既是 Master 又是 Node

2. 节点内部的结构

Kubernetes 的节点内部也具有复杂的结构,是由很多的模块构成的,这些模块又可以分成组件(Component)和插件(Addon)两类。

组件实现了 Kubernetes 的核心功能特性,没有这些组件 Kubernetes 就无法启动,而插件则是 Kubernetes 的一些附加功能,属于“锦上添花”,不安装也不会影响 Kubernetes 的正常运行。

2.1 Master 里的组件

Master 里有 4 个组件,分别是 apiserveretcdschedulercontroller-manager
master

  • apiserverMaster 节点——同时也是整个 Kubernetes 系统的唯一入口,它对外公开了一系列的 RESTful API,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信,可以说是 Kubernetes 里的联络员。负责集群中所有组件通信,访问它必须经过授权于认证。

  • etcd 是一个高可用的分布式 Key-Value 数据库,用来持久化存储系统里的各种资源对象和状态,相当于 Kubernetes 里的配置管理员。注意它只与 apiserver 有直接联系,也就是说任何其他组件想要读写 etcd 里的数据都必须经过 apiserver

  • scheduler 负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运行,相当于部署人员。因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通过 apiserver 才能获得。

调度器职责是监听 API Server 来启动工作任务,并分配合适的节点。它的核心是排序系统,该系统有评分机制,将工作分配到分数最高的节点来运行任务。调度器确定可以执行任务的节点后,还会再进行前置校验,例如该节点是否仍然存在、分配的任务需要的端口当前选择的工作节点是否可以访问等,如果无法通过,该节点会被直接忽略,如果调度器最后无法找到合适的工作节点,则当前任务无法被调度,并被标记为暂停状态。
需要特别注意,调度器不负责运行任务,只为任务负责分配合适的工作节点。

  • controller-manager 负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能,相当于监控运维人员。同样地,它也必须通过 apiserver 获得存储在 etcd 里的信息,才能够实现对资源的各种操作。

它实现了控制循环,完成集群监控与事件响应。它负责创建 controller。一般控制循环包括:工作节点 controller、终端 controller 以及副本 controller。集群监控目的是保证集群当前状态与期望状态相匹配。集群监控基础逻辑大致如下:(获取期望状态、观察当前状态、判断差异、变更消除差异点)。

这 4 个组件也都被容器化了,运行在集群的 Pod 里,我们可以用 kubectl 来查看它们的状态,使用命令:

$ kubectl get pod -n kube-system
NAME                               READY   STATUS    RESTARTS        AGE
coredns-64897985d-rrw8v            1/1     Running   0               5h17m
etcd-minikube                      1/1     Running   0               5h17m
kube-apiserver-minikube            1/1     Running   0               5h17m
kube-controller-manager-minikube   1/1     Running   0               5h17m
kube-proxy-9bv6z                   1/1     Running   0               5h17m
kube-scheduler-minikube            1/1     Running   0               5h17m
storage-provisioner                1/1     Running   1 (5h16m ago)   5h17m

注意命令行里要用 -n kube-system 参数,表示检查 kube-system 名字空间里的 Pod,至于名字空间是什么,我们后面会讲到。

2.2 Node 里的组件

Master 里的 apiserverscheduler 等组件需要获取节点的各种信息才能够作出管理决策,那这些信息该怎么来呢?

这就需要 Node 里的 3 个组件了,分别是 kubeletkube-proxycontainer-runtime

  • kubeletNode 的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能,相当于是 Node 上的一个“小管家”。工作节点的核心部分。新工作节点加入节点后,Kubelet 会被部署到新节点,然后 Kubelet 将当前节点注册到集群中。它还有一个职责,监听 API Server 分配的任务,监听到就执行该任务,并维护一个与控制平面的通信频道。

  • kube-proxy 的作用有点特别,它是 Node 的网络代理,只负责管理容器的网络通信,简单来说就是为 Pod 转发 TCP/UDP 数据包,相当于是专职的“小邮差”。

  • container-runtime 是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期,是真正干活的“苦力”。工作节点需要通过它来获取、启动、停止执行任务依赖的容器,它负责容器管理与运行逻辑。

node
我们一定要注意,因为 Kubernetes 的定位是容器编排平台,所以它没有限定 container-runtime 必须是 Docker,完全可以替换成任何符合标准的其他容器运行时,例如 containerdCRI-O 等等,只不过在这里我们使用的是 Docker

这 3 个组件中只有 kube-proxy 被容器化了,而 kubelet 因为必须要管理整个节点,容器化会限制它的能力,所以它必须在 container-runtime 之外运行。

使用 minikube ssh 命令登录到节点后,可以用 docker ps 看到 kube-proxy

$ minikube ssh
Last login: Tue Dec 27 07:28:14 2022 from 192.168.49.1
docker@minikube:~$ docker ps | grep kube-proxy
3b96a6d7c991   9b7cc9982109           "/usr/local/bin/kube…"   18 hours ago   Up 18 hours             k8s_kube-proxy_kube-proxy-9bv6z_kube-system_4eb70a9d-5b2b-4b98-b9cb-beb7fcd55860_0
f552eb12a465   k8s.gcr.io/pause:3.6   "/pause"                 18 hours ago   Up 18 hours             k8s_POD_kube-proxy-9bv6z_kube-system_4eb70a9d-5b2b-4b98-b9cb-beb7fcd55860_0

kubeletdocker ps 是找不到的,需要用操作系统的 ps 命令

$ ps -ef | grep kubelet
root        2274       1  4 Dec27 ?        00:48:59 /var/lib/minikube/binaries/v1.23.3/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime=docker --hostname-override=minikube --housekeeping-interval=5m --kubeconfig=/etc/kubernetes/kubelet.conf --node-ip=192.168.49.2

现在,我们再把 Node 里的组件和 Master 里的组件放在一起来看,就能够明白 Kubernetes 的大致工作流程了:

  • 每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。
  • 每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。
  • scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给某个 Nodekubeletkubelet 调用 container-runtime 启动容器。
  • controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复。

zongti
于是,这些组件就好像是无数个不知疲倦的运维工程师,把原先繁琐低效的人力工作搬进了高效的计算机里,就能够随时发现集群里的变化和异常,再互相协作,维护集群的健康状态。

2.3 插件(Addons)

只要服务器节点上运行了 apiserverschedulerkubeletkube-proxycontainer-runtime 等组件,就可以说是一个功能齐全的 Kubernetes 集群了。

由于 Kubernetes 本身的设计非常灵活,所以就有大量的插件用来扩展、增强它对应用和集群的管理能力。

minikube 也支持很多的插件,使用命令 minikube addons list 就可以查看插件列表:

$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | third-party (ambassador)       |
| auto-pause                  | minikube | disabled     | google                         |
| csi-hostpath-driver         | minikube | disabled     | kubernetes                     |
| dashboard                   | minikube | disabled     | kubernetes                     |
| default-storageclass        | minikube | enabled ✅   | kubernetes                     |
| efk                         | minikube | disabled     | third-party (elastic)          |
| freshpod                    | minikube | disabled     | google                         |
| gcp-auth                    | minikube | disabled     | google                         |
| gvisor                      | minikube | disabled     | google                         |
| helm-tiller                 | minikube | disabled     | third-party (helm)             |
| ingress                     | minikube | disabled     | unknown (third-party)          |
| ingress-dns                 | minikube | disabled     | google                         |
| istio                       | minikube | disabled     | third-party (istio)            |
| istio-provisioner           | minikube | disabled     | third-party (istio)            |
| kong                        | minikube | disabled     | third-party (Kong HQ)          |
| kubevirt                    | minikube | disabled     | third-party (kubevirt)         |
| logviewer                   | minikube | disabled     | unknown (third-party)          |
| metallb                     | minikube | disabled     | third-party (metallb)          |
| metrics-server              | minikube | disabled     | kubernetes                     |
| nvidia-driver-installer     | minikube | disabled     | google                         |
| nvidia-gpu-device-plugin    | minikube | disabled     | third-party (nvidia)           |
| olm                         | minikube | disabled     | third-party (operator          |
|                             |          |              | framework)                     |
| pod-security-policy         | minikube | disabled     | unknown (third-party)          |
| portainer                   | minikube | disabled     | portainer.io                   |
| registry                    | minikube | disabled     | google                         |
| registry-aliases            | minikube | disabled     | unknown (third-party)          |
| registry-creds              | minikube | disabled     | third-party (upmc enterprises) |
| storage-provisioner         | minikube | enabled ✅   | google                         |
| storage-provisioner-gluster | minikube | disabled     | unknown (third-party)          |
| volumesnapshots             | minikube | disabled     | kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|

插件中我个人认为比较重要的有两个:DNSDashboard

  • DNS 它在 Kubernetes 集群里实现了域名解析服务,能够让我们以域名而不是 IP 地址的方式来互相通信,是服务发现和负载均衡的基础。由于它对微服务、服务网格等架构至关重要,所以基本上是 Kubernetes 的必备插件。

  • Dashboard 就是仪表盘,为 Kubernetes 提供了一个图形化的操作界面,非常直观友好,虽然大多数 Kubernetes 工作都是使用命令行 kubectl,但有的时候在 Dashboard 上查看信息也是挺方便的。

你只要在 minikube 环境里执行一条简单的命令,就可以自动用浏览器打开 Dashboard 页面,而且还支持中文:

minikube dashboard

3. 总结

总结

  1. Kubernetes 能够在集群级别管理应用和服务器,可以认为是一种集群操作系统。它使用“控制面 / 数据面”的基本架构,Master 节点实现管理控制功能,Worker 节点运行具体业务。
  2. Kubernetes 由很多模块组成,可分为核心的组件和选配的插件两类。
  3. Master 里有 4 个组件,分别是 apiserveretcdschedulercontroller-manager
  4. Node 里有 3 个组件,分别是 kubeletkube-proxycontainer-runtime
  5. 通常必备的插件有 DNSDashboard

来源:https://time.geekbang.org/column/article/529800

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

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

相关文章

【CUDA入门笔记】GPU存储结构模型(2)

GPU存储结构模型 1.CPU可以读写GPU设备中的Global Memory、Constant Memory以及Texture Memory内存储的内容;主机代码可以把数据传输到设备上,也可以从设备中读取数据; 2.GPU中的线程使用Register、Shared Memory、Local Memory、Global Me…

python网络程序设计,TCP协议客户端服务端智能聊天设计

计算机网络基础知识 网络体系结构,分层设计的好处 网络协议三要素:语法、语义、时序 常见应用层协议:ftp、http、smtp、pop3、telnet…… 传输层主要概念:TCP、UDP、端口号 IP地址 MAC地址 计算机网络基础知识 IP地址 1.IP地址 …

内核RCU的一次实践——实战中加深了理解

遍历内核链表是个常规操作,遍历链表过程可能会向链表增加新成员或者从链表剔除老成员,因此遍历链表时一般需要spin lock加锁保护。如果向链表增加新成员或者从链表剔除老成员不经常出现,大部分只是遍历查询链表中成员,此时链表遍…

Spring Cloud:eureka注册中心

在传统的单体应用中,所有的业务都集中在一个服务器中,当浏览器发起请求时,通过前端请求调用后端接口,后端接口调用相应的业务并在前端进行响应,整个的调用就是从请求到响应的一条龙服务。所以不存在服务之间的中转&…

jetson nano GPIO引脚控制舵机

文章目录一.舵机介绍二.舵机工作原理180度舵机360度舵机三.利用jetson nano GPIO控制舵机1.jetson nano与舵机接2.c编写程序输出脉冲(Qt做界面)一.舵机介绍 舵机,是指在自动驾驶仪中操纵飞机舵面(操纵面)转动的一种执行部件。分有&#xff1a…

代码随想录算法训练营第十三天(栈与队列)| 239. 滑动窗口最大值,347.前 K 个高频元素

代码随想录算法训练营第十三天(栈与队列)| 239. 滑动窗口最大值,347.前 K 个高频元素 239. 滑动窗口最大值 之前讲的都是栈的应用,这次该是队列的应用了。 本题算比较有难度的,需要自己去构造单调队列,建…

std::map使用方式以及注意事项(关于相同key的问题)

std::map的使用在C开发中也是经常会用到的一些东西,这里进行一些简单的使用记录,包括如何插入、删除以及修改等。 1、std::map插入: map的插入使用的是insert的方式,一个map包含了key与value两个值。首先需要对两个值进行赋值&a…

Spring Security认证授权练手小项目 腾讯视频VIP权限管理功能

腾讯视频VIP权限管理1、项目功能视频演示2、需求与设计1、需求2、功能概要3、接口设计3、项目源码结构4、项目源码下载5、项目部署1、部署架构2、数据库环境准备3、redis环境准备4、Spring Boot服务准备5、nginx负载均衡准备6、nginx静态资源服务器准备6、项目介绍1、技术架构2…

人工智能-集成学习

1、 集成学习算法介绍 1.1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题。工作原理:生成多个分类器/模型,各自独立地学习和做出预测。这些预测再结合成组合预测,因此由于任何一个单分类的预测。 1.2 机器学习的两个核心任…

优化RPC网络通信

文章目录什么是RPC通信RPCRPC框架SOARPC通信得重要性具体优化措施1.扩展其他RPC框架.2.选择合适的通信协议3.使用单一长连接4.优化Socket通信.5.高性能的序列化协议6.量身定做报文格式什么是RPC通信 RPC RPC(Remote Process Call),即远程服…

算法训练 —— 链表(2)

目录 1. LeetCode24. 两两交换链表中的结点 2. LeetCode19. 删除链表的倒数第N个节点 3. LeetCode160.相交链表 4. LeetCode141.环形链表 5. LeetCode142.环形链表II 6. LeetCode138.复制带随机指针的链表 1. LeetCode24. 两两交换链表中的结点 两两交换链表中的结点 …

机器学习时间序列特征处理与构造,这篇我建议你收藏

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。 那特征工程是什么? 特征工程是利用数据领域的相关…

vue3 antd项目实战——Form表单使用【v-model双向绑定数据,form表单嵌套input输入框、Radio单选框】

vue3 ant design vue项目实战——单选框(Radio)的使用以及Form表单的双向绑定知识调用(form表单的源代码附在文章最后)场景复现实现需求form表单整体架构的搭建input输入框文本域的嵌套单选组合Radio的嵌套button按钮组合的嵌套fo…

小米手机不为人知的秘密—后台静默安装任何应用

导读你是否拥有一台小米,HTC,三星或者是一加的 Android 手机呢?如果回答是肯定的,那么你应该意识到,几乎所有的智能手机厂商提供的定制 ROM,如 CyanogenMod、Paranoid Android、 MIUI 或者一些其它的 ROM 都…

再谈指针(12)

目录 1、字符指针 2、指针数组 3、数组指针 1、定义 2、&数组名VS数组名 3、数组指针的使用 1、二维数组的数组名 4、数组参数、指针参数 1、一维数组传参 2、二维数组传参 3、一级指针传参 4、二级指针传参 5、函数指针 6、函数指针数组 7、指向函数指针数…

SpringCloud之Sleuth全链路日志跟踪

文章目录1 Sleuth链路跟踪1.1 分布式系统面临的问题1.2 Sleuth是什么1.3 Zipkin是什么1.4 链路监控相关术语1.5 实战练习1.5.1 pom.xml1.5.2 添加yml配置1.5.3 添加控制器1.5.4 测试访问1.6 Zipkin1.6.1 下载与启动1.6.2 搭建链路监控步骤1.6.2.1 搭建8990提供者1.6.2.2 搭建89…

08 `.o`中的汇编信息 hopper disassembler 调试 HelloWorld

前言 上周[2020.05.23]想要 直接使用 fastdebug 版本的 jdk 来进行调试, 可惜失败了 原来是 缺少 可执行文件关联的, object file, 里面记录了 关联的源码的一些信息 看来还是 免不了, 需要 手动 编译 open jdk, 哎 本文主要是两个东西 : 1. 查看 object file 中的汇编信…

CSS权威指南(一)CSS概述

文章目录1.元素2.引入样式表3.样式表4.媒体查询5.特性查询1.元素 (1)置换元素和非置换元素 置换元素,指用来置换元素内容的部分不由文档内容直接表示。比如img标签。非置换元素,元素的内容是由用户代理在元素自身生成的框中显示…

这样的C盘或许还有?救救C盘......

C盘红了!!! 大部分软件默认缓存在C盘(有的甚至只能安装到C盘) C盘太满电脑运行会很卡顿 对于这种情况,为了节约C盘空间,我们可以将这些被迫存在C盘的文件挪到其他盘 但是有的应用无法更改默…

C++ 显示图片

编译环境为codeblocks 20.03&#xff0c;编译器为mingw64非自带的版本&#xff08;版本号多少忘记了&#xff09; 头文件 #include <graphics.h>//图形库 #include <conio.h>//_getch() 显示图片代码 int main() {initgraph(640,360,EX_SHOWCONSOLE);//初始化绘…