微服务架构在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/_/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"]

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

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

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

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

现在我们已经拥有了所需的一切。我们的镜像已经构建,我们已经根据它定义了一项服务。现在我们终于可以使用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原生支持微服务,它能用很好的方式来部署基本的,甚至更复杂的微服务架构,而不会有太多的麻烦。但要真正利用微服务的可扩展性,你还需要知道更多。

在下一篇文章中,我们将介绍Istio。通过微服务方法,我们能够将单一的应用程序分解为多种服务。

最后在打一波广告:

如果你也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,8个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来。以下截图属于一小部分。

以上内容免费领取传送门:https://shimo.im/docs/BYMjlkYOqM08diLI

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 1、基础架构 1.1 Master Master节点上面主要由四个模块组成:APIServer、scheduler...
    阿斯蒂芬2阅读 10,870评论 0 44
  • 内容已经移动到这里[https://blog.csdn.net/WeiPeng2K/article/details...
    weipeng2k阅读 2,573评论 1 22
  • 天啦,我被点燃啦,小时候,一直想要努力成为的,想要学习,获得的,兴趣,爱好,一个一个都回来了,每一个都那么鲜活,生...
    黑水大鹏阅读 123评论 0 2
  • 今天和朋友一起去观看了这部国产动漫电影,每次有新的国货出现,我的心情都是分外激动,作为一名资深老漫迷来说,我看过很...
    尚巾林阅读 331评论 3 0
  • 推荐一本书,书名同标题,作者牛刀。 说得比较客观,美国模型因为数据准确,可靠。中国数据大家都知道,做参考。 美国的...
    d2c4e7eee1dc阅读 356评论 0 2