Istio client-go の発表

Istio リソースへのプログラム的なアクセスを実現。

2019年11月14日 | Neeraj Poddar (Aspen Mesh) 著

Kubernetes 環境で Istio API へのプログラム的なアクセスを開発者が行えるようにする Istio client go リポジトリの最初のリリースを発表できることを嬉しく思います。このリポジトリで生成された Kubernetes インフォーマーとクライアントセットにより、開発者はコントローラーを作成し、すべての Istio カスタムリソース定義 (CRD) に対して作成、読み取り、更新、削除 (CRUD) 操作を簡単に行うことができます。

これは、Aspen Mesh および Knative プロジェクトによって生成されたクライアントに対する機能リクエストから明らかなように、多くの Istio ユーザーから非常に要望の多かった機能でした。現在、上記のクライアントのいずれかを使用している場合は、次のように 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 リポジトリは、クライアントリポジトリが API 定義に依存しているため、Istio API リポジトリと同じブランチ戦略に従います。安定したクライアントセットを使用したい場合は、client go リポジトリのリリースブランチまたはタグ付きバージョンを使用できます。クライアントセットの使用は、Kubernetes client go の使用と非常によく似ています。以下は、クライアントを使用して渡された名前空間内のすべての Istio virtual service を一覧表示する簡単な例です。

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 クライアントセットを生成しようとする場合に直面する可能性のある 3 つの大きな課題があります。

新しくリリースされたクライアントライブラリにより、ユーザーが Istio API の統合とコントローラーをさらに作成できるようになり、上記で説明したツールを開発者が Proto API から Kubernetes クライアントセットを生成するために使用できることを願っています。

この投稿を共有する