一.學(xué)習(xí)前置知識(shí)
1.linux基本知識(shí)點(diǎn)? ? ?
2.docker 基礎(chǔ)知識(shí)? ? ?參考:http://www.reibang.com/c/fb233d56612f
二.k8s概念和架構(gòu)知識(shí)
0.應(yīng)用部署方式演變
在部署應(yīng)用程序的方式上,主要經(jīng)歷了三個(gè)時(shí)代:
1)傳統(tǒng)部署:互聯(lián)網(wǎng)早期,會(huì)直接將應(yīng)用程序部署在物理機(jī)上
優(yōu)點(diǎn):簡(jiǎn)單囚灼,不需要其它技術(shù)的參與
缺點(diǎn):不能為應(yīng)用程序定義資源使用邊界丽惶,很難合理地分配計(jì)算資源充甚,而且程序之間容易產(chǎn)生影響
2)虛擬化部署:可以在一臺(tái)物理機(jī)上運(yùn)行多個(gè)虛擬機(jī)券盅,每個(gè)虛擬機(jī)都是獨(dú)立的一個(gè)環(huán)境
(工作中沒(méi)有遇到這樣部署應(yīng)用的-----只在本地遇到過(guò)使用vargant本地部署服務(wù)測(cè)試使用)
優(yōu)點(diǎn):程序環(huán)境不會(huì)相互產(chǎn)生影響,提供了一定程度的安全性
缺點(diǎn):增加了操作系統(tǒng)项郊,浪費(fèi)了部分資源
3)容器化部署:與虛擬化類(lèi)似馅扣,但是共享了操作系統(tǒng)
優(yōu)點(diǎn):
a.可以保證每個(gè)容器擁有自己的文件系統(tǒng)、CPU着降、內(nèi)存差油、進(jìn)程空間等
b.運(yùn)行應(yīng)用程序所需要的資源都被容器包裝,并和底層基礎(chǔ)架構(gòu)解耦
c.容器化的應(yīng)用程序可以跨云服務(wù)商任洞、跨Linux操作系統(tǒng)發(fā)行版進(jìn)行部署
可能遇到的問(wèn)題:
a.一個(gè)容器故障停機(jī)了蓄喇,怎么樣讓另外一個(gè)容器立刻啟動(dòng)去替補(bǔ)停機(jī)的容器
b.當(dāng)并發(fā)訪(fǎng)問(wèn)量變大的時(shí)候,怎么樣做到橫向擴(kuò)展容器數(shù)量
c.當(dāng)并發(fā)訪(fǎng)問(wèn)量下降了交掏,怎么樣回收容器的數(shù)量
其實(shí)這些容器管理的問(wèn)題統(tǒng)稱(chēng)為容器編排問(wèn)題妆偏,為了解決這些容器編排問(wèn)題,就產(chǎn)生了一些容器編排的軟件:
Swarm盅弛、compose:Docker自己的容器編排工具? ? ?
(具體參考:http://www.reibang.com/c/fb233d56612f? ?中關(guān)于swarm和compose相關(guān)知識(shí))
Mesos:Apache的一個(gè)資源統(tǒng)一管控的工具钱骂,需要和Marathon結(jié)合使用
Kubernetes:Google開(kāi)源的的容器編排工具
1.k8s簡(jiǎn)單概述
kubernetes,是一個(gè)全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案挪鹏,是谷歌嚴(yán)格保密十幾年的秘密武器----Borg系統(tǒng)的一個(gè)開(kāi)源版本见秽,于2014年9月發(fā)布第一個(gè)版本,2015年7月發(fā)布第一個(gè)正式版本
使用k8s進(jìn)行容器化應(yīng)用部署狰住,及使用k8s的目標(biāo)是使容器化應(yīng)用部署及擴(kuò)容更加簡(jiǎn)潔和高效
2.k8s的功能及特性
1)自動(dòng)裝箱:基于容器對(duì)應(yīng)用運(yùn)行環(huán)境的資源配置要求自動(dòng)部署應(yīng)用容器
2)自我修復(fù):一旦某一個(gè)容器崩潰张吉,能夠在短時(shí)間內(nèi)迅速啟動(dòng)新的容器,恢復(fù)業(yè)務(wù)催植!當(dāng)容器未通過(guò)監(jiān)控檢查時(shí),會(huì)關(guān)閉容器直到容器正常運(yùn)行勺择,才對(duì)外提供服務(wù)
3)水平擴(kuò)展:可以根據(jù)需要创南,自動(dòng)對(duì)集群中正在運(yùn)行的容器數(shù)量進(jìn)行調(diào)整
4)服務(wù)發(fā)現(xiàn):服務(wù)可以通過(guò)自動(dòng)發(fā)現(xiàn)的形式找到它所依賴(lài)的服務(wù)
5)滾動(dòng)更新與回退:可以根據(jù)應(yīng)用的變化,對(duì)應(yīng)用容器運(yùn)行的應(yīng)用省核,進(jìn)行一次性或批量的更新和回退
6)負(fù)載均衡:如果一個(gè)服務(wù)起動(dòng)了多個(gè)容器稿辙,能夠自動(dòng)實(shí)現(xiàn)請(qǐng)求的負(fù)載均衡
7)存儲(chǔ)編排:可以根據(jù)容器自身的需求自動(dòng)創(chuàng)建存儲(chǔ)卷,可以訪(fǎng)問(wèn)外部存儲(chǔ)
8)批量部署:可以使用計(jì)劃任務(wù)和批量操作
2.k8s架構(gòu)組件
一個(gè)kubernetes集群主要是由控制節(jié)點(diǎn)(master)气忠、工作節(jié)點(diǎn)(node)構(gòu)成邻储,每個(gè)節(jié)點(diǎn)上都會(huì)安裝不同的組件赋咽。
1)master:集群的控制平面,負(fù)責(zé)集群的決策 ( 管理 )
ApiServer : 資源操作的唯一入口吨娜,接收用戶(hù)輸入的命令脓匿,提供認(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)上。(算哪個(gè)節(jié)點(diǎn)資源用的少勾扭,部署上去)
ControllerManager : 負(fù)責(zé)維護(hù)集群的狀態(tài)毡琉,比如程序部署安排、故障檢測(cè)妙色、自動(dòng)擴(kuò)展桅滋、滾動(dòng)更新等(部署和維護(hù)的)
Etcd :負(fù)責(zé)存儲(chǔ)集群中各種資源對(duì)象的信息
2)worker:集群的數(shù)據(jù)平面,負(fù)責(zé)為容器提供運(yùn)行環(huán)境 ( 干活 )
Kubelet : 【master派到node節(jié)點(diǎn)的代表】負(fù)責(zé)維護(hù)容器的生命周期身辨,即通過(guò)控制docker丐谋,來(lái)創(chuàng)建、更新栅表、銷(xiāo)毀容器
KubeProxy : 【提供網(wǎng)絡(luò)代理】負(fù)責(zé)提供集群內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡
Docker : 負(fù)責(zé)節(jié)點(diǎn)上容器的各種操作
3)容器運(yùn)行環(huán)境【Container Runtime】
容器運(yùn)行環(huán)境是負(fù)責(zé)運(yùn)行容器的軟件
Kubernetes支持多個(gè)容器運(yùn)行環(huán)境:Docker笋鄙、containerd、cri-o怪瓶、rktlet以及任何實(shí)現(xiàn)Kubernetes CRI (容器運(yùn)行環(huán)境接口) 的軟件萧落。
4)fluentd:是一個(gè)守護(hù)進(jìn)程,它有助于提升集群層面日志
3.k8s核心概念
1)pod:
? ? ? k8s中最小的部署單元洗贰,容器都是運(yùn)行在pod中的找岖,一個(gè)pod中可以有1個(gè)或者多個(gè)容器,一個(gè)pod的容器時(shí)共享網(wǎng)絡(luò)的敛滋,生命周期時(shí)短暫的
2)controller【創(chuàng)建pod】:
? ? 確保預(yù)期的pod副本的數(shù)量许布,無(wú)狀態(tài)應(yīng)用部署,有狀態(tài)應(yīng)用部署(有特定的存儲(chǔ)及訪(fǎng)問(wèn)地址)绎晃,確保所有的node運(yùn)行同一個(gè)pod蜜唾,一次性任務(wù)和定時(shí)任務(wù)
3)service:定義一組pod的訪(fǎng)問(wèn)規(guī)則,支持多種方式【ClusterIP庶艾、NodePort袁余、LoadBalancer】
4)Label:標(biāo)簽,用于對(duì)pod進(jìn)行分類(lèi)咱揍,同一類(lèi)pod會(huì)擁有相同的標(biāo)簽
5)NameSpace:命名空間颖榜,用來(lái)隔離pod的運(yùn)行環(huán)境(同個(gè)命名空間里的pod可以相互訪(fǎng)問(wèn))
6)Volume:聲明在Pod容器中可訪(fǎng)問(wèn)的文件目錄,可以被掛載到Pod中一個(gè)或多個(gè)容器指定路徑下
支持多種后端存儲(chǔ)抽象【本地存儲(chǔ)、分布式存儲(chǔ)掩完、云存儲(chǔ)】
7)Deployment:定義一組Pod副本數(shù)目噪漾,版本等
通過(guò)控制器【Controller】維持Pod數(shù)目【自動(dòng)回復(fù)失敗的Pod】
通過(guò)控制器以指定的策略控制版本【滾動(dòng)升級(jí)、回滾等】
8)api:Kubernetes的API來(lái)操作整個(gè)集群
同時(shí)可以通過(guò) kubectl 且蓬、ui欣硼、curl 最終發(fā)送 http + json/yaml 方式的請(qǐng)求給API Server,然后控制整個(gè)K8S集群缅疟,K8S中所有的資源對(duì)象都可以采用 yaml 或 json 格式的文件定義或描述
4.k8容器部署流程
1)通過(guò)Kubectl提交一個(gè)創(chuàng)建RC(Replication Controller)的請(qǐng)求分别,該請(qǐng)求通過(guò)APlserver寫(xiě)入etcd
2)此時(shí)Controller Manager通過(guò)API Server的監(jiān)聽(tīng)資源變化的接口監(jiān)聽(tīng)到此RC事件,分析之后存淫,發(fā)現(xiàn)當(dāng)前集群中還沒(méi)有它所對(duì)應(yīng)的Pod實(shí)例
3)于是根據(jù)RC里的Pod模板定義一個(gè)生成Pod對(duì)象耘斩,通過(guò)APIServer寫(xiě)入etcd
4)此事件被Scheduler發(fā)現(xiàn),它立即執(zhí)行執(zhí)行一個(gè)復(fù)雜的調(diào)度流程桅咆,為這個(gè)新的Pod選定一個(gè)落戶(hù)的Node括授,然后通過(guò)API Server將這一結(jié)果寫(xiě)入etcd中
5)目標(biāo)Node上運(yùn)行的Kubelet進(jìn)程通過(guò)APiserver監(jiān)測(cè)到這個(gè)"新生的Pod.并按照它的定義,啟動(dòng)該P(yáng)od并任勞任怨地負(fù)責(zé)它的下半生岩饼,直到Pod的生命結(jié)束
6)通過(guò)Kubectl提交一個(gè)新的映射到該P(yáng)od的Service的創(chuàng)建請(qǐng)求
7)ControllerManager通過(guò)Label標(biāo)簽查詢(xún)到關(guān)聯(lián)的Pod實(shí)例荚虚,然后生成Service的Endpoints信息,并通過(guò)APIServer寫(xiě)入到etod中
8)所有Node上運(yùn)行的Proxy進(jìn)程通過(guò)APIServer查詢(xún)并監(jiān)聽(tīng)Service對(duì)象與其對(duì)應(yīng)的Endponts信息籍茧,建立一個(gè)軟件方式的負(fù)載均衡器來(lái)實(shí)現(xiàn)Service訪(fǎng)問(wèn)到后端Pod的流量轉(zhuǎn)發(fā)功能
5.部署應(yīng)用流程介紹
以部署一個(gè)nginx服務(wù)來(lái)說(shuō)明kubernetes系統(tǒng)各個(gè)組件調(diào)用關(guān)系:
首先要明確版述,一旦kubernetes環(huán)境啟動(dòng)之后,master和node都會(huì)將自身的信息存儲(chǔ)到etcd數(shù)據(jù)庫(kù)中
1)一個(gè)nginx服務(wù)的安裝請(qǐng)求會(huì)首先被發(fā)送到master節(jié)點(diǎn)的apiServer組件
2)apiServer組件會(huì)調(diào)用scheduler組件來(lái)決定到底應(yīng)該把這個(gè)服務(wù)安裝到哪個(gè)node節(jié)點(diǎn)上
在此時(shí)寞冯,它會(huì)從etcd中讀取各個(gè)node節(jié)點(diǎn)的信息渴析,然后按照一定的算法進(jìn)行選擇,并將結(jié)果告知apiServer
3)apiServer調(diào)用controller-manager去調(diào)度Node節(jié)點(diǎn)安裝nginx服務(wù)
4)kubelet接收到指令后吮龄,會(huì)通知docker俭茧,然后由docker來(lái)啟動(dòng)一個(gè)nginx的pod
pod是kubernetes的最小操作單元,容器必須跑在pod中
5)nginx服務(wù)就運(yùn)行了漓帚,如果需要訪(fǎng)問(wèn)nginx母债,就需要通過(guò)kube-proxy來(lái)對(duì)pod產(chǎn)生訪(fǎng)問(wèn)的代理
這樣,外界用戶(hù)就可以訪(fǎng)問(wèn)集群中的nginx服務(wù)了