Установка исправлений через 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
приведет вас намного дальше