在Kubernetes对象元数据中,有the concepts of resourceVersion
and generation
。我理解resourceVersion
的概念:它是一种乐观的并发控制机制 - 它会随着每次更新而改变。那么,generation
是什么?
答案 0 :(得分:6)
resourceVersion都会发生变化,并用于乐观并发控制
在某些对象中,生成由服务器递增,作为持久写入影响对象的spec
的一部分。
status
字段有一个observedGeneration
子字段,供控制器保留上次执行的生成。
答案 1 :(得分:1)
在 Deployment
上下文中:
resourceVersion
是 k8s 资源的版本,而 generation
是部署的版本,您可以使用 kubectl
cli 撤消、暂停等。
kubectl rollout
的源代码:https://github.com/kubernetes/kubectl/blob/master/pkg/cmd/rollout/rollout.go#L50
K8s 服务器保存对任何 k8s 资源的所有修改。每个修改都有一个版本,称为 resourceVersion
。
k8s 语言库提供了一种实时接收任何资源的 ADD
、DELETE
、MODIFY
事件的方法。您还有 BOOKMARK
事件,但让我们暂时搁置一下。
在任何修改操作中,您都会收到更新 resourceVersion
的新 k8s 资源。您可以使用此 resourceVersion
并从此 resourceVersion
开始监视,因此您不会错过从 k8s 服务器向您发送第一个响应到监视开始之间的任何事件。< /p>
resourceVersion
将在对象进行任何修改后发生变化。
它存在的原因是为了避免多个客户端尝试修改同一个k8s资源的并发问题。这种模式在数据库中也很常见,您可以找到有关它的更多信息:
您没有在问题中提到它,但这是我们在继续讨论 generation
之前需要澄清的重要信息。
这是此部署当前跟踪的副本集的版本。
当部署仍在第一次创建时,该值将不存在(有关此问题的良好讨论可以在此处找到:https://github.com/kubernetes/kubernetes/issues/47871)。
可以在 status
下找到此值:
....
apiVersion: apps/v1
kind: Deployment
.....
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2021-02-07T19:04:17Z"
lastUpdateTime: "2021-02-07T19:04:17Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2021-02-07T19:04:15Z"
lastUpdateTime: "2021-02-07T19:17:09Z"
message: ReplicaSet "deployment-bcb437a4-59bb9f6f69" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 3. <<<--------------------
readyReplicas: 1
replicas: 1
updatedReplicas: 1
<块引用>
observedGeneration 等同于 deployment.kubernetes.io/revision 注解。它是观察到的世代。
它看起来是正确的,因为 deployment.kubernetes.io/revision
在第一次创建部署且尚未准备好时不存在,并且在更新部署时它与 observedGeneration
具有相同的值。
它表示此部署应该跟踪的“新”replicaSet 的版本。
第一次创建deployment时,this的值等于1。当observedGeneration
设置为1
时,表示replicate set准备好了(这个问题不是关于如何知道部署是否成功(或不成功)所以我没有进入什么是“准备好”,这是我为这个答案创建的一些术语 - 但请确保有附加 strong> 条件来检查部署是否成功)。
部署 k8s 资源中的任何更改都会触发重新部署。 generation
值将递增 1,然后需要一些时间,直到 observedGeneration
等于 generation
值。
在 observedGeneration
的上下文中 generation
和 kuebctl rollout status
的更多信息(以检查部署是否“完成”)来自 kubectl
源代码:
if deployment.Generation <= deployment.Status.ObservedGeneration {
cond := deploymentutil.GetDeploymentCondition(deployment.Status, appsv1.DeploymentProgressing)
if cond != nil && cond.Reason == deploymentutil.TimedOutReason {
return "", false, fmt.Errorf("deployment %q exceeded its progress deadline", deployment.Name)
}
if deployment.Spec.Replicas != nil && deployment.Status.UpdatedReplicas < *deployment.Spec.Replicas {
return fmt.Sprintf("Waiting for deployment %q rollout to finish: %d out of %d new replicas have been updated...\n", deployment.Name, deployment.Status.UpdatedReplicas, *deployment.Spec.Replicas), false, nil
}
if deployment.Status.Replicas > deployment.Status.UpdatedReplicas {
return fmt.Sprintf("Waiting for deployment %q rollout to finish: %d old replicas are pending termination...\n", deployment.Name, deployment.Status.Replicas-deployment.Status.UpdatedReplicas), false, nil
}
if deployment.Status.AvailableReplicas < deployment.Status.UpdatedReplicas {
return fmt.Sprintf("Waiting for deployment %q rollout to finish: %d of %d updated replicas are available...\n", deployment.Name, deployment.Status.AvailableReplicas, deployment.Status.UpdatedReplicas), false, nil
}
return fmt.Sprintf("deployment %q successfully rolled out\n", deployment.Name), true, nil
}
return fmt.Sprintf("Waiting for deployment spec update to be observed...\n"), false, nil
我必须说,我不确定 observedGeneration
何时可以高于 generation
。也许人们可以在评论中帮助我。
总而言之:来自这篇精彩文章的插图:https://thenewstack.io/kubernetes-deployments-work/
更多信息:
resourceVersion
相关:What k8s bookmark solves?