• k8s之client-go和ctrl的各种k8s client


    一、获取kubeconfig

    1. config, err := clientcmd.BuildConfigFromFlags("", "/mnt/f/vela/config")
    2. //config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
    3. if err != nil {
    4. panic(err)
    5. }

    二、client-go

    1、client-go rest client, 没有使用informer, 直接访问kube-apiserver

    1. httpClient, err := rest.HTTPClientFor(config)
    2. if err != nil {
    3. return
    4. }
    5. configShadow := *config
    6. configShadow.GroupVersion = &appsv1.SchemeGroupVersion
    7. configShadow.APIPath = "/apis"
    8. configShadow.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
    9. configShadow.UserAgent = rest.DefaultKubernetesUserAgent()
    10. restClient, err := rest.RESTClientForConfigAndClient(&configShadow, httpClient)
    11. if err != nil {
    12. return
    13. }
    14. restDeploy := new(appsv1.Deployment)
    15. getOpts := new(metav1.GetOptions)
    16. err = restClient.Get().
    17. Namespace("vela-system").
    18. Resource("deployments").
    19. Name("kubevela-vela-core").
    20. VersionedParams(getOpts, scheme.ParameterCodec).Do(context.TODO()).Into(restDeploy)
    21. if err != nil {
    22. return
    23. }
    24. fmt.Println(restDeploy)

    2、client-go clientset, 没有使用informer, 直接访问kube-apiserver

    1. clientset, err := kubernetes.NewForConfig(config)
    2. if err != nil {
    3. panic(err)
    4. }
    5. clientsetDeploy := new(appsv1.Deployment)
    6. clientsetDeploy, err = clientset.AppsV1().Deployments("vela-system").
    7. Get(context.TODO(), "kubevela-vela-core", metav1.GetOptions{})
    8. if err != nil {
    9. return
    10. }
    11. fmt.Println(clientsetDeploy)

    3、client-go dynamic client, 没有使用informer, 直接访问kube-apiserver

    1. dynamicClient, err := dynamic.NewForConfig(config)
    2. if err != nil {
    3. return
    4. }
    5. unDeploy := new(unstructured.Unstructured)
    6. unDeploy, err = dynamicClient.Resource(schema.GroupVersionResource{
    7. Group: appsv1.GroupName,
    8. Version: appsv1.SchemeGroupVersion.Version,
    9. Resource: "deployments"}).Namespace("vela-system").Get(context.TODO(), "kubevela-vela-core", metav1.GetOptions{})
    10. if err != nil {
    11. return
    12. }
    13. fmt.Println(unDeploy)

    三、ctrl/pkg/client

    包含 typedClient, unstructuredClient, metadataClient等,利用ctrl获取kube client。

    1. ctrlClient, err := client.New(config, client.Options{})
    2. if err != nil {
    3. return
    4. }

    1、ctrl typedClient 没有使用informer

    1. ctrlDeploy := new(appsv1.Deployment)
    2. err = ctrlClient.Get(context.TODO(), client.ObjectKey{Namespace: "vela-system", Name: "kubevela-vela-core"}, ctrlDeploy)
    3. if err != nil {
    4. return
    5. }
    6. fmt.Println(ctrlDeploy)

    2、ctrl unstructuredClient 没有使用informer

    1. unDeployy := new(unstructured.Unstructured)
    2. unDeployy.SetGroupVersionKind(schema.GroupVersionKind{
    3. Group: appsv1.GroupName,
    4. Version: appsv1.SchemeGroupVersion.Version,
    5. Kind: "Deployment"})
    6. err = ctrlClient.Get(context.TODO(), client.ObjectKey{Namespace: "vela-system", Name: "kubevela-vela-core"}, unDeployy)
    7. if err != nil {
    8. return
    9. }
    10. fmt.Println(unDeployy)

    3、ctrl metadataClient 没有informer, 只会返回metadata部分

    1. pom := new(metav1.PartialObjectMetadata)
    2. pom.SetGroupVersionKind(schema.GroupVersionKind{
    3. Group: appsv1.GroupName,
    4. Version: appsv1.SchemeGroupVersion.Version,
    5. Kind: "Deployment"})
    6. err = ctrlClient.Get(context.TODO(), client.ObjectKey{Namespace: "vela-system", Name: "kubevela-vela-core"}, pom)
    7. if err != nil {
    8. return
    9. }

    4、ctrl NamespacedClient, 没有informer, 所有请求都使用相同的ns

    1. namespacedDeploy := new(appsv1.Deployment)
    2. err = client.NewNamespacedClient(ctrlClient, "vela-system").Get(context.TODO(), types.NamespacedName{Name: "kubevela-vela-core"}, namespacedDeploy)
    3. if err != nil {
    4. return
    5. }
    6. fmt.Println(namespacedDeploy)

    5、ctrl NewDelegatingClient, 主动声明informer, get和list会走informer, update走k8s apiserver

    1. defer util_runtime.HandleCrash()
    2. informerCacheCtx, informerCacheCancel := context.WithCancel(context.Background())
    3. // GVK和资源go types的对应关系,资源的默认值函数,资源版本转换函数,资源的标签转换等等全部由 schema 维护
    4. k8sScheme := runtime.NewScheme()
    5. _ = scheme.AddToScheme(k8sScheme)
    6. _ = crdv1.AddToScheme(k8sScheme)
    7. // go types 和 k8s api的对印关系由 restmapper维护
    8. mapper, err := apiutil.NewDiscoveryRESTMapper(config)
    9. if err != nil {
    10. return
    11. }
    12. fiveMinute := 5 * time.Minute
    13. informerCache, err := crtl_cache.New(config, crtl_cache.Options{Scheme: k8sScheme, Mapper: mapper, Namespace: "vela-system", Resync: &fiveMinute})
    14. if err != nil {
    15. return
    16. }
    17. uncachedObjects := []client.Object{&corev1.ConfigMap{}, &corev1.Service{}}
    18. delegatingClient, delegatingClientErr := client.NewDelegatingClient(client.NewDelegatingClientInput{
    19. CacheReader: informerCache,
    20. Client: ctrlClient,
    21. UncachedObjects: uncachedObjects,
    22. })
    23. if delegatingClientErr != nil {
    24. return
    25. }
    26. go func(ctx context.Context) {
    27. defer util_runtime.HandleCrash()
    28. go informerCache.Start(informerCacheCtx)
    29. }(informerCacheCtx)
    30. label:
    31. waitForCacheSync := informerCache.WaitForCacheSync(context.TODO())
    32. if waitForCacheSync {
    33. delegatingDeploy := new(appsv1.Deployment)
    34. err = delegatingClient.Get(context.TODO(), client.ObjectKey{Namespace: "vela-system", Name: "kubevela-vela-core"}, delegatingDeploy)
    35. if err != nil {
    36. return
    37. }
    38. informerCacheCancel()
    39. fmt.Println(delegatingDeploy)
    40. } else {
    41. goto label
    42. }

    四、多集群client

    1、vela client,可以通过clustergateway 访问到子集群

    1. // vela client, 可以通过clustergateway 访问到子集群
    2. err = clients.SetKubeConfig(apiConfig.Config{
    3. KubeQPS: 50,
    4. KubeBurst: 300,
    5. })
    6. if err != nil {
    7. return
    8. }
    9. // 在secretMultiClusterRoundTripper.RoundTrip对req.URL.Path做了修改
    10. velaClient, err := clients.GetKubeClient()
    11. if err != nil {
    12. return
    13. }
    14. remoteCtx := context.WithValue(context.Background(), "ClusterName", "cluster01")
    15. velaDeploy := new(appsv1.Deployment)
    16. err = velaClient.Get(remoteCtx, client.ObjectKey{Namespace: "vela-system", Name: "kubevela-vela-core"}, velaDeploy)
    17. if err != nil {
    18. return
    19. }
    20. fmt.Println(velaDeploy)

  • 相关阅读:
    Selenium自动化测试框架工作原理你明白了吗?
    排队(单调队列+二分)
    全国职业技能大赛云计算--高职组赛题卷②(容器云)
    Red Hat 8 启动没有进入GUI图形界面
    Lvs +keepalivede : 高可用集群
    《nlp入门+实战:第五章:使用pytorch中的API实现线性回归》
    Serverless 的前世今生
    机器视觉公司怎么可能养我这闲人,连软件加密狗都用不起,项目都用盗版,为什么​?
    Python基础内容训练3(常用的数据类型-----列表)
    镜像的基本命令(docker)
  • 原文地址:https://blog.csdn.net/qq_34562093/article/details/126686416