我們討論了最近的微服務(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