问题描述
我正在研究Opersator-SDK。在我的操作员控制器中,我尝试创建一个Istio自定义资源-virtualservices。虚拟服务的定义如下:
kind: CustomResourceDefinition
apiVersion: apiextensions.k8s.io/v1beta1
metadata:
name: virtualservices.networking.istio.io
在这里,我认为首先需要做一些事情:
- 获取Istio API模块
- 在我的控制器代码中,导入istio virtualservices软件包
- 如何创建/更新虚拟服务资源
我的问题是怎么做?因为我以前从未这样做过,所以必须寻求帮助。
解决方法
这里是使用istio client-go创建istio虚拟服务的示例。在这里,我们使用istio.io/api/networking/v1alpha3
和istio.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{})
}
,
导入istio virtualservices软件包
是的,您应该导入Istio程序包,并且每个CRD都是一个api,因此它带有一个客户端,可以通过该程序库以编程方式“创建”,“删除”,“更新”和“监视”。
如果您正在使用Golang,这是一个不错的开始:https://github.com/istio/client-go