kuberneteskubernetes-go-clientclient-go

Patching deployments via kubernetes/client-go


Having trouble figuring out what is wrong. I have a remote kubernetes cluster up and have copied the config locally. I know it is correct because I have gotten other commands to work for me.

The one I can't get to work is a deployment patch. My code:

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)

}

All I get back is: panic: the server rejected our request due to an error in our request

Any help appreciated, thanks!


Solution

  • Actually you should use types.StrategicMergePatchType and remove leading ([) and trailing (]) brackets from patching string.

    N.B. kubectl by default uses strategic merge patch to patch Kubernetes resources.