华夏IT网 - 至繁归于至简,IT行业综合站。 设为首页|加入收藏

华夏IT网-您身边的IT行业专家。


当前位置:首页 > 云计算 > 正文

微服务架构在Kubernetes上的实现

发布时间:2019-07-14 来源:华夏it网 我要评论

在上一篇文章中,咱们评论了最近的微服务趋势,以及随同微服务架构或许呈现的一些杂乱问题。在接下来的几周内,咱们将深化讨论这样的一个问题。咱们将讨论不同规划挑选中固有的权衡,以及可以采纳哪些办法来缓解这些问题。

微服务架构在Kubernetes上的完结

但是,在深化之前,我以为花一点时刻来了解当今微服务中的最新技能状况是有意义的。咱们首要回忆一下抢先的容器办理和服务编列结构Kubernetes。 现在,Kubernetes和微服务几乎是近义词,所以最好完全了解它们是怎么组合在一起的。

Kubernetes

与微服务自身十分类似,容器近年来已成为现代可扩展架构中不可或缺的一部分。与微服务相同,容器现已流行起来,由于它们为开发进程供给了真实的优点:它们牢靠,易于扩展,并供给了一个很好的笼统,隔离了Web服务的中心组件。假如你想和更多Kubernetes技能专家沟通,可以加我微信liyingjiese,补白『加群』。群里每周都有全球各大公司的最佳实践以及职业最新动态。

特别是,一种容器化技能已远远超过其他技能。 这是正确的,咱们的微服务之旅的下一站是看看Kubernetes和Docker,它是现代微服务设施的主力。简略地说,Kubernetes是现代依据容器的DevOps和微服务以及容器携手并进的黄金规范。

02.png

跟着容器化技能的鼓起,有几种竞赛技能可用于办理大型Docker安置和依据容器的服务。你或许还记得其间一些退役的解决方案:Docker Swarm,Apache Mesos,OpenStack Magnum等。但是,现在Kubernetes现已筛选了竞赛对手。它是仅有的AWS,Azure,Google Cloud原生自带,一起RedHat和Pivotal等许多私有云供货商也供给的容器化解决方案。

Kubernetes可以如此迅速地取得如此多的优势,根因在于它可以将装备与编列分隔。这种杂乱程度应该家常便饭,由于Kubernetes来自谷歌的内部项目Borg,它是谷歌在分布式体系上的数十年经验总结。运用Kubernetes,你可以指定服务的外观,实例数,冗余类型,服务所在方位。然后,该东西主动核算从现状到创立该服务有必要进行哪些更改。可以把它幻想成SQL,你没有指定数据库怎么增加或转化每个行。你可以指定数据的外观,数据库会指出怎么完结数据。 Kubernetes也是相同的。

Kubernetes特色

Kubernetes供给的是将容器视为服务界说的才能。Kubernetes可以处理纯容器。即便你想在不进入微服务范畴的状况下只安置容器,Kubernetes在办理和安置方面也能为你供给许多协助。你在群会集的服务器上装置Kubernetes软件,Kubernetes主进程将主动安置你的软件。

除了根本的容器外,Kubernetes还可以正常的运用它所称的Pod。 Pod是由一个或多个服务组成的独自界说。 Pod可以包括从独自运转的单个服务器到完好的多容器服务,例如数据库容器与键值存储和一个包括在一起的http服务器相结合。 Pod是Kubernetes的根本构建块。

最终一个元素是服务。在Kubernetes中,服务就像是将Pod组合到应用程序中的配方。尽管Pod是具有生命周期的详细安置,但服务更笼统。它描绘了一个独自的组件,如后端或数据库。

结合全部这些才能的是Kubernetes指令行东西kubectl。尽管Kubernetes供给的笼统很棒,但指令行东西十分强壮,答应你运用kubectl指令描绘对架构的杂乱更改。总而言之,kubectl CLI东西包括近50种不同的指令,用于处理在修正依据容器的微服务安置进程中呈现的全部状况(你总会呈现犯错的时分)。

着手实践一番

尽管高层次描绘很有协助,但实践上没什么比实践安置Kubernetes服务能更好的了解它的了。咱们在这里没有做任何深邃的东西,仅仅展现怎么安置一个简略的“Hello World”服务,但它应该是有利的。

咱们在Go中编写了一个简略的服务器,用“Hello World”呼应http恳求。代码十分简略:

  1. package main 
  2. import ( 
  3. "fmt" 
  4. "log" 
  5. "net/http" 
  6. "os" 
  7. func handler(w http.ResponseWriter, r *http.Request) { 
  8. log.Print("Hello world received a request."
  9. version := os.Getenv("VERSION"
  10. if version == "" { 
  11.   version = "v1" 
  12. log.Println(version) 
  13. fmt.Fprintf(w, "Hello world %s\n",version) 
  14. func main() { 
  15. log.Print("Hello world sample started."
  16. http.HandleFunc("/api/hello", handler) 
  17. port := os.Getenv("PORT"
  18. if port == "" { 
  19. port = "8080" 
  20. log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil)) 
  21. }  

运转它的榜首步是将其构建到Docker容器中。为此,咱们从根底Go Docker镜像开端构建以下Dockerfile。

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

现在咱们只需要构建它。 挑选一个镜像tag,然后运转以下两个Docker指令来构建和保存镜像:

  1. # Build the container on your local machine 
  2. docker build -t  . 
  3. # Push the container to docker registry 
  4. docker push  

在咱们安置之前还有一步。尽管咱们现已界说了将进入咱们的Pod的内容,但咱们还没有界说咱们的服务。让咱们做一个简略的服务界说,称为Hello Service。咱们将它保存在hello-service.yml服务界说文件中。

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata: 
  4. name: helloworld-v1 
  5. spec: 
  6. ports: 
  7.   - port: 80 
  8.   protocol: TCP 
  9.   targetPort: 8080 
  10. selector: 
  11.    app: helloworld-v1 
  12. type: LoadBalancer 
  13.  
  14. --- 
  15.  
  16. apiVersion: apps/v1 
  17. kind: Deployment 
  18. metadata: 
  19. name: helloworld-v1 
  20. labels: 
  21.   app: helloworld-v1 
  22. spec: 
  23. replicas: 1 
  24. selector: 
  25.   matchLabels: 
  26.      app: helloworld-v1 
  27. template: 
  28.   metadata: 
  29.      labels: 
  30.         app: helloworld-v1 
  31.   spec: 
  32.      containers: 
  33.         - name: helloworld-kubernetes 
  34.         # replace  with your actual image 
  35.           image:  
  36.           ports: 
  37.             - containerPort: 8080 

现在咱们现已具有了所需的全部。咱们的镜像现已构建,咱们现已依据它界说了一项服务。现在咱们总算可以正常的运用Kubernetes来安置它了。咱们将运用kubectl指令行东西将其安置在咱们的集群上:

  1. kubectl apply -f helloworld-go-v1.yaml 

要获取服务负载均衡器IP,请运转以下指令:

  1. kubectl get svc helloworld-v1 -o wide 

记下外部IP。

现在,当咱们拜访负载均衡器地址时,咱们咱们可以看到已安置的服务。它并不多,但“Hello World”向咱们展现了这全部都见效了!

要害组件

构建此服务使咱们可以演示大多数首要的Kubernetes组件。首要,咱们安置了Dockerfile来为服务创立代码。要在Kubernetes中实践创立服务,咱们应该运用YAML来界说它。咱们的界说选用咱们界说的镜像并供给一些要害信息:应该安置的方位,版别以及其他装备信息。

之后,咱们在Pod上安置了该服务。在Kubernetes模型中,Pod与容器密切相关。许多安置(如咱们的安置)运用单个Pod进行服务。严格来说,Kubernetes不办理容器,它办理。有时这些容器与Pod有一对一的联系,有时分有多个容器相关到一个Pod。

最终,咱们看到了编列的准则。在界说了咱们期望怎么安置API之后,咱们仅仅将装备文件推送到Kubernetes并完结其他作业。运用kubectl,咱们可以指定咱们想要的架构,Kubernetes担任其他的作业。当咱们稍后检查更杂乱的示例时,经过多个版别和杂乱的安置,咱们将更清楚地看到这个简略主意的强壮功用。

深化了解

安置简略的服务仅仅一个开端。Kubernetes原生支撑微服务,它能用很好的办法来安置根本的,乃至更杂乱的微服务架构,而不会有太多的费事。但要真实运用微服务的可扩展性,你还需要知道更多。

鄙人一篇文章中,咱们将介绍Istio。经过微服务办法,咱们可以将单一的应用程序分解为多种服务。咱们在榜首篇文章中看到,这种办法为处理杂乱体系供给了更多的开发人员敏捷性和更好的笼统。在这里,咱们看到了怎么运用Kubernetes在实践中安置微服务。下周,咱们将开端研讨微服务范畴中的一些新式概念,如微服务网格,以向你展现这些技能的真实才能。

0
本文标签: 微服务架构

相关内容

发表评论

华夏IT网-IT行业综合站
Copyright © 华夏IT网 版权所有 鄂ICP备13015020号-6