我们知道在k8s
中List
请求是很常见的一种操作,用于获取一种资源对象的列表,如pod
的List
方法用于获取k8s
集群中的所有pod
资源。
在深入理解List
操作之前,我们需要了解resourceVersion
这个参数。
在每k8s
资源对象中都有一个字段resourceVersion
用于标识当前资源的版本,可用于乐观并发控制和获取资源的方式。
在k8s
中有三种操作方法支持resourceVersion
参数。apiserver
根据不同的请求方法和不同的参数,对resourceVersion
都有不同的解释。
resourceVersion unset | resourceVersion=”0” | resourceVersion=”{value other than 0}” |
---|---|---|
Most Recent | Any | Not older than |
Most Recent: 从etcd中取数据
Any: 优先用最新的,但不保证一定是最新的
Not older than: 不低于某个版本号
从 v1.19
开始,List
方法开始支持resourceVersionMatch
,如果你设置了resourceVersionMatch
参数,将会决定apiserver
如何解析resourceVersion
官方文档建议当在List
请求中如果使用了resourceVersion
应该带上resourceVersionMatch
参数。当然也会处理好一些特殊情况apiserver
会忽略resourceVersonMatch
。
除非你有很强的一致性要求,建议使用resourceVersionMatch=NotOlderThan
以获得更好的性能。
如果你设置了resourceVersionMatch
而没设置resourceVersion
将会是无效的。
resourceVersion
与resourceVersionMatch
的关系可以查看官方文档中的表格
1 | // staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go |
1 | // staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go |
REF: