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