0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详解Kubernetes架构原理

马哥Linux运维 ? 来源:高效运维 ? 作者:高效运维 ? 2022-07-14 09:50 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

打开这篇文章的同学,想必对 Docker 都不会陌生。Docker 是一种虚拟容器技术,它上手比较简单,只需在宿主机上起一个 DockerEngine,然后就能愉快的玩耍了,如:拉镜像、起容器、挂载数据、映射端口等等。相对于 Kubernetes(K8S)的上手,可谓简单很多。

那么 K8S 是什么,又为什么上手难度大?K8S 是一个基于容器技术的分布式集群管理系统,是谷歌几十年来大规模应用容器技术的经验积累和升华的一个重要成果。所以为了能够支持大规模的集群管理,它承载了很多的组件,而且分布式本身的复杂度就很高。又因为 K8S 是谷歌出品的,依赖了很多谷歌自己的镜像,所以对于国内的同学环境搭建的难度又增加了一层。

下面,我们带着问题,一步步来看 K8S 中到底有哪些东西?

首先,既然是个分布式系统,那势必有多个 Node 节点(物理主机或虚拟机),它们共同组成一个分布式集群,并且这些节点中会有一个 Master 节点,由它来统一管理 Node 节点。

如图所示:

ff2ade1e-02b0-11ed-ba43-dac502259ad0.jpg

问题一:主节点和工作节点是如何通信的呢?

首先,Master 节点启动时,会运行一个kube-apiserver进程,它提供了集群管理的 API 接口,是集群内各个功能模块之间数据交互和通信的中心枢纽,并且它页提供了完备的集群安全机制(后面还会讲到)。

在 Node 节点上,使用 K8S 中的 kubelet 组件,在每个 Node 节点上都会运行一个 kubelet 进程,它负责向 Master 汇报自身节点的运行情况,如 Node 节点的注册、终止、定时上报健康状况等,以及接收 Master 发出的命令,创建相应 Pod。

在 K8S 中,Pod 是最基本的操作单元,它与 docker 的容器有略微的不同,因为 Pod 可能包含一个或多个容器(可以是 docker 容器),这些内部的容器是共享网络资源的,即可以通过 localhost 进行相互访问。

关于 Pod 内是如何做到网络共享的,每个 Pod 启动,内部都会启动一个 pause 容器(google的一个镜像),它使用默认的网络模式,而其他容器的网络都设置给它,以此来完成网络的共享问题。

如图所示:

ff386f16-02b0-11ed-ba43-dac502259ad0.jpg

问题二:Master 是如何将 Pod 调度到指定的 Node 上的?

该工作由 kube-scheduler 来完成,整个调度过程通过执行一些列复杂的算法最终为每个 Pod 计算出一个最佳的目标 Node,该过程由 kube-scheduler 进程自动完成。常见的有轮询调度(RR)。当然也有可能,我们需要将 Pod 调度到一个指定的 Node 上,我们可以通过节点的标签(Label)和 Pod 的 nodeSelector 属性的相互匹配,来达到指定的效果。

如图所示:

ff4aec36-02b0-11ed-ba43-dac502259ad0.jpg

关于标签(Label)与选择器(Selector)的概念,后面会进一步介绍

问题三:各节点、Pod 的信息都是统一维护在哪里的,由谁来维护?

从上面的 Pod 调度的角度看,我们得有一个存储中心,用来存储各节点资源使用情况、健康状态、以及各 Pod 的基本信息等,这样 Pod 的调度来能正常进行。

在 K8S 中,采用 etcd 组件作为一个高可用强一致性的存储仓库,该组件可以内置在 K8S 中,也可以外部搭建供 K8S 使用。

集群上的所有配置信息都存储在了 etcd,为了考虑各个组件的相对独立,以及整体的维护性,对于这些存储数据的增、删、改、查,统一由 kube-apiserver 来进行调用,apiserver 也提供了 REST 的支持,不仅对各个内部组件提供服务外,还对集群外部用户暴露服务。

外部用户可以通过 REST 接口,或者 kubectl 命令行工具进行集群管理,其内在都是与 apiserver 进行通信。

如图所示:

ff597850-02b0-11ed-ba43-dac502259ad0.jpg

问题四:外部用户如何访问集群内运行的 Pod ?

前面讲了外部用户如何管理 K8S,而我们更关心的是内部运行的 Pod 如何对外访问。使用过Docker的同学应该知道,如果使用 bridge 模式,在容器创建时,都会分配一个虚拟 IP,该 IP 外部是没法访问到的,我们需要做一层端口映射,将容器内端口与宿主机端口进行映射绑定,这样外部通过访问宿主机的指定端口,就可以访问到内部容器端口了。

那么,K8S 的外部访问是否也是这样实现的?答案是否定的,K8S 中情况要复杂一些。因为上面讲的 Docker是单机模式下的,而且一个容器对外就暴露一个服务。在分布式集群下,一个服务往往由多个 Application 提供,用来分担访问压力,而且这些 Application 可能会分布在多个节点上,这样又涉及到了跨主机的通信。

这里,K8S 引入了 Service 的概念,将多个相同的 Pod 包装成一个完整的 service 对外提供服务,至于获取到这些相同的 Pod,每个 Pod 启动时都会设置 labels 属性,在 Service 中我们通过选择器 Selector,选择具有相同 Name 标签属性的 Pod,作为整体服务,并将服务信息通过 Apiserver 存入 etcd 中,该工作由 Service Controller 来完成。同时,每个节点上会启动一个 kube-proxy 进程,由它来负责服务地址到 Pod 地址的代理以及负载均衡等工作。

如图所示:

ff697c78-02b0-11ed-ba43-dac502259ad0.jpg

问题五:Pod 如何动态扩容和缩放?

既然知道了服务是由 Pod 组成的,那么服务的扩容也就意味着 Pod 的扩容。通俗点讲,就是在需要时将 Pod 复制多份,在不需要后,将 Pod 缩减至指定份数。K8S 中通过 Replication Controller 来进行管理,为每个 Pod 设置一个期望的副本数,当实际副本数与期望不符时,就动态的进行数量调整,以达到期望值。期望数值可以由我们手动更新,或自动扩容代理来完成。

如图所示:

ff88409a-02b0-11ed-ba43-dac502259ad0.jpg

问题六:各个组件之间是如何相互协作的?

最后,讲一下 kube-controller-manager 这个进程的作用。我们知道了 ectd 是作为集群数据的存储中心, apiserver 是管理数据中心,作为其他进程与数据中心通信的桥梁。而 Service Controller、Replication Controller 这些统一交由 kube-controller-manager 来管理,kube-controller-manager 作为一个守护进程,每个 Controller 都是一个控制循环,通过 apiserver 监视集群的共享状态,并尝试将实际状态与期望不符的进行改变。关于 Controller,manager 中还包含了 Node 节点控制器(Node Controller)、资源配额管控制器(ResourceQuota Controller)、命名空间控制器(Namespace Controller)等。

如图所示:

ff98a994-02b0-11ed-ba43-dac502259ad0.jpg

总结

本文通过问答的方式,没有涉及任何深入的实现细节,从整体的角度,概念性的介绍了 K8S 中涉及的基本概念,其中使用相关的包括有:

Node

Pod

Label

Selector

Replication Controller

Service Controller

ResourceQuota Controller

Namespace Controller

Node Controller

以及运行进程相关的有:

kube-apiserver

kube-controller-manager

kube-scheduler

kubelet

kube-proxy

pause

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 谷歌
    +关注

    关注

    27

    文章

    6233

    浏览量

    108617
  • 容器
    +关注

    关注

    0

    文章

    517

    浏览量

    22559
  • Docker
    +关注

    关注

    0

    文章

    521

    浏览量

    13137
  • kubernetes
    +关注

    关注

    0

    文章

    254

    浏览量

    9153

原文标题:关于 Kubernetes 架构原理,这是我看过最清晰明了的一篇

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    生产环境中Kubernetes容器安全的最佳实践

    随着容器化技术的快速发展,Kubernetes已成为企业级容器编排的首选平台。然而,在享受Kubernetes带来的便利性和可扩展性的同时,安全问题也日益凸显。本文将从运维工程师的角度,深入探讨生产环境中Kubernetes容器
    的头像 发表于 07-14 11:09 ?195次阅读

    树莓派部署 Kubernetes:通过 UDM Pro 实现 BGP 负载均衡!

    最近,我将家庭实验室的架构核心切换为组树莓派。尽管在树莓派上运行的Kubernetes发行版众多,但在资源受限的设备上运行Kubernetes时,控制平面的开销是
    的头像 发表于 06-25 18:00 ?389次阅读
    树莓派部署 <b class='flag-5'>Kubernetes</b>:通过 UDM Pro 实现 BGP 负载均衡!

    详解Kubernetes中的Pod调度亲和性

    Kubernetes(K8s)中,Pod 调度亲和性(Affinity) 是种高级调度策略,用于控制 Pod 与节点(Node)或其他 Pod 之间的关联(亲和)或反关联(反亲和)关系。通过亲和性规则,管理员可以更精细地控制 Pod 的调度行为,满足业务的拓扑约束、
    的头像 发表于 06-07 13:56 ?337次阅读

    【必看】开关电源中每个元器件的计算+51页图文详解

    开关电源的各个元器件怎么计算?损耗怎么估算?散热器的大小怎么计算? 51页图文详解带你弄懂! 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持
    发表于 05-12 16:20

    Kubernetes Helm入门指南

    Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes
    的头像 发表于 04-30 13:42 ?2582次阅读
    <b class='flag-5'>Kubernetes</b> Helm入门指南

    如何在基于Arm Neoverse平台的CPU上构建分布式Kubernetes集群

    在本文中,我们将以 X(原 Twitter)为例,演示如何在基于 Arm Neoverse 平台的 CPU 上构建分布式 Kubernetes 集群,以根据推实时监控情绪变化。如此来,你可以充分利用 Arm Neoverse
    的头像 发表于 03-25 15:58 ?427次阅读
    如何在基于Arm Neoverse平台的CPU上构建分布式<b class='flag-5'>Kubernetes</b>集群

    Kubernetes中部署MySQL集群

    般情况下 Kubernetes 可以通过 ReplicaSet 以个 Pod 模板创建多个 pod 副本,但是它们都是无状态的,任何时候它们都可以被个全新的 pod 替换。
    的头像 发表于 03-18 16:22 ?347次阅读
    <b class='flag-5'>Kubernetes</b>中部署MySQL集群

    Kubernetes包管理工具Helm的安装和使用

    Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义、安装和升级复杂的 Kubernetes 应用程序,Charts 包很容易创建、版本管理、分享和分布。
    的头像 发表于 03-13 16:06 ?1291次阅读

    Kubernetes Pod常用管理命令详解

    Kubernetes Pod常用管理命令详解
    的头像 发表于 02-17 14:06 ?620次阅读
    <b class='flag-5'>Kubernetes</b> Pod常用管理命令<b class='flag-5'>详解</b>

    Kubernetes:构建高效的容器化应用平台

    init初始化集群,按照提示配置kubeconfig文件,它包含集群连接信息。从节点通过kubeadm join命令加入集群。 Pod 是 Kubernetes 中最小的可部署单元,个 Pod 可以包含
    的头像 发表于 01-23 15:22 ?392次阅读

    使用 Flexus 云服务器 X 实例部署 Kubernetes 图形化管理平台

    Kubernetes 作为当今最流行的容器编排平台,随着云计算、微服务架构和 DevOps 文化的普及,Kubernetes 在自动化部署、扩展和管理容器化应用程序方面扮演着越来越重要的角色。未来
    的头像 发表于 01-21 16:14 ?397次阅读
    使用 Flexus 云服务器 X 实例部署 <b class='flag-5'>Kubernetes</b> 图形化管理平台

    看懂SoC的架构

    、SoC 架构图:核心功能和设计目标 SoC 是基于通用处理器这样的思路进行设计的,与 PC 设计思路样。即通用处理器是由 CORE + MEM 两部分组成,修改软件来实现不同的功能,电脑还是
    的头像 发表于 11-29 09:57 ?3499次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>看懂SoC的<b class='flag-5'>架构</b>

    智慧公交是什么?带你详解智慧公交的解决方案!

    智慧公交是什么?带你详解智慧公交的解决方案!
    的头像 发表于 11-05 12:26 ?1080次阅读
    智慧公交是什么?<b class='flag-5'>一</b><b class='flag-5'>文</b>带你<b class='flag-5'>详解</b>智慧公交的解决方案!

    CPK为什么要大于1.33?详解CPK计算

    原文标题:CPK为什么要大于1.33?详解CPK计算
    的头像 发表于 11-01 11:08 ?1263次阅读

    Kubernetes集群搭建容器云需要几台服务器?

    Kubernetes集群搭建容器云需要几台服务器?至少需要4台服务器。搭建容器云所需的服务器数量以及具体的搭建步骤,会根据所选用的技术栈、业务规模、架构设计以及安全需求等因素而有所不同。以下是个基于
    的头像 发表于 10-21 10:06 ?530次阅读