0

I'm using client-go interface to create metallb's IPAddressPool CRD. the dynamicClient works fine with create CRD, but since I need to send request to proxy server and have it forwarded to k8s api-server, I neet to set URL prefix and custom headers, so I decided to use rest client, here's code I wrote based-on dynamic client:

import (
    "context"
    "fmt"
    metallbv1beta1 "go.universe.tf/metallb/api/v1beta1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/apimachinery/pkg/runtime/serializer"
    "k8s.io/apimachinery/pkg/util/json"
    "k8s.io/client-go/discovery"
    "k8s.io/client-go/kubernetes/scheme"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "log"
    "path"
)

func main() {
    // init kubeconfig
    kubeconfig := path.Join(homedir.HomeDir(), ".kube", "config")
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    die(err)

    // schema.GroupVersion{Group: "metallb.io", Version: "v1beta1"}
    config.GroupVersion = &metallbv1beta1.GroupVersion
    config.NegotiatedSerializer = serializer.NewCodecFactory(scheme.Scheme)

    parameterScheme := runtime.NewScheme()
    dynamicParameterCodec := runtime.NewParameterCodec(parameterScheme)
    metav1.AddToGroupVersion(parameterScheme, metallbv1beta1.GroupVersion)

    clientset, err := rest.RESTClientFor(config)
    die(err)

    ipaddressPool := metallbv1beta1.IPAddressPool{
        TypeMeta: metav1.TypeMeta{
            Kind:       "IPAddressPool",
            APIVersion: "metallb.io/v1beta1",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name:      "test",
            Namespace: "metallb-system",
        },
        Spec: metallbv1beta1.IPAddressPoolSpec{
            Addresses: []string{"172.22.0.4/32"},
        },
    }

    bytesIPAddressPool, err := json.Marshal(ipaddressPool)
    die(err)

    rsc := clientset.Post().
        Resource("ipaddresspools").
        Namespace(nameSpace).
        Body(bytesIPAddressPool).
        SetHeader("Content-Type", runtime.ContentTypeJSON).
        SpecificallyVersionedParams(&metav1.CreateOptions{}, dynamicParameterCodec, versionV1)

    url := rsc.URL()
    log.Println(url)

    result := &metallbv1beta1.IPAddressPool{}
    err = rsc.Do(context.Background()).Into(result)
    die(err)

    log.Println(result)
}

and I got an 404 error:

2023/05/11 11:22:03 https://127.0.0.1:36313/metallb.io/v1beta1/namespaces/metallb-system/ipaddresspools
panic: the server could not find the requested resource (post ipaddresspools.metallb.io)

I dont understand where the problem is, I dont even know if the code right. Did I miss something? How to fix it?, appreciate any help!

Here are some version info.

  • kubectl version
{
  "clientVersion": {
    "major": "1",
    "minor": "26",
    ...
  },
  "kustomizeVersion": "v4.5.7",
  "serverVersion": {
    "major": "1",
    "minor": "21",
    ...
  }
}
  • client-go
go.universe.tf/metallb v0.13.9
k8s.io/apimachinery v0.26.1
k8s.io/client-go v0.26.4
  • metallb
metallb/controller:v0.13.9
metallb/speaker:v0.13.9
YEZIHANG
  • 25
  • 5

0 Answers0