跳到主要内容

Deployment

  • Deployment 在 k8s 中主要是用来管理 Pod 的,
生产环境中,我们基本上不会直接管理 pod,我们需要 kubernetes 来帮助我们来完成一些自动化操作,例如自动扩容或者自动升级版本。
可以想象在生产环境中,我们手动部署了 10 个 hellok8s:v1 的 pod,这个时候我们需要升级成 hellok8s:v2 版本,
我们难道需要一个一个的将 hellok8s:v1 的 pod 手动升级吗?

这个时候就需要我们来看 kubeates 的另外一个资源 deployment,来帮助我们管理 pod。
  • yml说明
其中 kind 表示我们要创建的资源是 deployment 类型, metadata.name 表示要创建的 deployment 的名字,这个名字需要是唯一的。

在 spec 里面表示,首先 replicas 表示的是部署的 pod 副本数量,selector 里面表示的是 deployment 资源和 pod 资源关联的方式,
这里表示 deployment 会管理 (selector) 所有 labels=hellok8s 的 pod。

template 的内容是用来定义 pod 资源的,你会发现和作业一:Hellok8s Pod 资源的定义是差不多的,
唯一的区别是我们需要加上 metadata.labels 来和上面的 selector.matchLabels 对应起来。来表明 pod 是被 deployment 管理,
不用在template 里面加上 metadata.name 是因为 deployment 会主动为我们创建 pod 的唯一name。

创建 Deployment 资源

kubectl apply -f deployment.yml

查看 Deployment 资源

kubectl get deployments

查看 Pod

  • Deployment 为 Pod 创建了唯一id
kubectl get pods   

删除 Pod

kubectl delete pod hellok8s-deployment-7fdfcf48dc-557tc 

再次查看Pod,发现k8s又重新启动了一个Pod

当生产环境管理着成千上万个 pod 时,我们不需要关心具体的情况,只需要维护好这份 deployment.yaml 文件的资源定义即可。

kubectl get pods   

删除 Deployment

根据名称删除单个 Deployment

这是最常用的方法。你需要知道 Deployment 的名称和它所属的命名空间(Namespace)。

kubectl delete deployment <deployment-name> -n <namespace-name>

#<deployment-name>: 你要删除的 Deployment 的实际名称。

#-n <namespace-name>: 指定 Deployment 所在的命名空间。如果你的 Deployment 在 default 命名空间,你可以省略 -n 参数。

根据配置文件 yml 删除

kubectl delete -f <path-to-your-yaml-file>

自动扩容, 修改 yml 时,如何更新

当我们想要将 hellok8s:v1 的资源自动扩容到 3 个副本时, 只需要将 replicas 的值设置成 3,接着重新输入 kubectl apply -f deployment.yaml 即可

可以在 kubectl apply 之前通过新建窗口执行 kubectl get pods --watch 命令来观察 pod 启动和删除的记录,
想要减少副本数时也很简单,你可以尝试将副本数随意增大或者缩小,再通过 watch 来观察它的状态。

Rolling Update(滚动更新)

如果我们在生产环境上,管理着多个副本的 hellok8s:v1 版本的 pod, 我们需要更新到 v2 的版本,像上面那样的部署方式是可以的, 但是也会带来一个问题,就是所有的副本在同一时间更新,这会导致我们 hellok8s 服务在短时间内是不可用的, 因为所有 pod 都在升级到 v2 版本的过程中,需要等待某个 pod 升级完成后才能提供服务。

这个时候我们就需要滚动更新 (rolling update),在保证新版本 v2 的 pod 还没有 ready 之前,先不删除 v1 版本的 pod。

在 deployment 的资源定义中, spec.strategy.type 有两种选择:

  • RollingUpdate: 逐渐增加新版本的 pod,逐渐减少旧版本的 pod。
  • Recreate: 在新版本的 pod 增加前,先将所有旧版本 pod 删除。

大多数情况下我们会采用滚动更新 (RollingUpdate) 的方式, 滚动更新又可以通过 maxSurge 和 maxUnavailable 字段来控制升级 pod 的速率,具体可以详细看官网定义。:

maxSurge: 最大峰值,用来指定可以创建的超出期望 Pod 个数的 Pod 数量。 maxUnavailable: 最大不可用,用来指定更新过程中不可用的 Pod 的个数上限。