使用client-go API回滚部署。

huangapple go评论111阅读模式
英文:

Rollback the deployment using client-go api

问题

我想使用k8s的client-go库将部署回滚到特定的修订版本(回滚历史记录)。但是到目前为止,我还没有找到解决方案。我只能获取资源修订版本,而无法获取使用kubectl命令获取的“部署修订版本”。

以下是使用client-go API的代码:

  1. config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  2. clientset, err := kubernetes.NewForConfig(config)
  3. dp, err := clientset.ExtensionsV1beta1Client.Deployments("default").Get("nginx-deployment", metav1.GetOptions{})

使用client-go API:
如何获取给定部署的现有修订版本?我想要将部署回滚到使用该修订版本。有人可以告诉我应该如何做吗?

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

  1. [[constraint]]
  2. name = "k8s.io/client-go"
  3. version = "3.0.0"
  4. [[override]]
  5. name = "k8s.io/apimachinery"
  6. branch = "release-1.6"

提前谢谢。

英文:

I would like to roll back the deployment to a certain revision( rollout history) using client-go library of k8s. But so far I havent found a solution. I could onyl fetch resource revision but not 'deployment revision' that I get using kebctl

  1. kubectl rollout history deployment/nginx_dep

Here is the code using client-go api :

  1. config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  2. clientset, err := kubernetes.NewForConfig(config)
  3. dp, err := clientset.ExtensionsV1beta1Client.Deployments("default").Get("nginx-deployment", metav1.GetOptions{})

Using client-go api:
How do I get the existing revision for the given deployment.? I want to roll back the deployment to use this revision. Can anyone tell me how I should do that??

Here is the list of dependecies in my project:

  1. [[constraint]]
  2. name = "k8s.io/client-go"
  3. version = "3.0.0"
  4. [[override]]
  5. name = "k8s.io/apimachinery"
  6. branch = "release-1.6"

Thank you in advance

答案1

得分: 1

假设你已经查看了更新示例

无论如何,这里的dp变量包含了你所需的所有内容:

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

所以,dp的类型是v1beta1.Deployment,它包含了一个类型为metav1.ObjectMeta的变量,其中包含了ResourceVersion

英文:

Assuming you already had a look at the update example?

In any case, the dp variable here contains all you need:

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

So dp is of type v1beta1.Deployment which contains a variable of type metav1.ObjectMeta which has the ResourceVersion.

答案2

得分: 0

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"]

英文:
  1. clientset, err := kubernetes.NewForConfig(config)
  2. deploymentsClient := clientset.AppsV1().Deployments("yournamespace")
  3. result, err := deploymentsClient.Get("yourdeployment", metav1.GetOptions{})
  4. version := result.GetObjectMeta().GetAnnotations()["deployment.kubernetes.io/revision"]

答案3

得分: 0

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

  1. import (
  2. "fmt"
  3. "github.com/golang/glog"
  4. "k8s.io/api/core/v1"
  5. extensions "k8s.io/api/extensions/v1beta1"
  6. "k8s.io/apimachinery/pkg/types"
  7. deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
  8. )
  9. func (un *Uninject) rollbackToTemplate(d *v1.Deployment, rs []v1.ReplicaSet) (bool, error) {
  10. sort.Slice(rs, func(i, j int) bool {
  11. return rs[i].CreationTimestamp.UnixNano() > rs[j].CreationTimestamp.UnixNano()
  12. })
  13. performedRollback := false
  14. replicaSet := v1.ReplicaSet{}
  15. for _, r := range rs {
  16. for _, initContainer := range r.Spec.Template.Spec.InitContainers {
  17. if initContainer.Name == "istio-init" {
  18. performedRollback = true
  19. break
  20. } else {
  21. klog.V(4).Infof("Rolling back to a revision that contains the same template as current deployment %q, skipping rollback...", d.Name)
  22. }
  23. }
  24. if len(r.Spec.Template.Spec.InitContainers) == 0 || !performedRollback {
  25. replicaSet = r
  26. performedRollback = true
  27. break
  28. }
  29. }
  30. if performedRollback {
  31. klog.V(4).Infof("Rolling back deployment %q to template spec %+v", d.Name, replicaSet.Spec.Template.Spec)
  32. deploymentutil.SetFromReplicaSetTemplate(d, replicaSet.Spec.Template)
  33. deploymentutil.SetDeploymentAnnotationsTo(d, &replicaSet)
  34. }
  35. return performedRollback, un.updateDeploymentAndClearRollbackTo(d)
  36. }
  37. // updateDeploymentAndClearRollbackTo sets .spec.rollbackTo to nil and update the input deployment
  38. // It is assumed that the caller will have updated the deployment template appropriately (in case
  39. // we want to rollback).
  40. func (un *Uninject) updateDeploymentAndClearRollbackTo(d *v1.Deployment) error {
  41. klog.Infof("Cleans up rollbackTo of deployment %q", d.Name)
  42. _, err := un.clientSet.AppsV1().Deployments(d.Namespace).Update(context.TODO(), d, metav1.UpdateOptions{})
  43. return err
  44. }
英文:

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

  1. import (
  2. "fmt"
  3. "github.com/golang/glog"
  4. "k8s.io/api/core/v1"
  5. extensions "k8s.io/api/extensions/v1beta1"
  6. "k8s.io/apimachinery/pkg/types"
  7. deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
  8. )
  9. func (un *Uninject) rollbackToTemplate(d *v1.Deployment, rs []v1.ReplicaSet) (bool, error) {
  10. sort.Slice(rs, func(i, j int) bool {
  11. return rs[i].CreationTimestamp.UnixNano() > rs[j].CreationTimestamp.UnixNano()
  12. })
  13. performedRollback := false
  14. replicaSet := v1.ReplicaSet{}
  15. for _, r := range rs {
  16. for _, initContainer := range r.Spec.Template.Spec.InitContainers {
  17. if initContainer.Name == "istio-init" {
  18. performedRollback = true
  19. break
  20. } else {
  21. klog.V(4).Infof("Rolling back to a revision that contains the same template as current deployment %q, skipping rollback...", d.Name)
  22. }
  23. }
  24. if len(r.Spec.Template.Spec.InitContainers) == 0 || !performedRollback {
  25. replicaSet = r
  26. performedRollback = true
  27. break
  28. }
  29. }
  30. if performedRollback {
  31. klog.V(4).Infof("Rolling back deployment %q to template spec %+v", d.Name, replicaSet.Spec.Template.Spec)
  32. deploymentutil.SetFromReplicaSetTemplate(d, replicaSet.Spec.Template)
  33. deploymentutil.SetDeploymentAnnotationsTo(d, &replicaSet)
  34. }
  35. return performedRollback, un.updateDeploymentAndClearRollbackTo(d)
  36. }
  37. // updateDeploymentAndClearRollbackTo sets .spec.rollbackTo to nil and update the input deployment
  38. // It is assumed that the caller will have updated the deployment template appropriately (in case
  39. // we want to rollback).
  40. func (un *Uninject) updateDeploymentAndClearRollbackTo(d *v1.Deployment) error {
  41. klog.Infof("Cleans up rollbackTo of deployment %q", d.Name)
  42. _, err := un.clientSet.AppsV1().Deployments(d.Namespace).Update(context.TODO(), d, metav1.UpdateOptions{})
  43. return err
  44. }

huangapple
  • 本文由 发表于 2017年8月11日 20:04:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/45634812.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定