在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("回滚未执行,没有找到指定的版本")
				
通过kubernetes资源对象的升级、回滚、扩容、缩容可以了解到kubernetes版本升级、回滚的操作与docker swarm几乎是一样的。回滚操作只能回滚到上一个版本。 搭建私有仓库,使用镜像制作自定义镜像(三个版本),根据主页内容进行区分,将自定义镜像上传到私有仓库中 [root@master ~]# docker run -itd --name resqistry --restart always -p 5000:5000 registry:2 [root@master ~]# docker p
go实现业务回滚(defer妙用之一) 最近在用GO重写本组的OSS系统,需要实现业务的回滚功能(即一个流程中,先与A进行交互,然后再与B进行交互,如果B失败了,回滚与A交互的逻辑这样)。另外,在初始化的时候也经常需要在任何一个模块初始化失败的时候回滚其他模块 太长不看版defer是延时调用函数,在函数退出之时会进行调用,而且defer函数的调用顺序也是先调用的后执行,故defer其功能上就比较
darwin- Go 实现的数据库 schema 演进库 goose- 数据库迁移工具。可通过创建增量 SQL 或 Go 脚本来管理数据库的演变 gormigrate- Gorm ORM 的数据库迁移助手 migrate- Go 实现的数据库...
// 发布/回滚/滚动升级 公共方法 func HandlePRR(c *gin.Context, timesince time.Time, action, virtual_name, skyeye, workid string, fn func(*lcmongo.Program, lcmongo.Spec, chan error, string)) { // 更新数据库 发布时间/滚动升级...
git clone https://github.com/kubernetes/kubernetes.git cd $GOPATH/src/k8s.io/kubernetes git checkout -b release-1.14 remotes/origin/release-1.14 安装代码统计工具 yum install cloc 构建k8s makeormakeall本地构建 makerelease or make quick-releas...
更新Deployment资源时,pod状态为Pending,使用delete命令是删不掉Pending的pod的,因为Deployment会无限创建,这时候需要用到Deployment的回滚功能 如下我更改了Deployment/Jenkins,但新创建的pod因为资源不足无法创建而处于pending状态: $ kd get pod -n cicd NAME READY STATUS RESTARTS AGE jenkins-5b688d
学习笔记: Deployment具备升级的功能,允许我们在运行过程中升级Deployment到新的运行版本,与之对应的是,在某些情况下(比如新的Deployment不稳定时)可能需要将Deployment回滚到旧版本。 在默认情况下,所有Deployment的发布历史都被保留在系统中,以便我们随时进行回滚。 值得注意的是,只有在Depl...
完成了client-go gin的简单整合九-Create的namespace deployment pod的 创建操作,现在进行一下update修改的操作!关于namespace,我们用的最多的标签是name 和labels(恩前面我还做过配额的例子,这里就简单的拿labels为例了) 如果去update修改namespace我们常用的应该是修改namespace的labels,以zhangpeng namespace为例,我想增加一个name=abcd的标签 /src/service/Namespac
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" //"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" func main() { configPath := "C:\\Users\\a
在使用mybatis-plus进行事务回滚时,需要注意以下几点: 1. 确保你的mybatis-plus版本是高于2021年下半年的版本,因为在高版本中,mybatis-plus已经实现了多数据源事务的统一提交和回滚管理。 2. 在使用mybatis-plus时,部分配置项的名称可能与mybatis有所不同,需要注意调整配置项的名称。 3. 当需要实现多数据源的事务支持时,mybatis-plus已经将相关功能集成到spring框架中,因此简化了多数据源切换和事务的回滚提交操作。 4. 如果你使用的是旧版本的mybatis-plus,那么你需要自己实现多数据源切换和事务的回滚提交等操作,相对来说比较麻烦。 综上所述,使用mybatis-plus进行事务回滚相对简单,特别是在高版本中已经实现了多数据源事务的统一管理。具体的实现细节可以参考相关文档或官方指南。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [解决seata和mybatis-plus事物不回滚问题](https://blog.csdn.net/dxcll/article/details/124132317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [多数据源事务集成-mybatis-plus](https://blog.csdn.net/u013309797/article/details/121968596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]