草庐IT

【云原生】初识 Kubernetes — pod 的前世今生

一碗黄豆酱 2023-08-09 原文

目录标题

前言

跟着博主从0到1学习K8s! 我行,你也行!

该文章是我的系列专栏的第一篇文,首先一下 Kubernetes ,然后进行pob 的详细讲解。

🐳 Kubernetes到底是什么?

下列介绍部分来自网络,如有侵权,告知删除!谢谢

🐬 K8s 的由来

大家或许听过 K8s,其实他就是 Kubernetes 的简称。那么这个简称是如何得来的呢?他的前世到底是什么?

其实这个简称的由来非常简单,我这种专职摸鱼户非常喜欢这种偷懒的方式,K 就是 Kubernetes 的首字母,s 是 Kubernetes 的末尾字母,数字8则是表明在 K 和 s 之间的字符 ‘ubernete’ 个数为8。所以我们简称其为K8s

🐬K8s 的工作方式

那么K8s为什么会被创造出来呢?

在他诞生之前,传统的应用部署方式是通过插件或脚本来安装应用。但是这种做法不利于应用的升级更新/回滚等操作,虽然我们可以通过虚拟机进行实现某些功能,但是移植性不强。

至此,我们的K8s应运而生!

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

(1) K8s 通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。

(2) 容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。

🐬 K8s 主要组件

在K8s的整体框架中,包含Master 组件、Node 组件,Master组件是提供集群的管理控制中心。节点组件运行在Node,提供Kubernetes运行时环境,以及维护Pod。

🐋Master 组件

Master 组件里面都有什么呢?
  1. kube-apiserver (统一的服务访问入口)
  2. ETCD (写入集群信息)
  3. kube-controller-manager
  4. cloud-controller-manager
  5. kube-scheduler
  6. 插件 addons
    6.1 DNS (创建域名对应解析)
    6.2用户界面
    6.3容器资源监测
    6.4Cluster-level Logging

🐋Node 组件

Node 组件里面都有什么呢?
  1. kubelet (直接与容器引擎交互 实现生命周期管理)
  2. kube-proxy (写入规则 、实现服务映射访问)
  3. docker
  4. RKT
  5. supervisord
  6. fluentd

至此对于 Kubernetes 的初步认识就告一段落了,接下来我们详细讲解一下 “ pod ”

🐳 pod 是什么?

🐬pod 的概念

博主比较倾向的pod的分类是自主式 pod 和控制器管理的 pod

自主式 pod 字面意思就是自由的pod,可以将不受控制器管理的pod称为自由式 pod,这里的自由就是存在与否不会被在意,消失后也不会被控制器增加,多了也不会被消除。

pod是有生命周期的,如过时间过长是会死亡的!具体后续会讲到

那么控制器管理的pod的意思就呼之欲出了!即为受控制器管理的pod。被控制器拿捏的妥妥的 (ง •_•)ง

🐬控制管理器

接下来我们介绍一下pod内各个容器与pause的关系。

从上图中我们可以看出,pod中的 container可以有很多个( n>=1 ),但是有一点,他们共用 pause 的地址段,即为地址资源共享。

在一个pod里面,既共享地址段又共享存储卷。

那么接下来我们介绍一下受控制器管理的 pod。首先我们需要了解这个控制管理。

🐟 控制管理–ReplicationController

ReplicationController是一种Kubernetes资源,可确保它的pod始终保持运行状态。他是用来确保容器应用副本的数量始终保持在用户定义的副本数。如果pod异常退出或者因任何原因消失(例如节点从集群中消失或由于该pod被从节点中逐出),则ReplicationController会注意到缺少了pod并创建替代pod。

我用接下来的两幅图来解释一下这个过程。

假设上述为正常运行的节点1和节点2,我们节点1中的pod 2是受控制器控制的,而pod 1没有。


此时,节点 1出现问题了,那么属于自由式pod 的pod 1只能仍其消失,但是pod 2就不同了,他是被控制器控制的,当节点 1连带着pod 2消失后,ReplicationController 会自动在节点2生成pod 2’ 的替代,使得用户设定的副本数保持不变。


在新版本Kubernetes 中,建议使用ReplicaSet来代替ReplicationController

虽然ReplicaSet可以独立使用,但是一般还是使用Deployment来自动管理ReplicaSet,因为这样不需要关系兼容问题。(比如ReplicaSet不支持滚动更新,但是Deployment支持)

在此介绍一个概念:滚动更新(rolling-update)

当我们想要更新一个 pod 时,我们可以先建立一个新的 pod,因为需要保持副本数一定,所以我们需要删除一个 pod ,这时我们将旧的 pod 删除,即可实现更新。

接下来博主用下列图像讲解Deployment是如何实现自动管理

此时我们有版本1的两个pod(此时ReplicaSet为旧版本) ,我们想要将其滚动更新为版本2,更新过程如下


首先根据滚动更新概念,我们先创建一个新的ReplicaSet 2,然后新建一个V2版本的 pod,然后删除旧版本。


和上述步骤一致,将另一个 pod 新建后,删除旧的 pod

其实因为存在回滚机制,pod 并不是删除消失,更贴切的说法是停用


🐟 控制管理–HPA(Horizontal Pod Autoscaling)

Horizontal Pod Autoscaling仅适用于Deployment 和 ReplicaSet 。在V1中支持 pod 的 cpu 利用率进行扩缩容,在vlalpha中支持根据内存以及用户定义的 metric 进行扩缩容。

接下来,依旧是通过图解来介绍这个控制过程 🐼

上述我们看到HPA控制了RS( ReplicaSet ),他的控制过程是什么呢?

我们在HPA中设定CPU利用率的一个阈值XX,以及最大pod数MAX(X)和最小pod数MIN(X)

这里的XX表示任意数,是人为设定的

那么这个CPU利用率的阈值是如何影响HPA的控制呢,当我们的CPU利用率太高时,超过设定的XX阈值,那么说明计算机忙不过来了,我们需要新建pod来分担压力。所以此时HPA会控制RS新建pod,当然如果CPU利用率第于阈值,RS会回收pod

这个MAX和MIN是如何控制呢?

当CPU利用率高于阈值,我们需要新建pod,但是不能无限制新建,所以这个MAX就是最大pod数,同理我们回收也不可以小于MIN最小值。

综上所述,我们可以利用HPA实现自动水平扩缩!


🐟 StatefulSet

StatefulSet是为了解决有状态服务的问题,因为在此之前Deployments和ReplicaSets是为无状态服务而设计,他的应用场景如下:

  • 稳定的持久化存储,就是 Pod在重新调度后还是能访问到相同的持久化数据
  • 稳定的网络标志,就是 Pod 重新调度后其 PodName和 HostName 不变,基于Headless Service来实现
  • 稳定的持久化存储,就是Pod重新调度后还是能访问到相同的持久化数据
  • 稳定的网络标志,就是Pod 重新调度后其PodName和主机名不变

🐟 DaemonSet

DaemonSet是为了确保节点上运行一个 Pod 的副本。当有节点加入集群时,会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除DaemonSet 将会删除它创建的所有Pod。就相当于DS(DaemonSet)是一个管理员,负责节点上不能没有pod,当然如果DS这个管理员被删除的话,他的小弟pod也会被回收。
使用DaemonSet 的一些典型用法:


🐟 Job

Job有点像是批量化管理pod,我们可以设定pod正常执行次数,只有当pod正常执行次数达标后才允许Job结束。

Cron Job 是其中基于时间管理的,基于时间去管理pod。


🐬客户端(Client)— pod

Client是通过访问service的IP加端口,然后由service连接pod。(利用好service我们可以进行pod-pod的交流)

一般来讲都是 负载+缓存+程序+数据库

总结

此篇只是进行入门介绍,等后续文章进行后续讲解,期待关注阿酱,收藏专刊喔!超级干货等你来看!

有关【云原生】初识 Kubernetes — pod 的前世今生的更多相关文章

  1. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  2. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  3. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  4. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

  5. ruby - 如何让 Ruby 找到原生库? - 2

    我在/usr/local/lib中安装了一些本地库。我现在正在尝试安装一个需要这些的gem,以便正确构建,但是gem构建失败,因为它找不到图书馆。gem的extconf.rb文件试图确认它可以找到库have_library()但由于某种原因失败了。我尝试设置一堆环境变量,但似乎没有任何效果:irb(main):003:0>require'mkmf'=>trueirb(main):004:0>have_library('gecodesearch')checkingformain()in-lgecodesearch...no=>falseirb(main):005:0>ENV['LD_LI

  6. kubernetes集群划分节点 - 2

    Kubernetes(K8s)是一个用于管理容器化应用程序的开源平台,可以帮助开发人员更轻松地部署、管理和扩展应用程序。在Kubernetes中,集群划分是一种重要的概念,可以帮助我们更好地组织和管理集群中的节点和资源。本文将介绍如何使用Kubernetes对集群进行划分,并提供详细的操作示例,希望能够帮助读者更好地了解和使用Kubernetes平台。Node划分Node划分是将集群中的节点按照一定的规则进行划分。在Kubernetes中,可以使用NodeSelector和Affinity机制来实现Node划分。NodeSelectorNodeSelector是一种将Pod调度到符合特定节点标

  7. 云原生(十八) | Kubernetes篇之Kubernetes(k8s)工作负载 - 2

    文章目录Kubernetes(k8s)工作负载一、Workloads二、Pod三、Deployment四、RC、RS、DaemonSet、StatefulSet五、Job、CronJob1、Job2、CronJob六、GCKubernetes(k8s)工作负载一、Workloads什么是工作负载(Workloads)工作负载是运行在Kubernetes上的一个应用程序。一个应用很复杂,可能由单个组件或者多个组件共同完成。无论怎样我们可以用一组Pod来表示一个应用,也就是一个工作负载Pod又是一组容器(Containers)所以关系又像是这样工作负载(Workloads)控制一组PodPod控制

  8. ruby - 更新到 cocoapods 0.32.1 后无法运行 sudo pod install,错误为 "You cannot run CocoaPods as root. (CLAide::Help)" - 2

    我在更新到最新版本0.32.1后运行sudopodinstall命令时发现了一个问题。早些时候它工作得很好。当我尝试使用旧的cocoapods安装pod时,它要求我更新到最新的cocoapods版本,即0.32.1。在我通过cocoapodsgem更新后,我无法在我的Xcode项目中执行sudopodinstall。它给了我以下错误。±sudopodinstallruby-1.9.3-p0Password:/Users/username/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/gems/1.9.1/gems/claide-0.5.0/lib/claide/

  9. ruby - Pod setup 找不到 cocoapods - 2

    使用sudogeminstallcocoapods安装cocoapods后,尝试运行“podsetup”会返回此错误:Couldnotfind'cocoapods'(>=0)among22totalgem(s)(Gem::LoadError)“pod设置”的输出:/Users/Kevin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:313:in`to_specs':Couldnotfind'cocoapods'(>=0)among22totalgem(s)(Gem::LoadEr

  10. ruby - 创建 repo 时无法加载 gem cocoa pod - 2

    rubygems/dependency.rb:296:in`to_specs':在总共35个gem中找不到'cocoapods'(>=0)(Gem::LoadError)来自/Users/divyam.shukla/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/rubygems/dependency.rb:307:in`to_spec'from/Users/user/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/rubygems/core_ext/kernel_gem.rb:47:in`gem'from/U

随机推荐