Skip to main content

Go 客户端

如果你需要在一个 Golang 项目中对 Agents 的资源(如 SandboxClaim、Sandbox 等)进行 create/get/update/delete 操作,或者通过 informer 进行 list-watch,你需要使用支持 Agents 的客户端。

你需要在你的项目中引入 agents-api 仓库,它包含了 Agents 的 schema 定义以及 clientset 等工具。

使用方式

首先,在你的 go.mod 中引入 agents-api 依赖:

require github.com/openkruise/agents-api v0.1.0

然后,你可以直接使用 agents-api 提供的 clientset 来操作 Agents 资源。

完整示例

以下是一个完整的示例,展示了如何创建 SandboxClaim、等待其就绪并列出分配的 Sandbox。更多关于创建沙箱的基本操作,请参考 README

package main

import (
"context"
"flag"
"fmt"
"path/filepath"
"time"

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

appsv1alpha1 "github.com/openkruise/agents-api/agents/v1alpha1"
kruiseclient "github.com/openkruise/agents-api/client/clientset/versioned"
)

func main() {
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()

config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err)
}

clientset, err := kruiseclient.NewForConfig(config)
if err != nil {
panic(err)
}

claim := appsv1alpha1.SandboxClaim{
ObjectMeta: metav1.ObjectMeta{
GenerateName: "demo",
},

Spec: appsv1alpha1.SandboxClaimSpec{
Replicas: int32Ptr(2),
TemplateName: "demo",
},
}
result, err := clientset.AgentsV1alpha1().
SandboxClaims("demo").
Create(context.TODO(), &claim, metav1.CreateOptions{})
if err != nil {
panic(err)
}
fmt.Printf("Created sandboxclaim %q.\n", result.GetObjectMeta().GetName())

// wait for sandboxclaim
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
defer cancel()

err = wait.PollUntilContextTimeout(ctx, time.Second, 1*time.Minute, true, func(ctx context.Context) (done bool, err error) {
updated, err := clientset.AgentsV1alpha1().SandboxClaims("demo").Get(ctx, result.Name, metav1.GetOptions{})
if updated.Status.Phase != appsv1alpha1.SandboxClaimPhaseCompleted {
return false, nil
}

if claim.Spec.Replicas != nil && updated.Status.ClaimedReplicas != *claim.Spec.Replicas {
return true, fmt.Errorf("partial claimed")
} else if updated.Status.ClaimedReplicas == 0 {
return true, fmt.Errorf("none claimed")
}
return true, nil
})

if err != nil {
panic(err)
}

// List claimed sandboxes
fmt.Printf("Listing sandboxes in namespace %q:\n", "demo")
list, err := clientset.AgentsV1alpha1().
Sandboxes("demo").
List(context.TODO(), metav1.ListOptions{
LabelSelector: fmt.Sprintf("agents.kruise.io/claim-name=%v", result.Name),
})
if err != nil {
panic(err)
}
for _, d := range list.Items {
fmt.Printf(" claimed sandboxes %s/%s\n", d.Namespace, d.Name)
}
}

func int32Ptr(i int32) *int32 { return &i }