将batch/v1beta1版本cronjob转换为batch/v1版本

1.代码

  • 首先建立与Kubernetes集群的连接
  • 然后获取v1beta1版本的CronJob对象。
  • 接下来,使用 runtime.DefaultUnstructuredConverter 将该对象转换为unstructured对象,并使用schema.ConvertToVersion()将其转换为集群内部版本的对象。
  • 然后,再次使用schema.ConvertToVersion()将集群内部版本的对象转换为新版本的对象。
  • 最后,使用runtime.DefaultUnstructuredConverter将新版本的对象转换为具体的CronJob对象,并将其保存到新版本的 Kubernetes集群中。
import (
    "context"
    "fmt"
    "k8s.io/apimachinery/pkg/api/meta"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/kubernetes/scheme"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/kubernetes/pkg/apis/batch"
)

func main() {
    // 建立与Kubernetes集群的连接
    config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
    if err != nil {
        panic(err.Error())
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }

    // 获取v1beta1版本的CronJob对象
    cronJobBeta, err := clientset.BatchV1beta1().CronJobs("namespace").Get(context.TODO(), "cronjob-name", metav1.GetOptions{})
    if err != nil {
        panic(err.Error())
    }

    // 将v1beta1版本的CronJob对象转换为集群内部版本
    internalVersion := metav1.SchemeGroupVersion
    converter := runtime.DefaultUnstructuredConverter
    internalObj, err := converter.ToUnstructured(&cronJobBeta)
    if err != nil {
        panic(err.Error())
    }
    // schema是一个用于处理API对象的包。它提供了一些函数和类型,用于处理和转换不同版本的API对象
    //使用schema包中的这些函数可以方便地进行不同版本的API对象之间的转换。
    //使用schema进行对象转换之前,通常需要先注册资源对象。注册资源对象是为了确保schema能够正确地识别和处理特定的API对象
    //在使用不同版本的Kubernetes API时,需要处理特定版本的资源对象,而这些对象没有自动注册到默认的scheme中,所以需要手动注册这些特定版本的资源对象
    //手动注册资源对象的过程通常涉及到使用schema包中的AddToScheme函数将资源对象添加到runtime.Scheme中。这样,schema就能够识别和处理这些资源对象了
    internalObj, err = schema.ConvertToVersion(internalObj, internalVersion)
    if err != nil {
        panic(err.Error())
    }

    // 将集群内部版本的CronJob对象转换为新版本
    newVersion := batch.SchemeGroupVersion
    newObj, err := schema.ConvertToVersion(internalObj, newVersion)
    if err != nil {
        panic(err.Error())
    }

    // 创建新版本的CronJob对象
    newCronJob := &batch.CronJob{}
    err = converter.FromUnstructured(newObj, newCronJob)
    if err != nil {
        panic(err.Error())
    }

    // 将新版本的CronJob对象保存到Kubernetes集群
    _, err = clientset.BatchV1().CronJobs("namespace").Create(context.TODO(), newCronJob, metav1.CreateOptions{})
    if err != nil {
        panic(err.Error())
    }

    fmt.Println("CronJob converted and created successfully!")
}


// 下面是核心代码
type VersionConverter struct{
    scheme *runtime.Scheme
    cf serializer.CodecFactory
    discovery discovery.DiscoverInterface
    clusterInfo *version.Info
    RestMapper meta.RESTMapper
}

scheme := runtime.NewCheme()
admission.Install(scheme)
admissionregistration.Install(scheme)
apps.Install(scheme)
apiserverinternal.Install(scheme)
batch.Install(scheme)
core.Install(scheme)
events.Install(scheme)
extensions.Install(scheme)
imagepolicy.Install(scheme)
node.Install(scheme)
policy.Install(scheme)
authorization.Install(scheme)
authentication.Install(scheme)
certificates.Install(scheme)
rbac.Install(scheme)
scheduling.Install(scheme)
storage.Install(scheme)
apiextensions.Install(scheme)
autoscaling.Install(scheme)

info,_ := k8sClient.Discovery().ServerVersion()

// 创建一个包含所有已知类型的 RESTMapper 对象。RESTMapper 用于将 API组、版本和资源类型映射到对应的REST存储器,以便客户端在与 Kubernetes API 交互时确定正确的 URL 路径。通过将所有已知的 GroupVersionKind 添加到 mapper 中,我们可以确保客户端可以正确地处理所有已知类型的资源
mapper := meta.NewDefaultRESTMapper(scheme.PrioritizedVersionsAllGroups())
for gvk := range scheme.AllKnownTypes{
    mapper.Add(gvk,nil)
}

versionConverter := &VersionConverter{
    scheme: scheme,
    cf:serializer.NewCodecFactory(scheme),
    clusterInfo:info,
    discovery:k8sClient.DiscoveryClient,
    RestMapper:mapper
}

internalObj,_ := versionConverter.schema.ConvertToVersion(oldObj, runtime.InternalGroupVersioner)
newObj,_ := versionConverter.schema.ConvertToVersion(internalObj, newObj)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值