8

I want to create a custom kubernetes resource with go. The application is deployed in the kubernetes cluster. I want to create e.g. the followng resource:

    apiVersion: configuration.konghq.com/v1
    kind: KongPlugin
    metadata:
      name: add-response-header
    config:
      add:
        headers:
        - "demo: injected-by-kong"
    plugin: response-transformer

So far I always created the 'standard' resources e.g. a secret with the following code:

     CreateSecret(name string, data map[string]string) error {
 confs, err := rest.InClusterConfig()
        if err != nil {
            panic(err)
        }
        clientset, err = kubernetes.NewForConfig(confs)
        i := clientset.CoreV1()
        if _, err := i.Secrets(namespace).Create(&v1.Secret{
            TypeMeta:   metav1.TypeMeta{
                Kind:       "Secret",
                APIVersion: "v1",
            },
            ObjectMeta: metav1.ObjectMeta{
                Name:   name,
            },
            StringData: data,
            Type:       "Opaque",
        }); err != nil {
            return err
        }
}

In addition I tried to get a resource with the following code:

b, err := clientset.RESTClient().Get().Namespace(namespace).Resource("KongPlugin").DoRaw()

I get the following err:

the server could not find the requested resource (get KongPlugin)

If I make a request at the command line k get KongPlugin I can see all the resources.

NAME                PLUGIN-TYPE           AGE
add-proxy-headers   request-transformer   3h34m

So how can view the custom resoources?

1

1 Answer 1

17

For RESTClient 👇🏼

Get:

You have to fully specify path to you custom resource. Use fluent interface

data, err := clientset.RESTClient().
        Get().
        AbsPath("/apis/<api>/<version>").
        Namespace("<namespace>").
        Resource("kongplugins").
        Name("kongplugin-sample").
        DoRaw(context.TODO())

or specify manually

data, err := clientset.RESTClient().
        Get().
        AbsPath("/apis/<api>/<version>/namespaces/<namespace>/kongplugins/kongplugin-sample").
        DoRaw(context.TODO())

You can find AbsPath in selfLink of custom resource.

Create:

For example, you can post marshaled data use AbsPath

kongPlugin := &KongPlugin{
        TypeMeta: metav1.TypeMeta{
            APIVersion: "<api>/<version>",
            Kind:       "KongPlugin",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name:      "kongplugin-sample",
            Namespace: "<namespace>",
        },
        ...}}

body, err := json.Marshal(kongPlugin)

data, err := clientset.RESTClient().
        Post().
        AbsPath("/apis/<api>/<version>/namespaces/<namespace>/kongplugins").
        Body(body).
        DoRaw(context.TODO())

because arg of the method Body(obj interface{}) is an empty interface, you can use different types of arguments according to documentation: k8s.io/client-go/rest - func (*Request) Body

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.