Search code examples
kubernetesistiooperator-sdk

How to access 3rd-party Custom Resource Definition?


I am working on Opersator-SDK. In my operator controller, I try to create an Istio Custom resource -- virtualservices. The definition of virtualservices looks like as following:

kind: CustomResourceDefinition
apiVersion: apiextensions.k8s.io/v1beta1
metadata:
  name: virtualservices.networking.istio.io

Here I think there are a few of things that have to do first:

  1. Get Istio API module
  2. In my controller code, import istio virtualservices package
  3. How to create/update virtualservice resource

My question is how to do them? Because I never do that before, so have to ask for help how to do that.


Solution

  • Here is an example of creating a istio virtual service using istio client-go. Here we are using istio.io/api/networking/v1alpha3 and istio.io/client-go/pkg/apis/networking/v1alpha3 to create the VirtualService custom resource spec. After that using istio.io/client-go/pkg/clientset/versioned to actually sending this spec to kubernetes API server.

    package main
    
    import (
        "context"
        "log"
        "os"
    
        v1alpha3Spec "istio.io/api/networking/v1alpha3"
        "istio.io/client-go/pkg/apis/networking/v1alpha3"
        versionedclient "istio.io/client-go/pkg/clientset/versioned"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/client-go/tools/clientcmd"
    )
    
    func main() {
    
        kubeconfig := os.Getenv("KUBECONFIG")
        namespace := os.Getenv("NAMESPACE")
    
        if len(kubeconfig) == 0 || len(namespace) == 0 {
            log.Fatalf("Environment variables KUBECONFIG and NAMESPACE need to be set")
        }
    
        restConfig, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
        if err != nil {
            log.Fatalf("Failed to create k8s rest client: %s", err)
        }
    
        ic, err := versionedclient.NewForConfig(restConfig)
        if err != nil {
            log.Fatalf("Failed to create istio client: %s", err)
        }
        var host []string
        host[0] = "abc.com"
        virtualServiceCrd := &v1alpha3.VirtualService{
            TypeMeta: metav1.TypeMeta{
                APIVersion: "networking.istio.io/v1alpha3",
                Kind:       "Virtualservice",
            },
            ObjectMeta: metav1.ObjectMeta{
                Name: "default",
            },
            Spec: v1alpha3Spec.VirtualService{
                Hosts: host,
            },
        }
    
        ic.NetworkingV1alpha3().VirtualServices(namespace).Create(context.TODO(), virtualServiceCrd, metav1.CreateOptions{})
    }