Kubernetes最基本的组成部件是pod:单个容器或者联系紧密的要一起调度到同一台机器上的一组容器。pod是部署的基本单元并且代表的是一个服务实例。由于它是部署的单元,因此也是水平扩展(复制)单元,在扩大或者缩小容量时,就会增加或者移除pod。
为market-data服务定义一组pod。在应用目录下创建一个名称为market-data-replica-set.yml的文件。
---
kind: ReplicaSet --- 定义一组pod
apiVersion: extensions/v1beta1
metadata:
name: market-data
spec:
replicas: 3 --- 包含3个pod副本
template: --- 使用该模板创建pod
metadata: --- 根据标签区分pod
labels:
app: market-data
tier: backend
track: stable
spec:
containers:
- name: market-data
image: <docker id>/market-data:latest --- 从Docker注册中心拉取的容器
ports:
- containerPort: 8000
在Kubernetes中,一般用YAML文件(或者JSON,但YAML更加易读)向调度器声明指令。这些指令定义了一些Kubernetes对象,而pod就是其中一种。这些配置文件代表了所期望的集群状态。将这些配置信息应用于Kubernetes后,调度器会持续工作来维持这一理想状态。
使用kubectl命令行工具,将该文件应用于本地集群。在启动Minikube后,它应该会自动配置kubectl命令以操作集群。这个工具和集群主节点开放的API进行交互。
kubectl apply -f market-data-replica-set.yml
Kubernetes会异步创建所定义的对象。可以使用kubectl来观察操作进度。运行kubectl get pods(或kubectl get pods –l app=market-data)命令会列出已经创建的pod。第一次启动会耗费几分钟的时间,因为节点要下载Docker镜像。
直接创建或者销毁pod都是不正常的;相反,pod是由控制器管理的。控制器负责接受某些期望的状态(比如,总是运行3个market-data pod实例)然后执行一系列操作来达到这一状态。这种观测-比较-执行的循环会持续执行。
最常见的控制器类型:ReplicaSet。复制集的目标是确保在任何时间都有指定数量的pod处于运行状态。比如,假设某个pod消失了——可能是集群中某个节点出现了故障——复制集会察觉到集群的当前状态和期望状态不一致,然后尝试在集群的其他地方重新分配一个pod以进行替换。
可以操作一下看看效果。删除一个之前创建的pod(pod是按名称区分的):$ kubectl delete pod <pod name>。复制集会重新创建一个新的pod来代替已被删除的那个pod。
可见,部署微服务实例应该建立在单个基本操作之上。通过控制器和不可变容器的结合,读者可以随意处理pod,并依赖自动化来维持服务容量,即使是在底层基础设施不可靠的情况下。
摘取自 摩根·布鲁斯和保罗·A.佩雷拉的《微服务实战》
网友评论