简体   繁体   中英

Can I take a volume snapshot with the k8s python client?

In python k8s client, i use below code

yaml file

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
    name: test-snapshot
    namespace: test
spec:
    volumeSnapshotClassName: snapshotclass
source:
    persistentVolumeClaimName: test-pvc

python code

res = utils.create_from_dict(k8s_client, yaml_file)

However, i got this message:

AttributeError: module 'kubernetes.client' has no attribute 'SnapshotStorageV1Api'

I want to take a volumesnapshot in k8s. How can i do that?

Please give me some advices!

As I pointed in part of the comment I made under the question:

Have you seen this github issue comment: github.com/kubernetes-client/python/issues/… ?

The link posted in the comments is a github issue for:

  • VolumeSnapshot ,
  • VolumeSnapshotClass ,
  • VolumeSnapshotContent

support in the Kubernetes python client.

Citing the comment made in this github issue by user @roycaihw that explains a way how you can make a snapshot:

It looks like those APIs are CRDs: https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes/#the-volumesnapshotclass-resource

If that's the case, you could use the CustomObject API to send requests to those APIs once they are installed. Example: https://github.com/kubernetes-client/python/blob/master/examples/custom_object.py

-- Github.com: Kubernetes client: Python: Issues: 1995: Issue comment: 2


Example

An example of a Python code that would make a VolumeSnapshot is following:

from kubernetes import client, config


def main():
    config.load_kube_config()

    api = client.CustomObjectsApi()

    # it's my custom resource defined as Dict
    my_resource = {
        "apiVersion": "snapshot.storage.k8s.io/v1beta1",
        "kind": "VolumeSnapshot",
        "metadata": {"name": "python-snapshot"},
        "spec": {
            "volumeSnapshotClassName": "example-snapshot-class",
            "source": {"persistentVolumeClaimName": "example-pvc"}
                }
    }

    # create the resource
    api.create_namespaced_custom_object(
        group="snapshot.storage.k8s.io",
        version="v1beta1",
        namespace="default",
        plural="volumesnapshots",
        body=my_resource,
    )

if __name__ == "__main__":
    main()

Please change the values inside of this code to support your particular setup (ie apiVersion , .metadata.name , .metadata.namespace , etc.).

A side note!

This Python code was tested with GKE and it's gce-pd-csi-driver .

After running this code the VolumeSnapshot should be created:

  • $ kubectl get volumesnapshots
NAME               AGE
python-snapshot    19m
  • $ kubectl get volumesnapshotcontents
NAME                                               AGE
snapcontent-71380980-6d91-45dc-ab13-4b9f42f7e7f2   19m

Additional resources:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM