您现在的位置是:首页 > 云原生 > Kubernetes > 正文
Kubernetes
apps/v1版本下使用client-go实现kubernetes回滚的方法
在extensions/v1beta1版本下,client-go的api接口下的deployment支持rollback方法来回滚,使用方法如下:
...
rollback := &v1beta1.DeploymentRollback{
Name: name,
RollbackTo: v1beta1.RollbackConfig{
Revision: 0,
},
}
if err = client.ExtensionsV1beta1().Deployments(namespace).Rollback(rollback); err != nil {
return
}但在最新的apps/v1版本下,这个rollback方法被移除了,查了一下资料,找到如下说明:
https://github.com/kubernetes/kubernetes/pull/59970#discussion_r169921531
这里说回滚需要自己来实现,实现思路如下:

大致意思如下:
列出当前deployment的rs
找到指定版本的rs
将指定版本的rs的template赋值给deployment的template来进行deployment的update操作实现回滚
按照这个思路实现代码如下:
package main
import (
"context"
"fmt"
"log"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
var (
err error
conf *rest.Config
client *kubernetes.Clientset
)
if conf, err = clientcmd.BuildConfigFromFlags("", "/Users/5bug/.kube/config"); err != nil {
log.Println("BuildConfigFromFlags", err)
return
}
if client, err = kubernetes.NewForConfig(conf); err != nil {
log.Println("NewForConfig", err)
return
}
namespace := "default"
deploymentName := "k8s-demo"
labelSelector := fmt.Sprintf("app=%s", deploymentName)
replicaSetList, err := client.AppsV1().ReplicaSets(namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: labelSelector})
if err != nil {
return
}
if len(replicaSetList.Items) <= 1 {
fmt.Println("回滚未执行,没有可回滚的版本")
return
}
deployment, err := client.AppsV1().Deployments(namespace).Get(context.TODO(), deploymentName, metav1.GetOptions{})
if err != nil {
return
}
// 回滚到此版本k8s-demo-5b65566549
rs := "k8s-demo-5b65566549"
for _, v := range replicaSetList.Items {
if v.ObjectMeta.Name == rs {
deployment.Spec.Template = v.Spec.Template
if _, err = client.AppsV1().Deployments(namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}); err != nil {
return
}
fmt.Println("回滚已执行")
return
}
}
fmt.Println("回滚未执行,没有找到指定的版本")
}完整的代码请看:https://github.com/5bug/one-cd
相关文章
- 在Kubernetes里使用openkruise实现服务原地升级功能
- 吾八哥学k8s(十一):kubernetes里Pod的调度机制
- 吾八哥学k8s(十):kubernetes里Service和Ingress
- kubernetes中服务自定义Prometheus的metrics的方法
- k8s集群安装Prometheus监控以及Grafana面板的方法
- kubernetes集群证书过期的解决方法
- kubelet启动失败报failed to find cgroups of kubelet的解决方法
- 吾八哥学k8s(九):kubernetes里持久化存储
- macOs和Linux环境下kubectl命令自动补齐的方法
- 吾八哥学k8s(八):kubernetes里Secret的用法