Create/Get a custom kubernetes resource

8/14/2020


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?

-- SamuelTJackson
go
kubernetes

1 Answer

8/15/2020

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

-- kozmo
Source: StackOverflow