如何访问第三方自定义资源定义?
How to access 3rd-party Custom Resource Definition?
我正在开发 Operator-SDK。在我的操作员控制器中,我尝试创建一个 Istio 自定义资源——虚拟服务。虚拟服务的定义如下所示:
kind: CustomResourceDefinition
apiVersion: apiextensions.k8s.io/v1beta1
metadata:
name: virtualservices.networking.istio.io
这里我觉得有几件事必须先做:
- 获取 Istio API 模块
- 在我的控制器代码中,导入 istio 虚拟服务包
- 如何create/update虚拟服务资源
我的问题是如何做?因为我从来没有这样做过,所以不得不寻求帮助如何做到这一点。
import istio virtualservices package
是的,你应该导入 Istio 包,每个 CRD 都是一个 api,所以它带有一个客户端,可以使用图书馆。
如果您使用的是 Golang,这是一个好的开始:https://github.com/istio/client-go
以及 api 客户端:
https://github.com/istio/client-go/tree/master/pkg
下面是一个使用 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{})
}
我正在开发 Operator-SDK。在我的操作员控制器中,我尝试创建一个 Istio 自定义资源——虚拟服务。虚拟服务的定义如下所示:
kind: CustomResourceDefinition
apiVersion: apiextensions.k8s.io/v1beta1
metadata:
name: virtualservices.networking.istio.io
这里我觉得有几件事必须先做:
- 获取 Istio API 模块
- 在我的控制器代码中,导入 istio 虚拟服务包
- 如何create/update虚拟服务资源
我的问题是如何做?因为我从来没有这样做过,所以不得不寻求帮助如何做到这一点。
import istio virtualservices package
是的,你应该导入 Istio 包,每个 CRD 都是一个 api,所以它带有一个客户端,可以使用图书馆。
如果您使用的是 Golang,这是一个好的开始:https://github.com/istio/client-go
以及 api 客户端: https://github.com/istio/client-go/tree/master/pkg
下面是一个使用 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{})
}