写点什么

如何使用 Kubernetes 在实践中部署微服务?

  • 2020-05-18
  • 本文字数:3220 字

    阅读完需:约 11 分钟

如何使用Kubernetes在实践中部署微服务?

由于早期单体架构复杂性逐渐增加、部署速度逐渐变慢,极大程度阻碍了企业技术创新。因此,为了改善这一问题,微服务成为部分企业的切实所需。


尽管近两年来,微服务发展势头迅猛,但围绕着容器能否很好地实施微服务依旧存在争议。在本文中,我们首先回顾一下领先的容器管理和服务编排框架 Kubernetes。如今,Kubernetes 和微服务几乎是同义词,所以最好彻底了解它们是如何组合在一起的。

Kubernetes 的优势

与微服务本身非常相似,容器近年来已成为现代可扩展架构中不可或缺的一部分。与微服务一样,容器已经流行起来,因为它们为开发过程提供了真正的好处:它们可靠,易于扩展,并提供了一个很好的抽象,隔离了 Web 服务的核心组件。


特别是,一种容器化技术已远远超过其他技术。这是正确的,我们的微服务之旅的下一站是看看 Kubernetes 和 Docker,它是现代微服务设施的主力。简单地说,Kubernetes 是现代基于容器的 DevOps 和微服务以及容器携手并进的黄金标准。



随着容器化技术的兴起,有几种竞争技术可用于管理大型 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 请求。代码非常简单:


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))}
复制代码


运行它的第一步是将其构建到 Docker 容器中。为此,我们从基础 Go Docker 镜像开始构建以下 Dockerfile。


# Use the official Golang image to create a build artifact.# https://hub.docker.com/_/golangFROM golang as builder# Copy local code to the container image.WORKDIR /go/src/github.com/haseebh/hello-worldCOPY . .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-buildsFROM alpineCOPY --from=builder /go/src/github.com/haseebh/hello-world-v1 /helloworld-v1ENV PORT 8080# Run the web service on container startup.CMD ["/helloworld-v1"]
复制代码


现在我们只需要构建它。选择一个镜像 tag,然后运行以下两个 Docker 命令来构建和保存镜像:


# Build the container on your local machinedocker build -t <image-tag> .
# Push the container to docker registrydocker push <image-tag>
复制代码


在我们部署之前还有一步。虽然我们已经定义了将进入我们的 Pod 的内容,但我们还没有定义我们的服务。让我们做一个简单的服务定义,称为 Hello Service。我们将它保存在 hello-service.yml 服务定义文件中。


apiVersion: v1kind: Servicemetadata:   name: helloworld-v1spec:   ports:      - port: 80      protocol: TCP      targetPort: 8080    selector:       app: helloworld-v1    type: LoadBalancer---apiVersion: apps/v1kind: Deploymentmetadata:   name: helloworld-v1   labels:      app: helloworld-v1spec:   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
复制代码


现在我们已经拥有了所需的一切。我们的镜像已经构建,我们已经根据它定义了一项服务。现在我们终于可以使用 Kubernetes 来部署它了。我们将使用 kubectl 命令行工具将其部署在我们的集群上:


kubectl apply -f helloworld-go-v1.yaml
复制代码


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


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 原生支持微服务,它能用很好的方式来部署基本的,甚至更复杂的微服务架构,而不会有太多的麻烦。但要真正利用微服务的可扩展性,你还需要知道更多。


2020-05-18 18:034757

评论

发布
暂无评论
发现更多内容

云图说 | 云上资源管控有神器!关于IAM,你想知道的都在这里!

华为云开发者联盟

服务 权限管理 iam

一口气说出四种幂等性解决方案,面试官露出了姨母笑~

不才陈某

Java 分布式 接口

产品策略闭环是个什么环?

万事ONES

项目管理 团队协作 需求管理 需求分析 产品策略

面试被问高并发一脸懵?那是你没看过我整理得高并发回答模板

小Q

Java 学习 面试 高并发 性能调优

智慧警务可视化平台开发,重点人员管控系统搭建

t13823115967

智慧公安 智慧警务系统开发

IDEA 文档插件 DocView 版本更新:修改 UI 并支持 IDEA 2020.3 !

程序员小航

idea插件 IntelliJ IDEA 文档生成

硬肝到秃头!Alibaba强推并发编程笔记我跪了,真的学到好多东西!

Java架构追梦

Java 学习 架构 面试 并发编程

将原则纳入到架构的生命中

soolaugust

架构 思考 设计

我和阿里P7差的不是薪资?而是Redis+微服务+Nginx+MySQL+Tomcat

Java架构之路

Java 程序员 架构 面试 编程语言

太赞了!滴滴开源了一套分布式ID的生成系统...

Java架构师迁哥

盘点2020 | 疫情下的思考和学习

soolaugust

盘点2020

《大数据算法》.pdf

田维常

算法

智慧城市建设,社区智能化系统搭建解决方案

t13823115967

智慧城市 平安小区

解析字节算法面试真题,深入探究ArrayList应用原理

小Q

Java 学习 编程 架构 面试

好久不见!这份Spring全家桶、Docker、Redis架构大礼包免费赠送

Java架构之路

Java 程序员 架构 面试 编程语言

VACUUM无法从表中删除死元组的三个原因

PostgreSQLChina

数据库 postgresql

一文为你详解Unique SQL原理和应用

华为云开发者联盟

数据库 sql unique

答了Mybatis这个问题后,面试官叫我回去等通知……

田维常

mybatis

EZYTRX波场智能合约APP系统软件开发

系统开发

Prometheus TSDB(Part 2):预写日志(WAL)和检查点

Grafana 爱好者

云原生 Prometheus tsdb 可观察性

Java进阶文档:彻底搞懂JVM+Linux+MySQL+Netty+Tomcat+并发编程

Java架构之路

Java 程序员 架构 面试 编程语言

耗时一个月整理的97道大厂Java核心面试题出炉,精心整理,无偿分享

Java架构之路

Java 程序员 架构 面试 编程语言

从 JMM 透析 volatile 与 synchronized 原理

码哥字节

volatile JVM JMM Java 25 周年 synchronized

80%Java开发者面试都问的SpringBoot你竟不会?看完这些笔记足以

Java架构之路

Java 程序员 架构 面试 编程语言

腾讯高工强烈推荐的“Netty速成手册”原理+应用+调优,带你将知识点一网打尽

比伯

Java 编程 程序员 架构 Netty

一文带你彻底了解大数据处理引擎Flink内存管理

华为云开发者联盟

大数据 数据 处理

什么是全场景AI计算框架MindSpore?

华为云开发者联盟

人工智能 AI mindspore

为了SpringBoot提交Tomcat执行,我总结了这么多

小Q

tomcat 学习 面试 微服务 springboot

从源码的角度搞懂 Java 动态代理!

Java架构师迁哥

LeetCode题解:127. 单词接龙,BFS+统计单词变化次数,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

dubbogo 3.0:牵手 gRPC 走向云原生时代

阿里巴巴云原生

gRPC 云原生 中间件 dubbo-go Go 语言

如何使用Kubernetes在实践中部署微服务?_文化 & 方法_Rancher_InfoQ精选文章