【Kubernetes 笔记】一步一步推导 Kubernetes 核心组件

引言

Kubernetes,通常简称为 K8s,它是一个开源的容器编排系统。其前身是拥有 15 年生产级别实践经验的 Borg 项目,Google 在 2014 年 9 月将这个项目开源成为 K8s 的第一个版本

在随后的几年,K8s 与 Docker 展开了激烈的容器编排大战。后来 Docker 将 Docker Swarm 内置到了 Docker 中,也就是 Docker 1.12,这引起了行业的不满,反而使得 K8s 社区空前活跃,K8s 很快就大比分胜出,成为云原生时代事实上的基础设施

接下来将介绍 K8s 是什么,并以推导的方式,介绍 K8s 核心概念,以及 K8s 集群架构模型

一、Kubernetes 是什么

K8s 官网链接

K8s 是一款容器编排工具,以服务集群的形式工作,对集群节点上运行的容器进行自动化管理,可以实现应用程序的部署、伸缩、监控等多种需求

K8s 是用 Go 语言开发的,其主要功能如下

  • 服务发现和负载均衡
    • 服务可以通过自动发现的形式找到它所依赖的服务
    • 如果一个服务启动了多个容器实例,自动实现请求的负载均衡
  • 自动发布和回滚
    • 以声明式配置的方式,描述应用程序容器的期望状态,K8s 将以合适的速率调整容器的实际状态,并逐步达到最终期望的状态
    • 如果最新发布的程序有故障,可以快速回退到之前的版本
  • 弹性伸缩
    • 根据实际需求,对运行中的容器实例数量进行调整
  • 自愈功能
    • 重启非正常停机的容器
    • 替换、kill 那些不满足自定义健康检查条件的容器
    • 在容器就绪之前,避免调用者发现该容器
  • 存储编排
    • 根据容器自身的需求,自动创建存储卷

二、推导 Kubernetes 核心概念

K8s 是容器编排工具,那一定会涉及到对容器的操作,现在就从 Docker 容器开始,一步一步推导出 K8s 的一些核心组件

(一) Pod

K8s 不直接操作 Docker 容器,而是对其做了简单的封装,于是有了 K8s 的最小操作单元—— Pod

官方文档

A Pod is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers

Pod 是一组 container 的集合,共享存储和网络。Pod 的运行状态是由声明式配置文件中的 PodTemplate 描述的,如下图所示

K8s 将 Pod 中的容器分为以下 3 类

  1. 初始化容器 / init container
    1. 在应用容器启动之前运行,可以配置一个或多个
    2. 总是运行到结束状态
    3. 如果配置了多个初始化容器,前一个成功结束后,下一个容器才会开始执行
  2. 应用容器 / app container
    1. 真正用于运行应用程序的容器
    2. 不能添加应用容器到运行中的 Pod
  3. 临时容器 / ephemeral container
    1. K8s v1.25 新增特性
    2. 可以添加临时容器到运行中的 Pod 中,用于检查运行状态,通常是 Debug

(二) ReplicaSet

线上环境部署应用程序时,通常会部署多个服务实例。在 K8s 中对应多个副本的组件是 ReplicaSet,它包含一个或多个 Pod

官方文档

A ReplicaSet is defined with fields, including a selector that specifies how to identify Pods it can acquire, a number of replacas indicating how many Pods it should be maintaining, add a pod template specifying the data of new Pods it should create to meet the number of replicas criteria.

ReplicaSet 用来维护一个数量稳定的 Pod 副本集合,ReplicaSet 与 Pod 的关系如下图所示

(三) Deployment

虽然 ReplicaSet 已经可以对 Pod 进行新增、删除等操作了,但 K8s 设计了 Deployment 作为 ReplicaSet 的一个替代项,并推荐始终使用 Deployment,即使只需要一个 Pod

官方文档

A Deployment provides declarative updates for Pods and ReplicaSets.

Deployment 常用于部署无状态服务。Deployment 支持声明式更新 Pod 和 ReplicaSet。使用 Deployment 方式时,仍然会创建 ReplicaSet,但 Deployment 将处理相关细节

(四) Label

当 Pod 数量不断增加时,如果不采取某些措施,K8s 也会难以区分。K8s 设计了 Label,可以将相同或者有关联的 Pod 归集到一起

官方文档

Labels are key/value pairs that are attached to objects, such as pods.

Keep in mind that label Key must be unique for a given object.

K8s 中的 Label 是附加到 K8s 对象上的一组名值对(不仅仅是 Pod),但又不会对 K8s 核心逻辑造成影响

可以在创建 K8s 对象时添加 Label,也可以在对象创建后再添加

Label 的 key 分为两部分:可选前缀 / 标签名

(五) Label Selector

定义了 Label 之后,可以通过 Label Selector 选取那些有关联的 K8s 对象

官方文档

Via a label selector, the client/user can identify a set of objects. The label selector is the core grouping primitive in Kubernetes.

Label Selector 支持 2 种写法

  • 等值标签选择器 / equality-based Selector
environment = production
tier != frontend
  • 集合标签选择器 / set-based Selector
environment in (production, qa)
tier notin (frontend, backend)
# 以下两种写法只根据 Label 的 key 进行选择
partition
!partition

(六) Service

具有相同 Label 的 Pods,可以抽象成 Service,作为对外服务的统一入口

官方文档

An abstract way to expose an application running on a set of Pods as a network service.

Service 与 Pod 的关系如下图所示

(七) Node

有了 Service 以后,还需要启动才能对外提供服务。K8s 最终会将 Pod 运行在 Node 上,Node 可以是物理机,也可以是虚拟机

官方文档

Kubernetes runs your workload by placing containers into Pods to run on Nodes. A node may be a virtual or physical machine, depending on the cluster. Each node is managed by the control plane and contains the services necessary to run Pods.

每个 Node 上都包含可以管理 Pod 的 K8s 基础服务,如下图所示

(八) Master

前面已经提到,K8s 通常工作在集群模式下,也就是多个 Node,并且其中包含充当 Master 角色的 Node,如下图所示

 

三、推导 Kubernetes 核心组件

上一部分已经推导出了一个简单的 K8s 集群的组成部分,即 1 个主节点(Master Node) 和 2 个工作节点(Worker Node)。接下来就从这里开始,并去掉一些细节,继续推导 K8s 的核心组件

(一) kubectl

假设有一个用户,想要通过命令在 K8s 集群创建一些 Pods,那他应该会想通过命令行工具来操作,这就是 kubectl 组件

kubectl 是 K8s 提供给用户,用于操作 K8s 集群的命令行工具,如下图所示

(二) APIServer

用户通过 kubectl 向 K8s 集群发送请求后,首先会由 Master Node 接收,具体是由其中的 APIServer 组件接收的,如下图所示

(三) Scheduler

APIServer 收到请求之后,接下来该通知哪个 Worker Node 执行创建 Pod 的操作,就需要用到调度策略了,也就是 Scheduler 组件,如下图所示

(四) Controller Manager

K8s 中的组件遵循单一职责原则,Scheduler 经过深思熟虑之后,决定让 Worker Node2 去创建 Pod,但 Scheduler 不主动出面,而是让另一个组件负责,那就是 Controller Manager

Controller Manager 负责分发请求到具体的 Worker Node 上,如下图所示

(五) kubelet

Worker Node 收到创建请求后,由 kubelet 组件负责后续工作,它将调用该 Node 上的容器引擎创建容器

kubelet 是 Node 上的一个代理程序。它确保 PodSpec 定义中所描述的容器处于运行和健康的状态,如下图所示

(六) kube-proxy

到这里其实创建 Pod 的相关组件差不多就位了,但这涉及到集群间的网络通信,不得不提到一个与网络相关的组件,那就是 kube-proxy

kube-proxy 是一个网络代理程序,运行在集群的每一个 Node 上。它维护必需的网络规则,这些网络规则使得集群内、集群外都可以与 Pod 进行正常通信

适当调整 Worker Node 上的组件后,如下图所示

(七) etcd

另外,在集群中共享数据需要用到分布式存储,etcd 也就顺理成章地登场了

etcd 是支持一致性和高可用的名值对存储组件,K8s 集群的所有配置信息都存储在 etcd 中

(八) Dashboard

相比于 kubectl,K8s 提供了一个图形化的集群管理组件 Web UI,也就是 Dashboard

在第六步的基础上,添加 etcd 和 Dashboard 之后,推导出的集群架构图如下

四、官网集群架构图

推导完成后,再来看看官网的集群架构图

从图中可以看到,Control Plane 里的组件,除了 etcd,其他组件都是多个实例。生产环境下,为了实现高可用,通常是将 Manager Node 部署在多个节点上,也形成一个集群

后记

K8s 的知识点非常多,本文只是对 K8s 的核心组件做了一个简单的介绍,并且是一步步推导出来的,这样可以加深印象。后续的文章会深入介绍 K8s 的相关知识

参考文档

Kubernetes 官网

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一束尘光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值