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