【问题标题】:Rollback the deployment using client-go api使用 client-go api 回滚部署
【发布时间】:2018-01-19 22:45:49
【问题描述】:

我想使用 k8s 的 client-go 库将部署回滚到某个修订版(推出历史记录)。但到目前为止,我还没有找到解决方案。我只能获取资源修订版,但不能获取使用 kebctl 获得的“部署修订版”

kubectl rollout history deployment/nginx_dep

这里是使用 client-go api 的代码:

config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)

clientset, err := kubernetes.NewForConfig(config)

dp, err := clientset.ExtensionsV1beta1Client.Deployments("default").Get("nginx-deployment", metav1.GetOptions{})

使用 client-go api: 如何获取给定部署的现有修订版。?我想回滚部署以使用此修订版。谁能告诉我该怎么做??

这是我项目中的依赖项列表:

[[constraint]]
  name = "k8s.io/client-go"
  version = "3.0.0"

[[override]]
  name = "k8s.io/apimachinery"
  branch = "release-1.6"

提前谢谢你

【问题讨论】:

    标签: go kubernetes kubectl kubernetes-go-client


    【解决方案1】:

    假设您已经看过update example

    无论如何,这里的dp 变量包含了你所需要的一切:

    dp, err := clientset.ExtensionsV1beta1Client.Deployments("default").Get("nginx-deployment", metav1.GetOptions{})
    

    所以dpv1beta1.Deployment 类型,其中包含metav1.ObjectMeta 类型的变量,该变量具有ResourceVersion

    【讨论】:

    • 谢谢!!想通了 - > fmt.Println(dp.GetObjectMeta().GetAnnotations()["deployment.kubernetes.io/revision"]) 就是我在看的东西。
    • 不客气。与其感谢我,不如将答案标记为正确,点赞或自己回答正确的答案。这就是它应该在这里工作的方式;)
    【解决方案2】:
    clientset, err := kubernetes.NewForConfig(config)
    deploymentsClient := clientset.AppsV1().Deployments("yournamespace")
    result, err := deploymentsClient.Get("yourdeployment", metav1.GetOptions{})
    version := result.GetObjectMeta().GetAnnotations()["deployment.kubernetes.io/revision"]
    

    【讨论】:

      【解决方案3】:

      试试试试 https://github.com/kubernetes/kubernetes/blob/17fec00b8915dbffac40b9eb481516a66092ef3e/pkg/controller/deployment/rollback.go#L30-L69

      
      import (
          "fmt"
      
          "github.com/golang/glog"
      
          "k8s.io/api/core/v1"
          extensions "k8s.io/api/extensions/v1beta1"
          "k8s.io/apimachinery/pkg/types"
          deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
      )
      
      
      
      func (un *Uninject) rollbackToTemplate(d *v1.Deployment, rs []v1.ReplicaSet) (bool, error) {
      
          sort.Slice(rs, func(i, j int) bool {
              return rs[i].CreationTimestamp.UnixNano() > rs[j].CreationTimestamp.UnixNano()
      
          })
          performedRollback := false
          replicaSet := v1.ReplicaSet{}
          for _, r := range rs {
              for _, initContainer := range r.Spec.Template.Spec.InitContainers {
                  if initContainer.Name == "istio-init" {
                      performedRollback = true
                      break
                  } else {
                      klog.V(4).Infof("Rolling back to a revision that contains the same template as current deployment %q, skipping rollback...", d.Name)
                  }
              }
              if len(r.Spec.Template.Spec.InitContainers) == 0 || !performedRollback {
                  replicaSet = r
                  performedRollback = true
                  break
              }
          }
          if performedRollback {
              klog.V(4).Infof("Rolling back deployment %q to template spec %+v", d.Name, replicaSet.Spec.Template.Spec)
              deploymentutil.SetFromReplicaSetTemplate(d, replicaSet.Spec.Template)
              deploymentutil.SetDeploymentAnnotationsTo(d, &replicaSet)
          }
          return performedRollback, un.updateDeploymentAndClearRollbackTo(d)
      }
      
      // updateDeploymentAndClearRollbackTo sets .spec.rollbackTo to nil and update the input deployment
      // It is assumed that the caller will have updated the deployment template appropriately (in case
      // we want to rollback).
      func (un *Uninject) updateDeploymentAndClearRollbackTo(d *v1.Deployment) error {
          klog.Infof("Cleans up rollbackTo of deployment %q", d.Name)
          _, err := un.clientSet.AppsV1().Deployments(d.Namespace).Update(context.TODO(), d, metav1.UpdateOptions{})
          return err
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 2020-11-18
        • 2020-08-03
        • 1970-01-01
        • 2023-04-08
        • 2021-08-01
        • 2020-11-09
        相关资源
        最近更新 更多