发布 Istio client-go
获取 Istio 资源的编程访问权限。
我们很高兴地宣布 Istio client-go 存储库的初始版本发布,它使开发人员能够在 Kubernetes 环境中以编程方式访问 Istio API。此存储库中生成的 Kubernetes informer 和客户端集使开发人员可以轻松创建控制器并对所有 Istio 自定义资源定义 (CRD) 执行创建、读取、更新和删除 (CRUD) 操作。
这是许多 Istio 用户强烈要求的功能,这从 Aspen Mesh 和 Knative 项目 生成的客户端的功能请求中可以明显看出。如果您当前正在使用上述客户端之一,则可以轻松切换到使用 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 客户端集,可能会遇到三个主要挑战
创建 Kubernetes 包装器类型 - Kubernetes 客户端生成 库仅适用于遵循 Kubernetes 对象规范的 Go 对象,例如 身份验证策略 Kubernetes 包装器。这意味着对于每个需要编程访问的 API,您都需要创建这些包装器。此外,每个需要客户端代码生成的
CRD
组、版本和种类都需要大量的样板代码。为了自动化此过程,我们创建了一个 Kubernetes 类型生成器 工具,它可以根据注释自动创建 Kubernetes 类型。此工具解析的注释以及各种可用选项在 README 中进行了说明。请注意,如果您使用 protobuf 工具生成 Go 类型,则需要在 proto 文件中将这些注释添加为注释,以便这些注释存在于生成的 Go 文件中,然后此工具将使用这些文件。生成深度复制方法 - 在 Kubernetes 客户端机制中,如果您想更改从客户端集返回的任何对象,则需要复制该对象以防止就地修改缓存存储中的对象。执行此操作的规范方法是在所有嵌套类型上创建一个
deepcopy
方法。我们创建了一个工具 protoc 深度复制生成器,它是一个protoc
插件,可以根据注释使用 Proto 库实用程序 Proto Clone 自动创建deepcopy
方法。以下是一个 生成的deepcopy
方法的示例。将类型编组和解组到/从 JSON - 对于从 proto 定义生成的类型,使用默认的 Go JSON 编码器/解码器通常会出现问题,因为存在各种字段(如 protobuf 的
oneof
),需要特殊处理。此外,任何在其名称中带有下划线的 Proto 字段可能会序列化/反序列化为不同的字段名称,具体取决于编码器/解码器,因为 Go 结构体标签 生成方式不同。始终建议使用 protobuf 原语将数据序列化/反序列化为 JSON,而不是依赖于默认的 Go 库。我们创建了一个工具 protoc JSON shim,它是一个protoc
插件,可以自动为从 Proto 定义生成的所有 Go 类型创建编组器/解组器。以下是由此工具生成的代码的 示例。
我希望新发布的客户端库能够使用户能够为 Istio API 创建更多集成和控制器,并且上面提到的工具可以供开发人员使用,以从 Proto API 生成 Kubernetes 客户端集。