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