簡體   English   中英

使用 go 客戶端修補 pvc

[英]Patching a pvc using go client

我正在嘗試從此界面使用 go 庫的補丁選項更新 pvc label 。

有沒有關於如何使用它的例子? 另外如果label不存在會補丁還添加label?

我希望在 object 下方更新/添加 my_label:

kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-class: ""
  creationTimestamp: "2021-01-25T18:53:02Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
      my_label: my_value

可以通過以下方式完成:

    persVolC := client.CoreV1().PersistentVolumeClaims("default")

    data := `
    [
      { "op": "add", "path": "/metadata/labels/mylabel", "value": "myvalue" }
    ]
    `
    updatedPvc, err := persVolC.Patch(ctx, "name-of-pvc", types.JSONPatchType, []byte(data), meta_v1.PatchOptions{})
    if err != nil {
        log.Fatal(err)
    }

go 操場上的完整示例。

在這里您可以閱讀有關 JSON 補丁標准的信息。

這是一個示例,我們將在默認命名空間中迭代 PersistentVolumeClaims列表,並且我們將為所有這些Items設置特定的 label my_label: label_test 您可以使用 func Get(ctx context.Context, name string, opts metav1.GetOptions)特定的 PVC 而不是 List all

package main

import (
    "context"
    "fmt"
    "log"

    meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func newClient(contextName string) (kubernetes.Interface, error) {
    configOverrides := &clientcmd.ConfigOverrides{CurrentContext: contextName}

    loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
    config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides).ClientConfig()
    if err != nil {
        return nil, err
    }

    return kubernetes.NewForConfig(config)
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    client, err := newClient("")
    if err != nil {
        log.Fatal(err)
    }

    label := make(map[string]string)
    label["my_label"] = "label_test"
    persVolC := client.CoreV1().PersistentVolumeClaims("default")

    pvcs, err := persVolC.List(ctx, meta_v1.ListOptions{})
    for _, pvc := range pvcs.Items {
        vol := pvc.DeepCopy()
        vol.ObjectMeta.Labels = label
        upd, err := persVolC.Update(ctx, vol, meta_v1.UpdateOptions{})
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(upd)
    }
}

如果要檢查 label 是否存在並更新它,可以將vol.ObjectMeta.Labels = label替換為

if _, ok := vol.ObjectMeta.Labels["my_label"]; ok {
    vol.ObjectMeta.Labels["my_label"] = "my_new_label"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM