Deployment 最大的特点是:它可以让升级过程变成 声明式 的(而不是指令式的)。声明式是 k8s 一直强调的哲学。
假如没有 Deployment,你需要使用 ReplicaSet 或 ReplicationController。一旦升级时,如果你想实现滚动升级,需要非常麻烦地去建立新的 RS / RC,不停地修改 replicas 值,直到升级完成。Deployment 帮你搞定这个过程。
kubectl
提供了一个命令 rolling-update
,但这个命令不是使用 Deployment,而是把上述人工操作的过程,用代码来调用 kube-apiserver 完成。如果 kubectl
中途挂掉,会非常地啰嗦麻烦。
而且 Deployment 还提供了类似发布历史的能力:
$ kubectl rollout history deployment kubia deployments "kubia":
REVISION CHANGE-CAUSE
2 kubectl set image deployment kubia nodejs=luksa/kubia:v2
3 kubectl set image deployment kubia nodejs=luksa/kubia:v3
发布有异常时,你可以回滚到前一个版本(revision)。你也可以回滚到任何特定版本。保留几个版本,由 revisionHistoryLimit
控制。版本信息存在 RS 中,因此你不要手动删掉 Deployment 建立的 RS。