![Kubernetes微服务实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/32436059/b_32436059.jpg)
1.4.1 微服务打包和部署
当使用基于微服务的架构时,你将拥有许多微服务。通常,这些微服务可以独立开发、独立部署。打包机制就是封装成容器,每个微服务都会有一个Dockerfile,生成的镜像表示该微服务的部署单元。在Kubernetes中,你的微服务镜像将在Pod内运行(可能与其他容器一起)。但是,在节点上隔离运行的Pod的弹性并不是很高。如果节点上的kubelet进程崩溃,它会重新启动Pod的容器,但是如果节点本身发生故障,那么Pod就会消失。Kubernetes通过基于Pod实现的抽象和资源来解决这些问题。
ReplicaSet是具有一定数量副本的Pod集合。创建ReplicaSet时,Kubernetes将确保始终有指定数量的Pod在集群中运行。部署资源会进一步提供和你考虑微服务时的方式完全一致的抽象。当你准备好新版本的微服务时,需要对其进行部署。如下是一个Kubernetes部署清单:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/007-i.jpg?sign=1738832426-0wlScMVoKHAWhfJYsPuNTLRI9GIv6Gys-0-5c8286611df4d1e6d6895e457e07d57e)
这是一个YAML文件(https://yaml.org/),其中包含一些Kubernetes资源的通用字段以及某些特定于部署的字段,接下来让我们逐一查看。这里介绍的所有内容几乎都适用于其他Kubernetes资源。
·apiVersion字段标记Kubernetes资源版本。Kubernetes API服务器的特定版本(例如V1.13.0)可以与不同资源的不同版本一起使用。资源版本包括两部分:API组(在本例中为apps)和版本号(v1),版本号可能包含alpha或beta字样:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/007-2-i.jpg?sign=1738832426-Ipi8QaTzF4vhpqjj3nF6skhAXdFvBPBW-0-1a9e7f23afa0cda30b59c91079098406)
·kind字段指定我们要处理的资源或API对象,你将在本章及后面的章节中遇到许多不同类型的资源:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/007-3-i.jpg?sign=1738832426-mJgEfSbwGI7OfMKK4kXQks2bZfF4xMvK-0-7dac1294c29ea7a08e75fbc5e8d559aa)
·metadata部分包含资源名称(nginx)和标签(字符串键值对)。该名称用于引用此特定资源。标签允许Kubernetes对共享相同标签的一组资源进行操作,它非常有用且可以灵活管理。在示例中只有一个标签(app:nginx):
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/007-4-i.jpg?sign=1738832426-UebP0TnI7NfLuOogfMTjCEC2vgoiyFIf-0-4e45a3800108237d3c6e73a61308fa94)
·接下来是spec字段,这是一个ReplicaSet的spec规约。你可以直接创建一个ReplicaSet,但那样的话它就变成了静态的,而使用部署的目的就是动态地管理副本集。ReplicaSet规格中包含副本数(示例中是3)、一个带有matchLabels的选择器(也是app:nginx),以及一个Pod模板。ReplicaSet将管理具有与matchLabels匹配的标签的容器:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/008-i.jpg?sign=1738832426-eBWUhwUZb8Mrydh70wTaWI1aFeJ28E5Q-0-94b9fccbb4b07cc121eb6b2e0fc18038)
·最后看一下Pod模板。该模板分为两部分:metadata和spec,metadata是你指定标签的地方,spec描述了Pod中的容器containers。Pod中可能会有一个或多个容器,示例中的Pod仅包含一个容器。容器的关键字段是镜像(通常是Docker镜像),微服务一般就打包在该镜像中,也是我们要运行的代码。此外,还有一个名称(nginx)和一组端口:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/008-2-i.jpg?sign=1738832426-EEiAoxsWUrqFduTHJATtRsOt3o648ziX-0-917e6089964d47bb7fe05e80217bbdd8)
Kubernetes还提供更多可选字段。如果你想更深入地了解,请参考部署的API链接:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/#deployment-v1-apps。