如何在将所有Kubernetes对象一次性获取为快照的同时,持续流式获取变更?

后端开发 2026-07-11

我正在努力找出在需要维护现有对象快照的同时,监视Kubernetes API服务器变更的“正确”方式。

我需要让我的代码在初始阶段就能知道已经接收到所有对象,也就是说,在完成初始化并宣布自己“就绪”之前,必须有一个完整的快照。随后,还需要在变更发生时进行流式传输。

我可以同时获取快照并进行变更的流式传输,但我还没想清楚如何只对在快照之后发生的变更进行流式传输。

我已经尝试使用resourceVersion,并将数值上的最大资源版本存储起来,然后把它传给watch:

# self._resource_version holds the int maximum
# resourceVersion from previous requests
kwargs = {} if self._resource_version is None else {"resource_version": self.resource_version}
w = watch.Watch()
async for event in w.stream(api.list_custom_object_for_all_namespaces, self._group, self._version, self._kind, **kwargs):
    # ...

但这会立刻导致错误:

kubernetes_asyncio.client.exceptions.ApiException: (410)
Reason: Expired: too old resource version: 13661954 (14468401)

请注意,我正在获取所有命名空间的所有资源类型。

如何在不把初始快照中的全部内容也一并流式传输的前提下,监视在初始快照之后发生的变更?

解决方案

原来我引用的资源版本错了。条目本身有一个资源版本,快照本身也有一个资源版本。

result = await api.list_custom_object_for_all_namespaces(group, version, kind)
snapshot = result["items"]
resource_version = result["metadata"]["resourceVersion"]

# ... use the snapshot

w = watch.Watch()
async for event in w.stream(api.list_custom_object_for_all_namespaces, self._group, self._version, self._kind, resource_version=resource_version):
    # ...
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章