Установка исправлений через kubernetes/client-go

Трудно понять, что не так. У меня есть удаленный кластер kubernetes и скопировал конфигурацию локально. Я знаю, что это правильно, потому что я получил другие команды для работы на меня.

Единственное, чего я не могу получить - это патч для развертывания. Мой код:

const namespace = "default"

var clientset *kubernetes.Clientset

func init() {
    kubeconfig := "/Users/$USER/go/k8s-api/config"
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        log.Fatal(err)
    }

    // create the clientset
    clientset, err = kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
}

func main() {
    deploymentsClient := clientset.ExtensionsV1beta1().Deployments("default")

    patch := []byte(`[{"spec":{"template":{"spec":{"containers":[{"name":"my-deploy-test","image":"$ORG/$REPO:my-deploy0.0.1"}]}}}}]`)
    res, err := deploymentsClient.Patch("my-deploy", types.JSONPatchType, patch)
    if err != nil {
        panic(err)
    }
    fmt.Println(res)

}

Все, что я вернусь, это:panic: the server rejected our request due to an error in our request

Любая помощь приветствуется, спасибо!

2 ответа

Решение

На самом деле вы должны использовать types.StrategicMergePatchType и убрать ведущий ([) и трейлинг (]) скобка из исправления строки.

Merge-patch: с помощью JSON-патча для слияния, если вы хотите обновить список, вы должны указать весь новый список. И новый список полностью заменяет существующий список.

Strategic-merge-patch: со стратегическим патчем слияния, список либо заменяется, либо объединяется в зависимости от стратегии патча. Стратегия патча определяется значением patchStrategy введите тег поля в исходном коде Kubernetes. Например, поле Контейнеры PodSpec структура имеет patchStrategy слияния:

type PodSpec struct {
  ...
  Containers []Container `json:"containers" patchStrategy:"merge" patchMergeKey:"name" ...`

NB: kubectl по умолчанию использует стратегическое исправление слияния для исправления ресурсов kubernetes.

Вы перепутали JSONPatchType with MergePatchType; JSONPatchType хочет, чтобы входные данные были "командами" в формате RFC 6902, и в этом случае это может быть массив JSON, поскольку для входного документа можно применить несколько команд.

Тем не менее, ваша полезная нагрузка выглядит гораздо ближе к вам, желая MergePatchType, в этом случае входные данные не должны быть массивом JSON, поскольку исходный документ не является массивом "spec" объекты.

Таким образом, я готов поспорить, просто отбросив [ и тянущийся ] изменив аргумент на types.MergePatchType приведет вас намного дальше

Другие вопросы по тегам