resourceVersion和Generation之间有什么区别?

时间:2017-11-03 16:29:08

标签: kubernetes

在Kubernetes对象元数据中,有the concepts of resourceVersion and generation。我理解resourceVersion的概念:它是一种乐观的并发控制机制 - 它会随着每次更新而改变。那么,generation是什么?

2 个答案:

答案 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 语言库提供了一种实时接收任何资源的 ADDDELETEMODIFY 事件的方法。您还有 BOOKMARK 事件,但让我们暂时搁置一下。

在任何修改操作中,您都会收到更新 resourceVersion 的新 k8s 资源。您可以使用此 resourceVersion 并从此 resourceVersion 开始监视,因此您不会错过从 k8s 服务器向您发送第一个响应到监视开始之间的任何事件。< /p>

  • K8s 不会永远保留每个资源的历史记录。我认为这会节省 500 万美元,但我不确定。

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 的上下文中 generationkuebctl rollout status 的更多信息(以检查部署是否“完成”)来自 kubectl 源代码:

https://github.com/kubernetes/kubectl/blob/a2d36ec6d62f756e72fb3a5f49ed0f720ad0fe83/pkg/polymorphichelpers/rollout_status.go#L75

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/ enter image description here

更多信息: