clientset客户端

clientset客户端,第1张

1. clientSet

RESTClient 是一种最基础的客户端,使用时需要指定 Resource 和 Version 等信息,编写代码时需要提前知道 Resource所在的 Group 和对应的 Version 信息。相比 RESTClient,ClientSet 使用起来更加便捷,一般情况下,开发者对Kubernetes 进行二次开发时通常使用 ClientSet 。
ClientSet 在 RESTClient 的基础上封装了对 Resource 和 Version 的管理方法。每一个 Resource 可以理解为一个客户端,而 ClientSet 则是多个客户端的集合,每一个 Resource 和 Version 都以函数的方式暴露给开发者,例如,ClientSet 提供的 RbacV1 、 CoreV1 、 NetworkingV1 等接口函数。
注意: ClientSet 仅能访问 Kubernetes 自身内置的资源(即客户端集合内的资源),不能直接访问 CRD 自定义资源。如果需要 ClientSet 访问 CRD 自定义资源,可以通过 client-gen 代码生成器重新生成 ClientSet ,在 ClientSet 集合中自动生成与 CRD *** 作相关的接口,这一部分后期通过kubebuilder生成。

2. kubernetes资源

在平时通过client-go去 *** 作一个kubernetes的内部资源的时候,怎么组装这个请求,这个资源咋什么package中,最开始都是很迷的,这样需要先对k8s里面的数据结构有一定了解

在 Kubernetes 庞大而复杂的系统中,只有资源是远远不够的, Kubernetes 将资源再次分组和版本化,形成 Group (资源组)、Version (资源版本)、 Resource (资源)

2.1 三大数据结构
  • Group :被称为资源组,在 Kubernetes API Server 中也可称其为APIGroup。
  • Version :被称为资源版本,在 Kubernetes API Server 中也可称其为 APIVersions 。
  • Resource :被称为资源,在 Kubernetes API Server 中也可称其为 APIResource 。
  • Kind :资源种类,描述 Resource 的种类,与 Resource 为同一级别。

Kubernetes 系统支持多个 Group ,每个 Group 支持多个 Version ,每个 Version 支持多个 Resource ,其中部分资源同时会拥有自己的子资源(即 SubResource )。例如, Deployment 资源拥有 Status 子资源。资源组、资源版本、资源、子资源的完整表现形式为 ///。以常用的 Deployment 资源为例,其完整表现形式为 apps/v1/deployments/status,至于怎么知道deploy属于apps这个group可以参考:

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#-strong-api-overview-strong-
2.2 内部资源和外部资源

Kubernetes 资源也可分为两种,分别是 Kubernetes Resource(Kubernetes 内置资源)和 Custom Resource (自定义资源)。开发者通过CRD (即 Custom Resource Definitions )可实现自定义资源,它允许用户将自己定义的资源添加到 Kubernetes 系统中,并像使用Kubernetes 内置资源一样使用它们。

3. clientset创建deploy

需求:通过clientset调用内部资源,创建deployment。
https://github.com/ylinyang/b_demo/tree/master/clientCreateDeploy

3.1 package
import (
    "context"
    "log"

    appsv1 "k8s.io/api/apps/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/clientcmd"
)
3.2 获取kubeconfig配置文件
// 1. 获取kubeconfig文件
    config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
    if err != nil {
        inClusterConfig, err := rest.InClusterConfig()
        if err != nil {
            log.Panicln(err)
        }
        config = inClusterConfig
    }
3.3 实例化客户端
// 2. 创建clientset客户端
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        log.Panicln(err)
    }
3.4 创建deploy
// 3. 创建deploy
    ns := "default"
    deploy := &appsv1.Deployment{}
    _, err = clientset.AppsV1().Deployments(ns).Create(context.TODO(), deploy, metav1.CreateOptions{})
    if err != nil {
        log.Panicln("create deploy failed -- ", err)
    }

通过clientset去调用内部资源的时都遵循GVK的原则,针对每一种资源类型都有很多方法,源码如下:

type DeploymentInterface interface {
	Create(ctx context.Context, deployment *v1.Deployment, opts metav1.CreateOptions) (*v1.Deployment, error)
	Update(ctx context.Context, deployment *v1.Deployment, opts metav1.UpdateOptions) (*v1.Deployment, error)
	UpdateStatus(ctx context.Context, deployment *v1.Deployment, opts metav1.UpdateOptions) (*v1.Deployment, error)
	Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error
	DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error
	Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Deployment, error)
	List(ctx context.Context, opts metav1.ListOptions) (*v1.DeploymentList, error)
	Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error)
	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Deployment, err error)
	Apply(ctx context.Context, deployment *appsv1.DeploymentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Deployment, err error)
	ApplyStatus(ctx context.Context, deployment *appsv1.DeploymentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Deployment, err error)
	GetScale(ctx context.Context, deploymentName string, options metav1.GetOptions) (*autoscalingv1.Scale, error)
	UpdateScale(ctx context.Context, deploymentName string, scale *autoscalingv1.Scale, opts metav1.UpdateOptions) (*autoscalingv1.Scale, error)
	ApplyScale(ctx context.Context, deploymentName string, scale *applyconfigurationsautoscalingv1.ScaleApplyConfiguration, opts metav1.ApplyOptions) (*autoscalingv1.Scale, error)

	DeploymentExpansion
}

而我们需要关心得是deploy := &appsv1.Deployment{},这个最终决定deploy长啥样的。

# 实现该结构体即可,可以找一个yaml文件,或者参考api文档   
deploy := &appsv1.Deployment{
        TypeMeta:   metav1.TypeMeta{},
        ObjectMeta: metav1.ObjectMeta{},
        Spec:       appsv1.DeploymentSpec{},
        Status:     appsv1.DeploymentStatus{},
}
# 成品
    ns := "default"
    labels := map[string]string{"app": "nginx"}
    deploy := &appsv1.Deployment{
        TypeMeta: metav1.TypeMeta{},
        ObjectMeta: metav1.ObjectMeta{
            Namespace: ns,
            Name:      "nginx",
        },
        Spec: appsv1.DeploymentSpec{
            Selector: &metav1.LabelSelector{
                MatchLabels: labels,
            },
            Template: corev1.PodTemplateSpec{
                ObjectMeta: metav1.ObjectMeta{
                    Labels: labels,
                },
                Spec: corev1.PodSpec{
                    Containers: []corev1.Container{{
                        Name:  "nginx-demo",
                        Image: "nginx",
                    }},
                },
            },
        },
        Status: appsv1.DeploymentStatus{},
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/905610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-15
下一篇 2022-05-15

发表评论

登录后才能评论

评论列表(0条)

保存