Cloud Native Application 云原生 程序開發(fā)出來就運(yùn)行在云平臺(tái)上咬腕,而非傳統(tǒng)的物理機(jī)單機(jī)主機(jī)上
ServerLess 無服務(wù)器概念 Knative
Faas:函數(shù)即服務(wù)壶硅,調(diào)用時(shí)運(yùn)行,不調(diào)用時(shí)服務(wù)不運(yùn)行
1瓦呼、docker與kubernetes的關(guān)系
1.1docker介紹
- docker是容器的一種喂窟,對(duì)于容器來說,它事實(shí)上也是虛擬化的一種央串,被稱之為操作系統(tǒng)級(jí)的虛擬化磨澡。
容器運(yùn)行的時(shí)侯,所有的容器全部共同使用操作系統(tǒng)的內(nèi)核质和,而對(duì)于每一個(gè)容器來說稳摄,只有必要的應(yīng)用和二進(jìn)制文件。
容器為任務(wù)而生饲宿,每一個(gè)容器通常厦酬,只會(huì)運(yùn)行一個(gè)任務(wù),在主機(jī)操作系統(tǒng)上體現(xiàn)為一個(gè)進(jìn)程瘫想。各容器之間通過namespace和cgroup來進(jìn)行隔離與資源的限制仗阅。 -
但是,容器也會(huì)有自身缺陷:
1国夜、基于命令行一次只能啟動(dòng)一個(gè)容器减噪,容器和容器之間沒有辦法建立更好的關(guān)聯(lián)關(guān)系。
2支竹、當(dāng)容器數(shù)量足夠多的時(shí)候旋廷,管理員不能有效的記錄每一個(gè)容器的配置,導(dǎo)致容器運(yùn)行混亂礼搁。
3饶碘、容器沒有辦法做到負(fù)載均衡,自我修復(fù)馒吴,彈性伸縮等 -
docker的解決方案
通過docker-compose去做容器的單機(jī)編排
通過docker-swarm去做容器的集群編排
但這兩種方式都沒有kubernetes的生態(tài)強(qiáng)大扎运,并且能做到的功能弱于kubernetes瑟曲。接下來去介紹一下基于google開源的kubernetes
1.2kubernetes介紹
kubernetes,是一個(gè)全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案豪治,是谷歌嚴(yán)格保密十幾年的秘密武器----Borg系統(tǒng)的一個(gè)開源版本洞拨,于2014年9月發(fā)布第一個(gè)版本,2015年7月發(fā)布第一個(gè)正式版本负拟。
kubernetes的本質(zhì)是一組服務(wù)器集群烦衣,它可以在集群的每個(gè)節(jié)點(diǎn)上運(yùn)行特定的程序,來對(duì)節(jié)點(diǎn)中的容器進(jìn)行管理掩浙。目的是實(shí)現(xiàn)資源管理的自動(dòng)化花吟,主要提供了如下的主要功能:
- 自我修復(fù):一旦某一個(gè)容器崩潰,能夠在1秒中左右迅速啟動(dòng)新的容器
- 彈性伸縮:可以根據(jù)需要厨姚,自動(dòng)對(duì)集群中正在運(yùn)行的容器數(shù)量進(jìn)行調(diào)整
- 服務(wù)發(fā)現(xiàn):服務(wù)可以通過自動(dòng)發(fā)現(xiàn)的形式找到它所依賴的服務(wù)
- 負(fù)載均衡:如果一個(gè)服務(wù)起動(dòng)了多個(gè)容器衅澈,能夠自動(dòng)實(shí)現(xiàn)請(qǐng)求的負(fù)載均衡
- 版本回退:如果發(fā)現(xiàn)新發(fā)布的程序版本有問題,可以立即回退到原來的版本
- 存儲(chǔ)編排:可以根據(jù)容器自身的需求自動(dòng)創(chuàng)建存儲(chǔ)卷
1.3 kubernetes組件
一個(gè)kubernetes集群主要是由控制節(jié)點(diǎn)(master)谬墙、工作節(jié)點(diǎn)(node)構(gòu)成今布,每個(gè)節(jié)點(diǎn)上都會(huì)安裝不同的組件。
master:集群的控制平面拭抬,負(fù)責(zé)集群的決策 ( 管理節(jié)點(diǎn))
ApiServer : 資源操作的唯一入口部默,接收用戶輸入的命令,提供認(rèn)證玖喘、授權(quán)甩牺、API注冊(cè)和發(fā)現(xiàn)等機(jī)制
Scheduler : 負(fù)責(zé)集群資源調(diào)度蘑志,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的node節(jié)點(diǎn)上
ControllerManager : 負(fù)責(zé)維護(hù)集群的狀態(tài)累奈,比如程序部署安排、故障檢測(cè)急但、自動(dòng)擴(kuò)展澎媒、滾動(dòng)更新等
Etcd :負(fù)責(zé)存儲(chǔ)集群中各種資源對(duì)象的信息
node:集群的數(shù)據(jù)平面,負(fù)責(zé)為容器提供運(yùn)行環(huán)境 ( 工作節(jié)點(diǎn) )
Kubelet : 負(fù)責(zé)維護(hù)容器的生命周期波桩,即通過控制docker戒努,來創(chuàng)建、更新镐躲、銷毀容器
KubeProxy : 負(fù)責(zé)提供集群內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡
Docker : 負(fù)責(zé)節(jié)點(diǎn)上容器的各種操作
1.4交互流程
以創(chuàng)建一個(gè)POD(kubernetes的最小資源單位储玫,暫且理解為一個(gè)容器或一組容器)為例
1、用戶申請(qǐng)創(chuàng)建一個(gè)POD
2萤皂、該請(qǐng)求會(huì)被APIServer所接受撒穷,ApiServer收到用戶請(qǐng)求后,首先會(huì)對(duì)用戶做身份認(rèn)證以及權(quán)限驗(yàn)證裆熙;
3端礼、APIServer通過認(rèn)證之后會(huì)將該任務(wù)的描述信息寫入etcd數(shù)據(jù)庫(kù)當(dāng)中
4禽笑、Scheduler監(jiān)聽ApiServer,和ApiServer保持心跳聯(lián)系蛤奥;
5佳镜、Scheduler定時(shí)詢問ApiServer是否有創(chuàng)建POD的請(qǐng)求,ApiServer查詢數(shù)據(jù)庫(kù)凡桥,拿到請(qǐng)求之后蟀伸,交由Scheduler,Scheduler向ApiServer獲取當(dāng)前所有Kubelet狀態(tài)缅刽,選擇一個(gè)合適的后端(Kubelet)望蜡,交給ApiServer;
6拷恨、ApiServer存放在etcd數(shù)據(jù)庫(kù)當(dāng)中
7脖律、Kublet監(jiān)聽ApiServer,和ApiServer保持心跳聯(lián)系腕侄;
8小泉、Kubelet詢問ApiServer是否有創(chuàng)建POD的請(qǐng)求,ApiServer查詢數(shù)據(jù)庫(kù)冕杠,拿到任務(wù)之后微姊,交由Kubelet,Kubelet創(chuàng)建POD完成后分预,
告知ApiServer兢交;
9ApiServer存放在etcd數(shù)據(jù)庫(kù)當(dāng)中
10、controller-managert監(jiān)聽ApiServer笼痹,和ApiServer保持心跳聯(lián)系配喳;
11、controller-manager向apiserver發(fā)起請(qǐng)求凳干,詢問是否有任務(wù)晴裹;
12、apiserver會(huì)將POD的任務(wù)信息以及描述信息發(fā)送給controller-manager救赐;
13涧团、controller-manager對(duì)比任務(wù)是否有異常,如果沒有经磅,則確定任務(wù)完成泌绣;
14、如果有预厌,則將未完成的任務(wù)返回給kube-apiserver
1.5kubernetes關(guān)鍵概念
1阿迈、Pod
kubernetes的最小控制單元,容器都是運(yùn)行在pod中的配乓,一個(gè)pod中可以有1個(gè)或者多個(gè)容器
- 自主式Pod
通過手動(dòng)創(chuàng)建Pod仿滔,該方式創(chuàng)建出來惠毁,不具備k8s的編排特性,當(dāng)中運(yùn)行的只是一個(gè)或一組容器 - 控制器管理的Pod
通過控制器去創(chuàng)建Pod崎页,該方式創(chuàng)建出來鞠绰,具備k8s的編排特性,具有生命周期飒焦,可以做到負(fù)載均衡蜈膨,彈性伸縮,滾動(dòng)更新等牺荠。
2翁巍、控制器controller
- ReplicationController
用于數(shù)據(jù)副本維持在期望值,當(dāng)前已被棄用休雌,由ReplicaSet替代 - ReplicaSet
保證副本數(shù)量一直維持在期望值灶壶,并支持pod數(shù)量擴(kuò)縮容,鏡像版本升級(jí) - Depliyment
通過ReplicaSet控制Pod杈曲,并支持滾動(dòng)升級(jí)驰凛、回退版本。只能管理無狀態(tài)應(yīng)用 - StatefulSet
管理有狀態(tài)應(yīng)用 - HPA(Horizontal Pod Autoscaler)
可以根據(jù)集群負(fù)載自動(dòng)水平調(diào)整Pod的數(shù)量担扑,實(shí)現(xiàn)削峰填谷 - DaemonSet
在集群中的指定Node上運(yùn)行且僅運(yùn)行一個(gè)副本恰响,一般用于守護(hù)進(jìn)程類的任務(wù) - Job
它創(chuàng)建出來的pod只要完成任務(wù)就立即退出,不需要重啟或重建涌献,用于執(zhí)行一次性任務(wù) - Cronjob
它創(chuàng)建的Pod負(fù)責(zé)周期性任務(wù)控制胚宦,不需要持續(xù)后臺(tái)運(yùn)行
3、Service
在kubernetes中燕垃,pod是應(yīng)用程序的載體枢劝,我們可以通過pod的ip來訪問應(yīng)用程序,但是pod的ip地址不是固定的利术,這也就意味著不方便直接采用pod的ip對(duì)服務(wù)進(jìn)行訪問呈野。
為了解決這個(gè)問題,kubernetes提供了Service資源印叁,Service會(huì)對(duì)提供同一個(gè)服務(wù)的多個(gè)pod進(jìn)行聚合,并且提供一個(gè)統(tǒng)一的入口地址军掂。通過訪問Service的入口地址就能訪問到后面的pod服務(wù)轮蜕。
4、網(wǎng)絡(luò)
-
Pod網(wǎng)絡(luò)
通過插件提供CNI
(1蝗锥、flannel提供網(wǎng)絡(luò)配置 2跃洛、calico提供網(wǎng)絡(luò)配置和網(wǎng)絡(luò)策略 3、canel通過flannel提供網(wǎng)絡(luò)配置终议,calico提供網(wǎng)絡(luò)策略 4汇竭、等等) - 集群網(wǎng)絡(luò)(Service網(wǎng)絡(luò))
- 節(jié)點(diǎn)網(wǎng)絡(luò)