发布 Istio client-go

获取 Istio 资源的编程访问权限。

2019年11月14日 | 作者:Neeraj Poddar - Aspen Mesh

我们很高兴地宣布 Istio client-go 存储库的初始版本发布,它使开发人员能够在 Kubernetes 环境中以编程方式访问 Istio API。此存储库中生成的 Kubernetes informer 和客户端集使开发人员可以轻松创建控制器并对所有 Istio 自定义资源定义 (CRD) 执行创建、读取、更新和删除 (CRUD) 操作。

这是许多 Istio 用户强烈要求的功能,这从 Aspen MeshKnative 项目 生成的客户端的功能请求中可以明显看出。如果您当前正在使用上述客户端之一,则可以轻松切换到使用 Istio client-go,如下所示

import (
  ...
  - versionedclient "github.com/aspenmesh/istio-client-go/pkg/client/clientset/versioned"
  + versionedclient "istio.io/client-go/pkg/clientset/versioned"
)

由于生成的客户端集在功能上等效,因此切换导入的客户端库应该足以使用新生成的库。

如何使用 client-go

Istio client-go 存储库遵循与 Istio API 存储库相同的分支策略,因为客户端存储库依赖于 API 定义。如果您想使用稳定的客户端集,则可以使用 client-go 存储库中的发布分支或标记版本。使用客户端集非常类似于使用 Kubernetes client-go,以下是如何使用客户端列出传递的命名空间中所有 Istio 虚拟服务 的快速示例

package main

import (
  "log"
  "os"

  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  "k8s.io/client-go/tools/clientcmd"

  versionedclient "istio.io/client-go/pkg/clientset/versioned"
)

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)
  }
  // Print all VirtualServices
  vsList, err := ic.NetworkingV1alpha3().VirtualServices(namespace).List(metav1.ListOptions{})
  if err != nil {
    log.Fatalf("Failed to get VirtualService in %s namespace: %s", namespace, err)
  }
  for i := range vsList.Items {
    vs := vsList.Items[i]
    log.Printf("Index: %d VirtualService Hosts: %+v\n", i, vs.Spec.GetHosts())
  }
}

您可以在 此处 找到更深入的示例。

为生成 Istio client-go 创建的有用工具

如果您想知道为什么花了这么长时间或者为什么生成此客户端集很困难,本节适合您。在 Istio 中,我们使用 protobuf 规范编写 API,然后使用 protobuf 工具链将其转换为 Go 定义。如果您尝试从 protobuf 生成的 API 生成 Kubernetes 客户端集,可能会遇到三个主要挑战

我希望新发布的客户端库能够使用户能够为 Istio API 创建更多集成和控制器,并且上面提到的工具可以供开发人员使用,以从 Proto API 生成 Kubernetes 客户端集。

分享此文章