author:魏斌
初識(shí)Docker,那時(shí)他還是一家叫DotCloud的公司,和ClodBee,Openshift,CloudFundary等一樣提供PAAS服務(wù),由于PAAS服務(wù)廠商之間競(jìng)爭(zhēng)激烈,DotCloud舉步維艱,失望之余,2013年DotCloud開(kāi)放了他的核心項(xiàng)目,一個(gè)打包linux下的打包程序,應(yīng)用可以非常容易的在服務(wù)器之間遷移。
無(wú)心插柳,柳成蔭,Docker迅速受到Google,WMwave,微軟,Ebay,Box和Facebook的青睞,策馬征戰(zhàn)天下,在很短的時(shí)候內(nèi)迅速獲得了大量技術(shù)人員關(guān)注,DotCloud更是更名為Docker inc來(lái)彰顯支持Docker的決心,容器的技術(shù)當(dāng)然不僅僅只有Docker一種,但是,Docker已經(jīng)成為容器事實(shí)上的標(biāo)準(zhǔn)。可以說(shuō),終于出現(xiàn)了一種技術(shù),真正意義上實(shí)現(xiàn)了“write
once,run anywhere”,這也是讓業(yè)界激情澎湃的根本原因。
Kubernetes源自Google,在Docker還沒(méi)有自己的容器編排組件Swarm的時(shí)候,Google向開(kāi)源界貢獻(xiàn)了他們的容器編排系統(tǒng)
Kubernetes容器集群管理系統(tǒng),它構(gòu)建于Docker容器技術(shù)之上,為容器化的應(yīng)用提供了資源調(diào)度、部署運(yùn)行、服務(wù)發(fā)現(xiàn)、運(yùn)行時(shí)擴(kuò)容縮容等整一套解決方案,利用Kubernetes提供的功能,我們可以非常方便的管理不同主機(jī)上部署在容器的應(yīng)用.
Kubernets簡(jiǎn)稱K8s或Kube,用戶可以通過(guò)預(yù)定義的方式管理集群,什么是預(yù)定義的方式?你可以把它理解為無(wú)人值守的自動(dòng)化管理。例如用戶可指定他想運(yùn)行三個(gè)Redis容器的實(shí)例。K8s擁有容器自我修復(fù)機(jī)制,如自動(dòng)重啟,重新計(jì)劃和容器備份幫助達(dá)到你想要的狀態(tài)。
K8s支持Docker和Rocket兩種容器,Google白皮書宣稱,未來(lái)將對(duì)容器層進(jìn)行抽象,幫助K8s支持更多格式的鏡像格式和運(yùn)行組件.
以一文介紹Kube構(gòu)建分布式應(yīng)用的過(guò)程
K8s的基本元素
Pod是Kubernetes最基本的部署單元,可以包含container,邏輯上表示應(yīng)用的邏輯組合。比如一個(gè)web站點(diǎn)應(yīng)用由前端、后端及數(shù)據(jù)庫(kù)構(gòu)建而成,這三個(gè)組件將運(yùn)行在各自的容器中,那么我們可以創(chuàng)建包含三個(gè)pod
Service定義了一個(gè)Pod的邏輯集合和訪問(wèn)這個(gè)集合的路由策略,用于解決pod之間的服務(wù)發(fā)現(xiàn)問(wèn)題。因?yàn)閜od的運(yùn)行狀態(tài)可動(dòng)態(tài)變化(比如切換機(jī)器了、縮容過(guò)程中被終止了等),所以訪問(wèn)端不能以固定的方式去訪問(wèn)pod提供的服務(wù)。service的引入旨在做pod的動(dòng)態(tài)映射對(duì)訪問(wèn)端屏蔽變化,訪問(wèn)端只需要知道service的地址,由service來(lái)提供代理。
Replication Controller簡(jiǎn)稱RC是Pod的副本控制器,用于解決pod的擴(kuò)容縮容問(wèn)題,管理Pod的生命周期。通常,分布式應(yīng)用為了實(shí)現(xiàn)高性能或高可用性的考慮,需要多個(gè)副本,并且根據(jù)負(fù)載情況動(dòng)態(tài)伸縮。通過(guò)RC,我們可以指定一個(gè)應(yīng)用需要幾份復(fù)制,Kubernetes將為每份復(fù)本創(chuàng)建一個(gè)pod,并且保證實(shí)際運(yùn)行pod數(shù)量總是與定義的復(fù)本數(shù)量相等(例如,當(dāng)前某個(gè)pod宕機(jī)時(shí),自動(dòng)創(chuàng)建新的pod來(lái)替換)。
LabelService和RC都是建立在Pod之上的抽象,最終要在pod上產(chǎn)生效果,那么它們?cè)趺锤鷓od聯(lián)系起來(lái)呢?這就要引入label的概念:label就是為pod加上可用于搜索或關(guān)聯(lián)的一組key/value標(biāo)簽,而service和replicationController正是通過(guò)label來(lái)與pod關(guān)聯(lián)的。比如,有三個(gè)pod都有l(wèi)abel為"app=backend",創(chuàng)建service和replicationController時(shí)可以指定同樣的label:"app=backend",再通過(guò)label selector機(jī)制,就將它們與這三個(gè)pod關(guān)聯(lián)起來(lái)了。例如,當(dāng)有其他frontend pod訪問(wèn)該service時(shí),自動(dòng)會(huì)轉(zhuǎn)發(fā)到其中的一個(gè)backend pod。
VOLUMES
Vloume是可以是一個(gè)是宿主機(jī)器的文件夾地址或者另外一個(gè)容器,容器會(huì)被銷毀或者重啟時(shí),容器內(nèi)的應(yīng)用產(chǎn)生的數(shù)據(jù)或者文件將被丟棄,多數(shù)情況下,我們需要保留一些信息,如mysql生成的數(shù)據(jù)庫(kù)文件,或者是應(yīng)用運(yùn)行時(shí)使用的配置文件,又或是應(yīng)用產(chǎn)生的日志文件,容器被重啟后,這些文件都將被容器內(nèi)的應(yīng)用繼續(xù)使用,以保證我們應(yīng)用的延續(xù)性,這時(shí),我們就需要使用到
Kurbernetes架構(gòu)
和通常的集群環(huán)境一樣,kurbernetes集群也需要Master和Slave(這里我們叫Work
Node), 管理集群中所有機(jī)器的節(jié)點(diǎn)叫做Master Node,通過(guò)Master主機(jī)來(lái)管理WorkNode,Work Node上跑的就是我們的Pod。
Master Node是集群的中央控制器,為集群提供統(tǒng)一的視圖。為了達(dá)到集群的高可用性,通常我們會(huì)在集群中創(chuàng)建多個(gè)Master Node,以防止單點(diǎn)故障時(shí),重新選舉Master
Work Node是集群中的工兵,用來(lái)執(zhí)行Master Node委派的任務(wù),在kuberneter架構(gòu)中,一個(gè)Work Node可以裝載多個(gè)Pods
Kuberlet
Kubelet是k8s和Docker daemon通信的關(guān)鍵組件。在每一個(gè)主機(jī)上都會(huì)起一個(gè)kubelet的進(jìn)程來(lái)創(chuàng)建,銷毀Pods以及同步狀態(tài)
Kuberctl是管理kube集群的命令行工具,格式如下
kubectl [command] [type] [name] [flags]
? [command]對(duì)資源的操作指令 如create,describe,delete或者scale
? [type]指定kuber的資源類型 如pod,service,replicationController或者node .
? [name]設(shè)置資源運(yùn)行時(shí)的名稱
運(yùn)行你的第一個(gè)容器
我們可以使用kubectl命令創(chuàng)建或者運(yùn)行容器,kubernetes提供了一種最簡(jiǎn)單的方式,通過(guò)指定鏡像名稱來(lái)創(chuàng)建一個(gè)容器
kubectl run redis-master?--image=docker.io/redis
通過(guò)get pods查看生成的Pod信息
kubectl.sh get po
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?READY ? ? ? STATUS ? ? ? RESTARTS ? ? AGE
reids-1-3061617885-kkmt6 1/1 ? ? ? ? ? ? ?Running ? ? ? ?0 ? ? ? ? ? ? ? ? ? ?1m
另外,可以通過(guò)配置文件創(chuàng)建pod
kubectl create -f redis-pod.yaml
構(gòu)建可伸縮的應(yīng)用
Pod在RC的管理下具有自動(dòng)伸縮的特性
kubectl.sh scale
--replicas=3 rc redis replicationcontroller “redis” scaled
通過(guò)replicas參數(shù)可以設(shè)置RC管理的Pod實(shí)例,在上面的例子中,rc會(huì)在運(yùn)行的集群環(huán)境中始終保持3個(gè)獨(dú)立的實(shí)例
多容器應(yīng)用
典型的應(yīng)用一般由前端和后端組成,簡(jiǎn)單的架構(gòu)一般是前端有一個(gè)應(yīng)用服務(wù)器,比如PHP,后端有一個(gè)數(shù)據(jù)庫(kù)提供數(shù)據(jù)持久化,比如redis。
應(yīng)用步驟如下:
1啟動(dòng)“backend”的RC:后端服務(wù)的RC必須含有Redis Pod的spec
2啟動(dòng)”backend“的service : Redis Service使用selector來(lái)定位上一步啟動(dòng)的Pod
3啟動(dòng)“Fronetend”RC:Php RC必須包含Php的Pod
spec,而Pod必須包含應(yīng)用的預(yù)部署,通常我們會(huì)擴(kuò)展Php的鏡像,并拷貝程序包到nginx的目錄,然后再創(chuàng)建一個(gè)新的鏡像,容器中的應(yīng)用可以發(fā)現(xiàn)并連接數(shù)據(jù)庫(kù)。
Namespace,Resources Quotas and Limits
默認(rèn)情況下,Kube集群中的用戶資源都在默認(rèn)的NameSpace - “default”下,而Kube所創(chuàng)建對(duì)象的Namespace為“kube-system”
./kubernetes/cluster/kubectl.sh ?get namespace?
NAME ? ? ? ? ? ?LABELS ? ? ? ? ? ? ? STATUSAGE?
default ? ? ? ? ? ?Active ? ? ? ? ? ? ? ? ? 1m
kube-system ??Active ? ? ? ? ? ? ? ? ? 1m
用戶創(chuàng)建的資源可以被劃分為多個(gè)namespace,namespace之間相互隔離,這樣就可以為資源創(chuàng)建邏輯分組。
1.獨(dú)立的作用域以避免命名沖突
2.確保對(duì)信任用戶適合的授權(quán)
3.約束指定資源的消耗
使用配置文件創(chuàng)建新的namespace
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
name: development
在默認(rèn)namespace下創(chuàng)建RC
kubectl.sh create -f redis-rc.yml
replicationcontroller “redis” created
在指定的namespace下創(chuàng)建一個(gè)RC
kubectl.sh --namespace=development ?create -f redis-rc.yml
replicationcontroller “redis” created
通過(guò)配置文件指定資源配額,具體如下
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
spec:
hard:
cpu: “20”
memory: 1Gi
pods: “10”
replicationcontrollers: “20”
resourcequotas: “1”
services: “5”
創(chuàng)建POD時(shí)指定資源訪問(wèn)配額
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
spec:
containers:
- name: redis
image: docker.io/redis
ports:
- containerPort: 8091
resources:
limits:
cpu: “1”
memory: 512Mi
Namespace,Resource Quota和Limits可以是Kube集群在多個(gè)分組之間共享資源并且能為每個(gè)分組提供不同程度的QOS(服務(wù)質(zhì)量)
Kube Dashbord
Dashbord為我們提供了一個(gè)便捷的控制臺(tái),可以在一定程度上擺脫枯燥的命令行操作,可以用來(lái)管理Node,部署應(yīng)用,性能監(jiān)控等等。
author:魏斌 ? ? ? ? 未授權(quán)請(qǐng)勿轉(zhuǎn)載.......
通過(guò)簡(jiǎn)單的介紹,相信你已經(jīng)對(duì)kube的威力有了直觀的了解。在現(xiàn)代微服務(wù)架構(gòu)日漸流行的今天,kube為我們構(gòu)建大型系統(tǒng)提供了基礎(chǔ)的支撐,即使你不是具備大型架構(gòu)能力的工程師,只要能夠精通kubenetes的使用,你也可以構(gòu)建起一個(gè)高可用,動(dòng)態(tài)伸縮,固若金湯的分布式系統(tǒng)。下面看看Kube為我們解決了哪些問(wèn)題呢?
1.服務(wù)發(fā)現(xiàn) 在大型分布式系統(tǒng),我們通常會(huì)使用ESB,dubbo,ZeroICE等RPC框架, 或者直接用硬件負(fù)載均衡器,來(lái)完成服務(wù)發(fā)現(xiàn)和路由中轉(zhuǎn)的功能,而kube的基礎(chǔ)組件直接支持了此功能,無(wú)需我們做額外的工作。
2.運(yùn)維監(jiān)控 分布式系統(tǒng)中,偶爾會(huì)發(fā)生服務(wù)不可用的情況,俗稱腦裂,這種問(wèn)題隱藏極深,沒(méi)有郵件的資源監(jiān)控機(jī)制,一般排查問(wèn)題會(huì)話費(fèi)大量的時(shí)間,而kube做到了自動(dòng)監(jiān)控,關(guān)閉出問(wèn)題的服務(wù),自動(dòng)重啟。
3.動(dòng)態(tài)擴(kuò)容 擴(kuò)容分為縱向擴(kuò)容和橫向擴(kuò)容,kube通過(guò)RC實(shí)現(xiàn)了通過(guò)配置自動(dòng)的創(chuàng)建,銷毀,增加或縮減實(shí)例,通過(guò) 為橫向擴(kuò)容提供了有力的支持;在縱向擴(kuò)容方面,kube的Resource Quoter也能做到精準(zhǔn)調(diào)配硬件資源的使用。
4.系統(tǒng)的高可用性 使用Kube的namespace和label,我們可以實(shí)現(xiàn)多集群部署,做到資源隔離,從而方便的實(shí)現(xiàn)多維度管理,灰度發(fā)布,冷熱切換,雙線備份等等以往需要硬件才能支持的工作。
5.應(yīng)用部署kube提供了官方的dashbord,可以用來(lái)部署應(yīng)用,也可以用來(lái)監(jiān)控容器運(yùn)行的健康度,當(dāng)然,喜歡自己開(kāi)發(fā)自動(dòng)化工具的人也可以通過(guò)kube的api,開(kāi)發(fā)出更加高級(jí)的工具。