Kubernetes 中保证服务高可用的资源对象——Deployment
- 一、Deployment 需求背景
- 二、Deployment 资源对象的 Yaml 定义
- 一个疑惑点
- 三、Deployment 资源对象的操作
一、Deployment 需求背景
- 因为 Pod 是 K8S 集群进行调度的基础单元,直接对 Pod 对象进行修改来部署服务在大规模服务集群的情况下复杂性会暴增。我们之前讨论过 K8S 中离线任务的场景下会使用 Job/CronJob 这2种资源对象来处理作业。但是对于在线业务——Web服务的主流状态,K8S 提供了新的 API 资源对象——Deployment 进行处理。
- Deployment 资源对象除了作为一种在线任务状态以外,还能保证服务的高可用、多服务实例、滚动更新等多种特性。通过组合的思想对 Pod 做了一层封装。
二、Deployment 资源对象的 Yaml 定义
使用以下命令创建定义 Deployment 资源对象的Yaml 模版:
kubectl create test-deploy --image=nginx:alpine --dry-run=client -o yaml
会得到一个大概内容如下的 yaml 文件:
apiVersion: apps/v1 # 资源对象版本
kind: Deployment # 资源对象类型
metadata:
labels:
app: test-deploy # 资源对象的标签
name: test-deploy # 资源对象名称
spec:
replicas: 2 # 指定该deploy资源对象中Pod的副本数目为2
selector:
matchLabels:
app: test-deploy
template:
metadata:
labels:
app: test-deploy
spec:
containers:
- image: nginx:alpine
name: nginx
一个疑惑点
我们可能会注意到,在 spec.selector 下和 spec.template.spec 下有完全相同的一组标签。为什么会出现这样重复的定义呢?
- deployment 资源对象和 Pod 资源对象一般都是在线的、运行状态下长期存在的资源对象,同时他们也是动态的资源对象。K8S 会通过不断监控集群中符合该deployment 资源对象定义的Pod 的状态而不断调整。因为Yaml 文件中定义的是期望值,如果存在Pod 被删除、销毁的情况,被监控发现会会通过标签的匹配创建出符合deployment 资源对象定义要求的Pod(数量上和内容上);
- deployment 资源对象和 Pod 资源对象是组合关系,是一种松耦合,这种松耦合的关系正是通过标签匹配建立起来的;
三、Deployment 资源对象的操作
查看资源对象基本信息:kubectl api-resources
根据deployment资源对象的yaml定义进行创建:kubectl apply -f test-deploy.yaml
查看deployment资源对象状态:kubectl get deploy
该命令下会得到如下字段来表示deployment的状态:
ready: 表示Pod的运行状态的数量。前面数字是当前的数量,后面的是预期的数量(定义在deployment资源对象的Yaml文件中)
up-to-date: 处于最新状态的Pod数量。如果deployment资源对象下的Pod副本比较多,在一次Yaml文件更新后,所有的Pod副本都更新到最新状态是一个漫长的过程。
available: 表示运行中、健康可用的Pod副本的数量。
同时我们也可以直接查看该deployment资源对象下的Pod:
kubectl get pod
kubectl describe pod {pod_name}
kubectl logs pod {pod_name}
我们还可以对deployment资源对象进行扩容
kubectl apply -f test-deploy.yaml # 在yaml文件中修改好期望副本后直接运行该命令
# 也可以通过 kubectl scale 命令对 deployment资源对象进行扩容
kubectl scale --replicas=11 deploy test-deploy