微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

已创建 k8s 卷快照,但它在 python k8s 客户端返回 409 错误消息

如何解决已创建 k8s 卷快照,但它在 python k8s 客户端返回 409 错误消息

我使用 python k8s 客户端成功地对我的卷进行了快照。

但是,我收到了以下消息。

我在集群中没有相同的卷快照。

为什么会这样?

代码

def create_snapshot(namespace,pvc_name):

snapshot_class = "snapshotclass"
snapshot_name = f"snapshot-{pvc_name}"

snapshot_resource = {
"apiVersion": "snapshot.storage.k8s.io/v1beta1","kind": "VolumeSnapshot","Metadata": {"name": snapshot_name},"spec": {
    "volumeSnapshotClassName": snapshot_class,"source": {"persistentVolumeClaimName": pvc_name}
    }
}

res = custom_api.create_namespaced_custom_object(
    group="snapshot.storage.k8s.io",version="v1beta1",namespace= namespace,plural="volumesnapshots",body=snapshot_resource,)

print(res)

create_snapshot("test","test-pvc")

volumenapshot 已成功创建,但我收到一条消息:

  File "/home/new/my/test/rescheduler/utils/k8s_controller.py",line 72,in create_snapshot
    body=snapshot_resource,File "/home/new/my/test/venv/lib/python3.6/site-packages/kubernetes/client/api/custom_objects_api.py",line 225,in create_namespaced_custom_object
    return self.create_namespaced_custom_object_with_http_info(group,version,namespace,plural,body,**kwargs)  # noqa: E501
  File "/home/new/my/test/venv/lib/python3.6/site-packages/kubernetes/client/api/custom_objects_api.py",line 358,in create_namespaced_custom_object_with_http_info
    collection_formats=collection_formats)
  File "/home/new/my/test/venv/lib/python3.6/site-packages/kubernetes/client/api_client.py",line 353,in call_api
    _preload_content,_request_timeout,_host)
  File "/home/new/my/test/venv/lib/python3.6/site-packages/kubernetes/client/api_client.py",line 184,in __call_api
    _request_timeout=_request_timeout)
  File "/home/new/my/test/venv/lib/python3.6/site-packages/kubernetes/client/api_client.py",line 397,in request
    body=body)
  File "/home/new/my/test/venv/lib/python3.6/site-packages/kubernetes/client/rest.py",line 280,in POST
    body=body)
  File "/home/new/my/test/venv/lib/python3.6/site-packages/kubernetes/client/rest.py",line 233,in request
    raise ApiException(http_resp=r)
kubernetes.client.exceptions.ApiException: (409)
Reason: Conflict
HTTP response headers: HTTPHeaderDict({'Audit-Id': 'dec3c73a-e5fc-4c63-8d1a-6e2e6c6600e1','Cache-Control': 'no-cache,private','Content-Type': 'application/json','Date': 'my,25 Apr 2021 10:50:52 GMT','Content-Length': '346'})
HTTP response body: {"kind":"Status","apiVersion":"v1","Metadata":{},"status":"Failure","message":"volumesnapshots.snapshot.storage.k8s.io \"snapshot-test-pvc\" already exists","reason":"AlreadyExists","details":{"name":"snapshot-test-pvc,"group":"snapshot.storage.k8s.io","kind":"volumesnapshots"},"code":409}

解决方法

将此答案作为社区 wiki 发布,以提供在尝试使用上述代码段创建资源时遇到错误 409 的可能原因之一。

随意扩展它。


问题中遇到的错误:

Reason: Conflict
HTTP response headers: HTTPHeaderDict({'Audit-Id': 'dec3c73a-e5fc-4c63-8d1a-6e2e6c6600e1','Cache-Control': 'no-cache,private','Content-Type': 'application/json','Date': 'my,25 Apr 2021 10:50:52 GMT','Content-Length': '346'})
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"volumesnapshots.snapshot.storage.k8s.io \"snapshot-test-pvc\" already exists","reason":"AlreadyExists","details":{"name":"snapshot-test-pvc,"group":"snapshot.storage.k8s.io","kind":"volumesnapshots"},"code":409}

"snapshot-test-pvc\" already exists","reason":"AlreadyExists"

表示该资源已存在于集群中。要检查集群中是否存在资源,您可以运行以下命令:

  • $ kubectl get volumesnapshots -A
  • $ kubectl describe volumesnapshots RESOURCE_NAME -A

我使用了问题中的代码并且没有问题。行动过程如下:

  • 首次运行 - VolumeSnapshot 创建成功
  • 第二次运行 - 代码返回 409 错误,指出资源已存在。
kubernetes.client.exceptions.ApiException: (409)
Reason: Conflict
<-- REDACTED --> 
HTTP response body: {"kind":"Status","message":"volumesnapshots.snapshot.storage.k8s.io \"snapshot-example-pvc\" already exists","details":{"name":"snapshot-example-pvc","code":409}

附注!

上述错误是通过问题中的修改代码(主要是值)返回的。

尝试在已创建的资源上运行 $ kubectl create -f resource.yaml -v=4 时,您也会看到此错误。


对于任何对此感兴趣的人来说,这是问题中使用的代码的 minimal,reproducible example(缺少 import 并且 def 放错了位置):

from kubernetes import client,config

def create_snapshot(namespace,pvc_name):

    config.load_kube_config()

    custom_api = client.CustomObjectsApi()

    snapshot_class = "snapshotclass"
    snapshot_name = f"snapshot-{pvc_name}"

    snapshot_resource = {
    "apiVersion": "snapshot.storage.k8s.io/v1beta1","kind": "VolumeSnapshot","metadata": {"name": snapshot_name},"spec": {
        "volumeSnapshotClassName": snapshot_class,"source": {"persistentVolumeClaimName": pvc_name}
        }
    }

    res = custom_api.create_namespaced_custom_object(
        group="snapshot.storage.k8s.io",version="v1beta1",namespace= namespace,plural="volumesnapshots",body=snapshot_resource,)

    print(res)

create_snapshot("default","test-pvc")

其他资源:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。