【问题标题】:How to read Volumesnapshot object (or any K8s object)如何读取 Volumesnapshot 对象(或任何 K8s 对象)
【发布时间】:2020-07-08 03:09:50
【问题描述】:

我想在 go 中读取和解析 Volumesnapshot 对象(或任何 K8s 对象)。我试图参考https://github.com/kubernetes/client-go

我正在尝试将 VolumeSnapshot CRD 元数据中的自定义注释添加为

apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: new-snapshot-test
  **annotation:**
        **test:Tushar**
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass
  source:
    persistentVolumeClaimName: pvc-test

我还有一个自定义 CSI 驱动程序。我需要我的 CSI 驱动程序在 K8s api 服务器中查找该 volumneSnapshot 并解析此自定义注释,然后进行相应处理。

【问题讨论】:

    标签: go kubernetes


    【解决方案1】:

    您可以按照 Github 存储库 here 中的任何示例进行操作。例如使用动态/非结构化方式(基于this的代码sn-p):

    func main() {
        var kubeconfig *string
        if home := homedir.HomeDir(); home != "" {
            kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
        } else {
            kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
        }
        flag.Parse()
    
        namespace := "default"
    
        config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
        if err != nil {
            panic(err)
        }
        client, err := dynamic.NewForConfig(config)
        if err != nil {
            panic(err)
        }
    
        volumesnapshotRes := schema.GroupVersionResource{Group: "snapshot.storage.k8s.io", Version: "v1beta1", Resource: "volumesnapshots"}
    
        // List VolumeSnapshots
        prompt()
        fmt.Printf("Listing volume snapshots in namespace %q:\n", apiv1.NamespaceDefault)
        list, err := client.Resource(volumesnapshotRes).Namespace(namespace).List(context.TODO(), metav1.ListOptions{})
        if err != nil {
            panic(err)
        }
        for _, d := range list.Items {
        ...
            // do whatever with the items (print, etc)
        }
        // Finish up
        ...
    

    【讨论】:

    • 感谢@Rico 的回复。我有几个问题需要与您澄清。 1. 除了从 kubeconfig 中获取 config 对象,我们可以使用 context 或 createSnapshotRequest 来创建 config 对象吗? 2. 当用户应用 VolumeSnapshot yaml 文件时,K8s 会在内部创建一个 volumesnapshot 对象。我需要在运行时访问该对象并在拍摄实际的 volumeSnapshot 之前对其进行相应的处理。通过创建配置对象并使用它来获取volumesnapshotRes,然后最终列出与namespace对应的所有volumeSnapshots,这是一个正确的方法吗?
    • 1.如果已经预先配置了变量,则可以使用上下文。 createSnapshotRequest 听起来像是创建快照的意思。 2. 这听起来是正确的方法
    • 能否请您告诉我如何在 for _, d := range list.Items {} 中使用“d”解析不同的注释/属性
    • metadata, found, err := unstructured.NestedInt64(d.Object, "spec", "metadata") ?这行得通吗?
    • 我确实尝试过元数据,发现,错误:= unstructured.NestedInt64(d.Object, "spec", "metadata") 但问题是我得到编译时错误为 d.Object undefined (type "github.com/kubernetes-csi/external-snapshotter/v2/pkg/apis/volumesnapshot/v1beta1".VolumeSnapshot 没有字段或方法对象)请建议
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多