微服務(wù)架構(gòu)在Kubernetes上的實(shí)現(xiàn)

我們討論了最近的微服務(wù)趨勢(shì)言蛇,以及伴隨微服務(wù)架構(gòu)可能出現(xiàn)的一些復(fù)雜問(wèn)題天试。在接下來(lái)的幾周內(nèi)椿每,我們將深入探討這個(gè)問(wèn)題目派。我們將探討不同設(shè)計(jì)選擇中固有的權(quán)衡鹦筹,以及可以采取哪些措施來(lái)緩解這些問(wèn)題。

然而址貌,在深入之前铐拐,我認(rèn)為花一點(diǎn)時(shí)間來(lái)了解當(dāng)今微服務(wù)中的最新技術(shù)狀態(tài)是有意義的。我們首先回顧一下領(lǐng)先的容器管理和服務(wù)編排框架Kubernetes练对。 如今遍蟋,Kubernetes和微服務(wù)幾乎是同義詞,所以最好徹底了解它們是如何組合在一起的螟凭。

Kubernetes

與微服務(wù)本身非常相似虚青,容器近年來(lái)已成為現(xiàn)代可擴(kuò)展架構(gòu)中不可或缺的一部分。與微服務(wù)一樣螺男,容器已經(jīng)流行起來(lái)棒厘,因?yàn)樗鼈優(yōu)殚_(kāi)發(fā)過(guò)程提供了真正的好處:它們可靠,易于擴(kuò)展下隧,并提供了一個(gè)很好的抽象奢人,隔離了Web服務(wù)的核心組件。

特別是淆院,一種容器化技術(shù)已遠(yuǎn)遠(yuǎn)超過(guò)其他技術(shù)何乎。 這是正確的忙厌,我們的微服務(wù)之旅的下一站是看看Kubernetes和Docker阿弃,它是現(xiàn)代微服務(wù)設(shè)施的主力。簡(jiǎn)單地說(shuō)贤斜,Kubernetes是現(xiàn)代基于容器的DevOps和微服務(wù)以及容器攜手并進(jìn)的黃金標(biāo)準(zhǔn)拷淘。


隨著容器化技術(shù)的興起各墨,有幾種競(jìng)爭(zhēng)技術(shù)可用于管理大型Docker部署和基于容器的服務(wù)。你可能還記得其中一些退役的解決方案:Docker Swarm启涯,Apache Mesos贬堵,OpenStack Magnum等。然而逝嚎,現(xiàn)在Kubernetes已經(jīng)淘汰了競(jìng)爭(zhēng)對(duì)手扁瓢。它是唯一的AWS,Azure补君,Google Cloud原生自帶引几,同時(shí)RedHat和Pivotal等許多私有云供應(yīng)商也提供的容器化解決方案。

Kubernetes能夠如此迅速地獲得如此多的優(yōu)勢(shì),根因在于它能夠?qū)⑴渲门c編排分開(kāi)伟桅。這種復(fù)雜程度應(yīng)該不足為奇敞掘,因?yàn)镵ubernetes來(lái)自谷歌的內(nèi)部項(xiàng)目Borg,它是谷歌在分布式系統(tǒng)上的數(shù)十年經(jīng)驗(yàn)總結(jié)楣铁。使用Kubernetes玖雁,你可以指定服務(wù)的外觀,實(shí)例數(shù)盖腕,冗余類型赫冬,服務(wù)所在位置。然后溃列,該工具自動(dòng)計(jì)算從現(xiàn)狀到創(chuàng)建該服務(wù)需要進(jìn)行哪些更改劲厌。可以把它想象成SQL听隐,你沒(méi)有指定數(shù)據(jù)庫(kù)如何添加或轉(zhuǎn)換每個(gè)行补鼻。你可以指定數(shù)據(jù)的外觀,數(shù)據(jù)庫(kù)會(huì)指出如何實(shí)現(xiàn)數(shù)據(jù)雅任。 Kubernetes也是一樣的风范。

Kubernetes特點(diǎn)

Kubernetes提供的是將容器視為服務(wù)定義的能力。Kubernetes可以處理純?nèi)萜骰γ础<词鼓阆朐诓贿M(jìn)入微服務(wù)領(lǐng)域的情況下只部署容器硼婿,Kubernetes在管理和部署方面也能為你提供很多幫助。你在群集中的服務(wù)器上安裝Kubernetes軟件成玫,Kubernetes主進(jìn)程將自動(dòng)部署你的軟件加酵。

除了基本的容器外拳喻,Kubernetes還可以使用它所稱的Pod哭当。 Pod是由一個(gè)或多個(gè)服務(wù)組成的單獨(dú)定義。 Pod可以包含從單獨(dú)運(yùn)行的單個(gè)服務(wù)器到完整的多容器服務(wù)冗澈,例如數(shù)據(jù)庫(kù)容器與鍵值存儲(chǔ)和一個(gè)包含在一起的http服務(wù)器相結(jié)合钦勘。 Pod是Kubernetes的基本構(gòu)建塊。

最后一個(gè)元素是服務(wù)亚亲。在Kubernetes中彻采,服務(wù)就像是將Pod組合到應(yīng)用程序中的配方。雖然Pod是具有生命周期的具體部署捌归,但服務(wù)更抽象肛响。它描述了一個(gè)單獨(dú)的組件,如后端或數(shù)據(jù)庫(kù)惜索。

結(jié)合所有這些能力的是Kubernetes命令行工具kubectl特笋。雖然Kubernetes提供的抽象很棒,但命令行工具非常強(qiáng)大巾兆,允許你使用kubectl命令描述對(duì)架構(gòu)的復(fù)雜更改猎物』⑶簦總而言之,kubectl CLI工具包含近50種不同的命令蔫磨,用于處理在修改基于容器的微服務(wù)部署過(guò)程中出現(xiàn)的所有情況(你總會(huì)出現(xiàn)出錯(cuò)的時(shí)候)淘讥。

動(dòng)手實(shí)踐一番

雖然高層次描述很有幫助,但實(shí)際上沒(méi)有什么比實(shí)際部署Kubernetes服務(wù)能更好的理解它的了堤如。我們?cè)谶@里沒(méi)有做任何高深的東西蒲列,只是展示如何部署一個(gè)簡(jiǎn)單的“Hello World”服務(wù),但它應(yīng)該是有益的搀罢。

我們?cè)贕o中編寫(xiě)了一個(gè)簡(jiǎn)單的服務(wù)器嫉嘀,用“Hello World”響應(yīng)http請(qǐng)求。代碼非常簡(jiǎn)單:

package main
import (
"fmt"
"log"
"net/http"
"os"
)
func handler(w http.ResponseWriter, r *http.Request) {
log.Print("Hello world received a request.")
version := os.Getenv("VERSION")
if version == "" {
  version = "v1"
}
log.Println(version)
fmt.Fprintf(w, "Hello world %s\n",version)
}
func main() {
log.Print("Hello world sample started.")
http.HandleFunc("/api/hello", handler)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
} 

運(yùn)行它的第一步是將其構(gòu)建到Docker容器中魄揉。為此剪侮,我們從基礎(chǔ)Go Docker鏡像開(kāi)始構(gòu)建以下Dockerfile。

# Use the official Golang image to create a build artifact.
# https://hub.docker.com/_/golang
FROM golang as builder
# Copy local code to the container image.
WORKDIR /go/src/github.com/haseebh/hello-world
COPY . .
RUN go build -o helloworld-v1 main/helloworld-v1.go
# Use a Docker multi-stage build to create a lean production image.
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM alpine
COPY --from=builder /go/src/github.com/haseebh/hello-world-v1 /helloworld-v1
ENV PORT 8080
# Run the web service on container startup.
CMD ["/helloworld-v1"]

現(xiàn)在我們只需要構(gòu)建它洛退。 選擇一個(gè)鏡像tag瓣俯,然后運(yùn)行以下兩個(gè)Docker命令來(lái)構(gòu)建和保存鏡像:

# Build the container on your local machine
docker build -t <image-tag> .
# Push the container to docker registry
docker push <image-tag>

在我們部署之前還有一步。雖然我們已經(jīng)定義了將進(jìn)入我們的Pod的內(nèi)容兵怯,但我們還沒(méi)有定義我們的服務(wù)彩匕。讓我們做一個(gè)簡(jiǎn)單的服務(wù)定義,稱為Hello Service媒区。我們將它保存在hello-service.yml服務(wù)定義文件中驼仪。

apiVersion: v1
kind: Service
metadata:
name: helloworld-v1
spec:
ports:
  - port: 80
  protocol: TCP
  targetPort: 8080
selector:
   app: helloworld-v1
type: LoadBalancer

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-v1
labels:
  app: helloworld-v1
spec:
replicas: 1
selector:
  matchLabels:
     app: helloworld-v1
template:
  metadata:
     labels:
        app: helloworld-v1
  spec:
     containers:
        - name: helloworld-kubernetes
        # replace <image-tag> with your actual image
          image: <image-tag>
          ports:
            - containerPort: 8080

現(xiàn)在我們已經(jīng)擁有了所需的一切。我們的鏡像已經(jīng)構(gòu)建袜漩,我們已經(jīng)根據(jù)它定義了一項(xiàng)服務(wù)⌒靼郑現(xiàn)在我們終于可以使用Kubernetes來(lái)部署它了。我們將使用kubectl命令行工具將其部署在我們的集群上:

kubectl apply -f helloworld-go-v1.yaml

要獲取服務(wù)負(fù)載均衡器IP宙攻,請(qǐng)運(yùn)行以下命令:

kubectl get svc helloworld-v1 -o wide

記下外部IP奠货。

現(xiàn)在,當(dāng)我們?cè)L問(wèn)負(fù)載均衡器地址時(shí)座掘,我們可以看到已部署的服務(wù)递惋。它并不多,但“Hello World”向我們展示了這一切都奏效了溢陪!

關(guān)鍵組件

構(gòu)建此服務(wù)使我們能夠演示大多數(shù)主要的Kubernetes組件萍虽。首先,我們布置了Dockerfile來(lái)為服務(wù)創(chuàng)建代碼形真。要在Kubernetes中實(shí)際創(chuàng)建服務(wù)杉编,我們需要使用YAML來(lái)定義它。我們的定義采用我們定義的鏡像并提供一些關(guān)鍵信息:應(yīng)該部署的位置,版本以及其他配置信息王财。

之后卵迂,我們?cè)赑od上部署了該服務(wù)。在Kubernetes模型中绒净,Pod與容器密切相關(guān)见咒。許多部署(如我們的部署)使用單個(gè)Pod進(jìn)行服務(wù)。嚴(yán)格來(lái)說(shuō)挂疆,Kubernetes不管理容器改览,它管理。有時(shí)這些容器與Pod有一對(duì)一的關(guān)系缤言,有時(shí)候有多個(gè)容器關(guān)聯(lián)到一個(gè)Pod宝当。

最后,我們看到了編排的原則胆萧。在定義了我們希望如何部署API之后庆揩,我們只是將配置文件推送到Kubernetes并完成其余工作。使用kubectl跌穗,我們能夠指定我們想要的架構(gòu)订晌,Kubernetes負(fù)責(zé)其余的工作。當(dāng)我們稍后查看更復(fù)雜的示例時(shí)蚌吸,通過(guò)多個(gè)版本和復(fù)雜的部署锈拨,我們將更清楚地看到這個(gè)簡(jiǎn)單想法的強(qiáng)大功能。

深入了解

部署簡(jiǎn)單的服務(wù)只是一個(gè)開(kāi)始羹唠。Kubernetes原生支持微服務(wù)奕枢,它能用很好的方式來(lái)部署基本的,甚至更復(fù)雜的微服務(wù)架構(gòu)佩微,而不會(huì)有太多的麻煩缝彬。但要真正利用微服務(wù)的可擴(kuò)展性,你還需要知道更多喊衫。

在下一篇文章中跌造,我們將介紹Istio。通過(guò)微服務(wù)方法族购,我們能夠?qū)我坏膽?yīng)用程序分解為多種服務(wù)。

最后在打一波廣告:

如果你也想在IT行業(yè)拿高薪陵珍,可以參加我們的訓(xùn)練營(yíng)課程寝杖,選擇最適合自己的課程學(xué)習(xí),技術(shù)大牛親授互纯,8個(gè)月后瑟幕,進(jìn)入名企拿高薪。我們的課程內(nèi)容有:Java工程化、高性能及分布式只盹、高性能辣往、深入淺出。高架構(gòu)殖卑。性能調(diào)優(yōu)站削、Spring,MyBatis孵稽,Netty源碼分析和大數(shù)據(jù)等多個(gè)知識(shí)點(diǎn)许起。如果你想拿高薪的,想學(xué)習(xí)的菩鲜,想就業(yè)前景好的园细,想跟別人競(jìng)爭(zhēng)能取得優(yōu)勢(shì)的,想進(jìn)阿里面試但擔(dān)心面試不過(guò)的接校,你都可以來(lái)猛频。以下截圖屬于一小部分。

以上內(nèi)容免費(fèi)領(lǐng)取傳送門(mén):https://shimo.im/docs/BYMjlkYOqM08diLI

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛛勉,一起剝皮案震驚了整個(gè)濱河市伦乔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌董习,老刑警劉巖烈和,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異皿淋,居然都是意外死亡招刹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)窝趣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疯暑,“玉大人,你說(shuō)我怎么就攤上這事哑舒「菊” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵洗鸵,是天一觀的道長(zhǎng)越锈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)膘滨,這世上最難降的妖魔是什么甘凭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮火邓,結(jié)果婚禮上丹弱,老公的妹妹穿的比我還像新娘德撬。我一直安慰自己,他們只是感情好躲胳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蜓洪。 她就那樣靜靜地躺著,像睡著了一般坯苹。 火紅的嫁衣襯著肌膚如雪隆檀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天北滥,我揣著相機(jī)與錄音刚操,去河邊找鬼。 笑死再芋,一個(gè)胖子當(dāng)著我的面吹牛菊霜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播济赎,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鉴逞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了司训?” 一聲冷哼從身側(cè)響起构捡,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壳猜,沒(méi)想到半個(gè)月后勾徽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡统扳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年喘帚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咒钟。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吹由,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朱嘴,到底是詐尸還是另有隱情倾鲫,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布萍嬉,位于F島的核電站乌昔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帚湘。R本人自食惡果不足惜玫荣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望大诸。 院中可真熱鬧捅厂,春花似錦、人聲如沸资柔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贿堰。三九已至辙芍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羹与,已是汗流浹背故硅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纵搁,地道東北人吃衅。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腾誉,于是被迫代替她去往敵國(guó)和親徘层。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • 1利职、基礎(chǔ)架構(gòu) 1.1 Master Master節(jié)點(diǎn)上面主要由四個(gè)模塊組成:APIServer趣效、scheduler...
    阿斯蒂芬2閱讀 10,878評(píng)論 0 44
  • 內(nèi)容已經(jīng)移動(dòng)到這里[https://blog.csdn.net/WeiPeng2K/article/details...
    weipeng2k閱讀 2,575評(píng)論 1 22
  • 天啦,我被點(diǎn)燃啦猪贪,小時(shí)候跷敬,一直想要努力成為的,想要學(xué)習(xí)热押,獲得的西傀,興趣,愛(ài)好楞黄,一個(gè)一個(gè)都回來(lái)了池凄,每一個(gè)都那么鮮活,生...
    黑水大鵬閱讀 125評(píng)論 0 2
  • 今天和朋友一起去觀看了這部國(guó)產(chǎn)動(dòng)漫電影鬼廓,每次有新的國(guó)貨出現(xiàn)肿仑,我的心情都是分外激動(dòng),作為一名資深老漫迷來(lái)說(shuō)碎税,我看過(guò)很...
    尚巾林閱讀 336評(píng)論 3 0
  • 推薦一本書(shū)尤慰,書(shū)名同標(biāo)題,作者牛刀雷蹂。 說(shuō)得比較客觀伟端,美國(guó)模型因?yàn)閿?shù)據(jù)準(zhǔn)確,可靠匪煌。中國(guó)數(shù)據(jù)大家都知道责蝠,做參考党巾。 美國(guó)的...
    d2c4e7eee1dc閱讀 359評(píng)論 0 2