Kubernetes resourceVersion和一代人之间的区别是什么?

Kubernetes resourceVersion和一代人之间的区别是什么?,kubernetes,Kubernetes,在Kubernetes对象元数据中,有。我理解resourceVersion的概念:它是一种乐观的并发控制机制,每次更新都会改变。那么,生成用于什么呢?resourceVersion在每次写入时都会更改,并用于乐观并发控制 在某些对象中,作为影响对象的spec的持久写入的一部分,服务器会增加生成 一些对象的状态字段有一个observedGeneration子字段,供控制器保存上次执行操作的生成。在部署上下文中: 简言之 resourcevision是k8s资源的版本,而generation是部署

在Kubernetes对象元数据中,有。我理解resourceVersion的概念:它是一种乐观的并发控制机制,每次更新都会改变。那么,
生成用于什么呢?

resourceVersion在每次写入时都会更改,并用于乐观并发控制

在某些对象中,作为影响对象的
spec
的持久写入的一部分,服务器会增加生成


一些对象的
状态
字段有一个
observedGeneration
子字段,供控制器保存上次执行操作的生成。

部署
上下文中:

简言之
resourcevision
是k8s资源的版本,而
generation
是部署的版本,您可以使用
kubectl
cli来撤销、暂停等

kubectl卷展栏的源代码

长版本 资源版本 K8s服务器保存对任何K8s资源的所有修改。每次修改都有一个名为
resourceVersion
的版本

k8s语言库提供了一种实时接收任何资源的
添加
删除
修改
事件的方法。您还有
BOOKMARK
事件,但让我们暂时把它放在一边

在任何修改操作中,您都会收到更新了
resourceVersion
的新k8s资源。您可以使用此
resourceVersion
并从此
resourceVersion
开始启动监视,这样在k8s服务器向您发回第一个响应之间,直到监视启动之前,您不会错过任何事件

  • K8s不会永远保存每种资源的历史。我认为这将节省500万美元,但我不确定是否准确
resourceVersion
将在修改对象后更改

它的存在是为了避免多个客户端试图修改同一k8s资源时出现并发问题。这种模式在数据库中也很常见,您可以找到有关它的更多信息:

  • 乐观并发控制()

观测生成 您在问题中没有提到这一点,但这是我们在进入
生成之前需要澄清的重要信息

它是此部署当前跟踪的replicaSet的版本

当部署仍在第一次创建时,此值将不存在(有关此值的详细讨论可在此处找到:)

此值可在
状态下找到

....
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
我必须说,我不确定一个
观测到的生成
何时可以高于
生成
。也许大家可以在评论中帮助我


总而言之:这篇伟大的文章中的说明:

更多信息:

  • 有关书签事件(与
    resourceVersion
    相关)的更多信息:
  • 如何回滚Kubernete中的部署:

谢谢;我能请您详细说明一下您的第二句话吗?这是否像一个“检查点”——即控制器,为了实现传入资源请求的状态,可能必须将其分为两部分编写?例如,“好的,我已经完成了第1阶段,但我还没有完全更改
规范
”?不,对于控制器来说,这是一种简单的方法,可以识别规范中没有任何需要响应的更改。没有它,控制器必须跟踪其上次操作的规范的外观(在内存中,在重新启动时失败,或者在某个地方持久化,在添加新的默认字段时失败)使用它,控制器读取对象,将生成与持久化状态进行比较。observedGeneration,如果它们不同,则按照规范操作,并将结果记录在新观察到的生成的状态中。非常感谢。我希望这是我的最后一个问题:通过查看
resourceVersion,或者,随着光线慢慢亮起,由于
资源版本
可能会因某些非
规范
字段更改而更改,因此它不适合此情况?确切地说。资源版本会因状态更改、标签/注释更改或其他不相关的更改而更改,这些更改不需要控制器做出反应规格变更
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