热门标签排行
吾八哥学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
4966
在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
转载请说明来源于"www.5bug.wang"
本文地址:
https://www.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的用法