相关文章推荐

热门标签排行

  • 吾八哥学Python 1 (19)
  • 吾八哥学golang 2 (11)
  • 吾八哥学k8s 3 (11)
  • golang学习 4 (10)
  • 吾八哥学Selenium 5 (6)
  • 微笔记 6 (6)
  • Selenium学习 7 (5)
  • 吾八哥学Pywinauto 8 (4)
  • Docker 9 (4)
  • UI自动化测试 10 (4)
  • 网友热搜词排行

  • 1 gitlab
  • 2 kubernetes
  • 3 golang
  • 4 python
  • 吾八哥 2020-05-05 Kubernetes 5138

    在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

    这里说回滚需要自己来实现,实现思路如下:

    1588686320814.jpg

    大致意思如下:

    1. 列出当前deployment的rs

    2. 找到指定版本的rs

    3. 将指定版本的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

    转载请说明来源于"www.5bug.wang"

    本文地址: https://5bug.wang/post/106.html

  • 在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的用法
  •  
    推荐文章