使用kube構(gòu)建高可用運(yùn)行環(huán)境

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í)的工具。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 178,211評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,736評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,475評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,834評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 43,009評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,516評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,728評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 35,132評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,443評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,249評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,484評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容