Day 28: Kubernetes 原理

Kubernetes是一个知名的分散式管理、编排Container工具,帮助你将不同的dockerized的APP部属在不同的环境中(e.g. 不同机器、不同云端)的container。由Google开源并由GO语言撰写。由於Kubernetes太长,很多人都称他为K8S(中间有8个字母)。Kubernetes本身是一个希腊文,意思是船舵或是飞行员的,icon设计为一个船舵,得到了Kubernetes就能在云端与Container化的暗潮中前行。
https://ithelp.ithome.com.tw/upload/images/20210930/20119044BLZPqDLaR8.png

本文参考自:Kubernetes Crash Course for Absolute Beginners

Kubernetes解决了什麽? 现代化应用趋於MincroServices导致Container应用上升,过去常写script来管理,但是这实在是太复杂了。因此Kubernetes作为编排Container工具诞生了。Kubernetes有以下几个优点:

  1. High Available (对於使用者来说几乎不会有服务暂停时间)
  2. High Scalability (更高的扩展性来应对流量)
  3. Disaster recovery (备份与还原)

Kubernetes 架构

K8S可以区分成至少一个Master与许多Node(Worker)端。采Clustering架构,在Master中会有重要的4个执行部分:

  • API Server: K8s的API接口,负责与Node沟通也是User连进来的入口点。又分成三种User可以操作API Server的方式
    • kubectl : 透过Kubectl指令直接下达命令
    • Rest API : HTTP API接口来调度K8s
    • Web UI : 透过K8S本身的UI来操作K8s
  • ETCD : 保存各个Node状态的资料库 Key:Value、reconver 状态
  • Controller Manager : 管理cluster发生事情
  • scheduler : 当建立新的container(称作pod)要放在哪个node之中。

Worker Node分成三个部分:

  • kubelet : Node端负责与Master的API Server沟通的、Node之间交换讯息
  • Kube-proxy : 创建虚拟网路的
  • docker : 每个node会包含多个container

https://ithelp.ithome.com.tw/upload/images/20211001/20119044msSpbgOIOy.png

Virtual Network将Node之间、Master与Node之间串联起来,简单的来说,Virtual Machine将所有Clustering串联起来成为一台大机器。

Kubernetes Components

Kubernetes的重要component:

  • Node: Virtula or Physic Machine
  • Pod : Pod为K8s的最小执行单位,运行再Node上。

可以看成是执行的container再外包一层用来与K8s沟通,每个Pod执行1个App (Node.js、DB)。把每个Pod看成是一个独立的container,那彼此该怎麽沟通呢?整个K8S基於Virtual Machine来沟通,每一个Pod会得到他专属的虚拟IP,彼此利用这个IP来互相沟通。

https://ithelp.ithome.com.tw/upload/images/20211002/201190444DmNlPMhQK.png

当一个Pod消失後(Container crash之类的原因),重新建立新的Pod不会继承该IP(即使同样的container)而会给予新的IP,这对App来说是个麻烦。解法如下:

  • Service : 将虚拟IP与Pod的生命周期切开,Service会保留虚拟IP给下一个继承该Service的Pod
  • Ingress : 一种内外桥接的Services,将外部网路转换为虚拟网路的开口。

https://ithelp.ithome.com.tw/upload/images/20211002/20119044DrZsb5jr7h.png

假如今天要让APP连接Server,我们会在程序内写上Server的URL、PORT,当这些改变,就得重新build一个新的Image并pull出新的Pod。这就很麻烦了。

  • configMap : 帮助你在pod外部输入你的变数,并且可以在Pod运行中修改。我们只需要将程序内的变数改成configMap的参数即可。
  • secrets : 保存那些需要加密的变数,用法基本上同configMap

https://ithelp.ithome.com.tw/upload/images/20211002/20119044edORJ5xMob.png

  • volumes : 如Docker一样,当pod消失data消失。要持久化保存应将资料存在Volumes,可以将资料存在local或是远端其他K8s clustering中。将storge想成在clustering之外的插键,因为K8s并不管pod资料的保存。

https://ithelp.ithome.com.tw/upload/images/20211002/20119044lYqdidhbxG.png

K8s采用clustering架构,为了能够避免使用者服务暂停,我们可以将POD分配到多个Node之中,而每一个POD由Service所连结,因此可以获得同样的虚拟IP。Service同样的可以用於load balance来动态调整Node之间的负担。当一个Node上的pod死掉时可以经由另一个Node的Pod接手避免使用者服务中断。

https://ithelp.ithome.com.tw/upload/images/20211003/20119044VgTi3KEbWK.png

事实上,在开启clustering时你不会建立第二个Pod,而是会定义一个pods的blueprint,确立会需要多少个pod复制。我们把这个blueprint称作为Deployment。Deployment就是pod的blueprint,可以看成是pod的更上层封装(正如pod是container的封装来符合k8s的应用接口),Deployment让你能够更好的在分散式架构中扩展与删减pods。

  • Deployment : pods的blueprint,解释如上。

但是会发现如果我们要在资料库上多开几个Pod,他们就必须要share同一个data storage。多个database去存取一个data storage会发生data inconsistency的错误,也就是同一笔资料同时一个pod写一个pod读导致的错误。因此我们会在K8s建立Statefuleset来避免data inconsistency。

  • Statefulset : 同Deployment来扩展与删减pod,但是多了同步的功能来避免错误。不过其实Statefulset一般来说很难部属,推荐将Database放在K8s clustering之外。

<<:  Day16:今天来谈一下Microsoft Cloud App Security

>>:  六边形架构图

[Day16] Tableau 轻松学 - 仪表板

前言 我们目前完成了两个工作表的制作,再来就是要学习如何让多个工作表可以一起互动,而仪表板的功能就是...

#21 让 Automation 与 Chat Bot 连动

今天我们要让之前的程序能跟 Chat Bot 连动。 需要 Worker 吗? 直接从程序中 POS...

Day 26- 鬼斧神工 :Serverless 电商 - 实战 - 後端开发 (二)API 规划

前言 我们是要处理快速易用的网页,所以在,API方面要做到可以尽量少存取资料库来得到最大化资源使用。...

Day030-与Vue相遇--铁人赛回顾

回顾30天,也让我回忆了今年从金融业被抓去做开发工程师的日子。这30天中,讲述了Vue的基本介绍、性...

#03 No-code 之旅 — 什麽是 SSG、SSR、CSR、ISR?

嗨大家!连假第一天过得如何?~ 今天想跟大家分享的主题是各种网页渲染模式,就是 SSG、SSR、CS...