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生成。
在平时通过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创建deploy3.1 package需求:通过clientset调用内部资源,创建deployment。
https://github.com/ylinyang/b_demo/tree/master/clientCreateDeploy
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{},
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)