新聞中心
微服務(wù)架構(gòu)在Kubernetes上的實(shí)現(xiàn)
作者:新牛哥 2019-07-12 14:41:31
服務(wù)器
服務(wù)器產(chǎn)品
云計(jì)算 本文是微服務(wù)網(wǎng)格系列的第二部分,通過(guò)Kubernetes這個(gè)當(dāng)前最流行的微服務(wù)部署平臺(tái),來(lái)具體講解微服務(wù)的部署過(guò)程,讓用戶對(duì)微服務(wù)有具體認(rèn)知,同時(shí)為后續(xù)結(jié)合Istio部署更復(fù)雜服務(wù)打下基礎(chǔ)。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),吐魯番企業(yè)網(wǎng)站建設(shè),吐魯番品牌網(wǎng)站建設(shè),網(wǎng)站定制,吐魯番網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,吐魯番網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
【編者的話】本文是微服務(wù)網(wǎng)格系列的第二部分,通過(guò)Kubernetes這個(gè)當(dāng)前***的微服務(wù)部署平臺(tái),來(lái)具體講解微服務(wù)的部署過(guò)程,讓用戶對(duì)微服務(wù)有具體認(rèn)知,同時(shí)為后續(xù)結(jié)合Istio部署更復(fù)雜服務(wù)打下基礎(chǔ)。
在上一篇文章中,我們討論了最近的微服務(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ù)的核心組件。如果你想和更多Kubernetes技術(shù)專(zhuān)家交流,可以加我微信liyingjiese,備注『加群』。群里每周都有全球各大公司的***實(shí)踐以及行業(yè)***動(dòng)態(tài)。
特別是,一種容器化技術(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ù),冗余類(lèi)型,服務(wù)所在位置。然后,該工具自動(dòng)計(jì)算從現(xiàn)狀到創(chuàng)建該服務(wù)需要進(jìn)行哪些更改??梢园阉胂蟪蒘QL,你沒(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
. - # Push the container to docker registry
- docker push
在我們部署之前還有一步。雖然我們已經(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
with your actual image - image:
- 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ù)。我們?cè)?**篇文章中看到,這種方法為處理復(fù)雜系統(tǒng)提供了更多的開(kāi)發(fā)人員敏捷性和更好的抽象。在這里,我們看到了如何使用Kubernetes在實(shí)踐中部署微服務(wù)。下周,我們將開(kāi)始研究微服務(wù)領(lǐng)域中的一些新興概念,如微服務(wù)網(wǎng)格,以向你展示這些技術(shù)的真正能力。
網(wǎng)站標(biāo)題:微服務(wù)架構(gòu)在Kubernetes上的實(shí)現(xiàn)
分享URL:http://www.dlmjj.cn/article/cooigdj.html


咨詢
建站咨詢
