4

我正在研究 Operator-SDK。在我的操作员控制器中,我尝试创建一个 Istio 自定义资源——虚拟服务。虚拟服务的定义如下:

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

在这里,我认为首先需要做一些事情:

  1. 获取 Istio API 模块
  2. 在我的控制器代码中,导入 istio virtualservices 包
  3. 如何创建/更新虚拟服务资源

我的问题是怎么做?因为我以前从来没有这样做过,所以不得不寻求帮助如何做到这一点。

4

2 回答 2

2

这是使用 istio client-go创建 istio 虚拟服务的示例。在这里,我们使用istio.io/api/networking/v1alpha3andistio.io/client-go/pkg/apis/networking/v1alpha3来创建VirtualService自定义资源规范。之后使用istio.io/client-go/pkg/clientset/versioned实际将此规范发送到 kubernetes API 服务器。

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{})
}
于 2020-09-14T17:59:57.103 回答
1

导入 istio 虚拟服务包

是的,您应该导入 Istio 包,并且每个 CRD 都是一个 api,因此它带有一个客户端,用于以编程方式使用该库“创建”、“删除”、“更新”和“观看”。

如果你使用 Golang,这是一个好的开始:https ://github.com/istio/client-go

以及 api 客户端: https ://github.com/istio/client-go/tree/master/pkg

于 2020-09-14T14:44:00.500 回答