精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何優雅重啟 Kubernetes 的 Pod

云計算 云原生
最近在升級服務網格 Istio,升級后有個必要的流程就是需要重啟數據面的所有的 Pod,也就是業務的 Pod,這樣才能將這些 Pod 的 sidecar 更新為新版本。

方案 1

因為我們不同環境的 Pod 數不少,不可能手動一個個重啟;之前也做過類似的操作:

kubectl delete --all pods --namespace=dev

這樣可以一鍵將 dev 這個命名空間下的 Pod 刪掉,kubernetes 之后會自動將這些 Pod 重啟,保證和應用的可用性。

但這有個大問題是對 kubernetes 的調度壓力較大,一般一個 namespace 下少說也是幾百個 Pod,全部需要重新調度啟動對 kubernetes 的負載會很高,稍有不慎就會有嚴重的后果。

所以當時我的第一版方案是遍歷所有的 deployment,刪除一個 Pod 后休眠 5 分鐘再刪下一個,偽代碼如下:

deployments, err := clientSet.AppsV1().Deployments(ns).List(ctx, metav1.ListOptions{})  
if err != nil {  
    return err  
}
for _, deployment := range deployments.Items {
 podList, err := clientSet.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{  
     LabelSelector: fmt.Sprintf("app=%s", deployment.Name),  
 })
 err = clientSet.CoreV1().Pods(pod.Namespace).Delete(ctx, pod.Name, metav1.DeleteOptions{})  
 if err != nil {  
     return err  
 }  
 log.Printf("    Pod %s rebuild success.\n", pod.Name)
 time.Sleep(time.Minute * 5) 
}

存在的問題

這個方案確實是簡單粗暴,但在測試的時候就發現了問題。

當某些業務只有一個 Pod 的時候,直接刪掉之后這個業務就掛了,沒有多余的副本可以提供服務了。

這肯定是不能接受的。

甚至還有刪除之后沒有重啟成功的:

  • 長期沒有重啟導致鏡像緩存沒有了,甚至鏡像已經被刪除了,這種根本就沒法啟動成功。
  • 也有一些 Pod 有 Init-Container 會在啟動的時候做一些事情,如果失敗了也是沒法啟動成功的。 總之就是有多種情況導致一個 Pod 無法正常啟動,這在線上就會直接導致生產問題,所以方案一肯定是不能用的。

方案二

為此我就準備了方案二:

image.png

  • 先將副本數+1,這是會新增一個 Pod,也會使用最新的 sidecar 鏡像。
  • 等待新建的 Pod 重啟成功。
  • 重啟成功后刪除原有的 Pod。
  • 再將副本數還原為之前的數量。

這樣可以將原有的 Pod 平滑的重啟,同時如果新的 Pod 啟動失敗也不會繼續重啟其他 Deployment 的 Pod,老的 Pod 也是一直保留的,對服務本身沒有任何影響。

存在的問題

看起來是沒有什么問題的,就是實現起來比較麻煩,流程很繁瑣,這里我貼了部分核心代碼:

func RebuildDeploymentV2(ctx context.Context, clientSet kubernetes.Interface, ns string) error {
 deployments, err := clientSet.AppsV1().Deployments(ns).List(ctx, metav1.ListOptions{})
 if err != nil {
  return err
 }

 for _, deployment := range deployments.Items {

  // Print each Deployment
  log.Printf("Ready deployment: %s\n", deployment.Name)

  originPodList, err := clientSet.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{
   LabelSelector: fmt.Sprintf("app=%s", deployment.Name),
  })
  if err != nil {
   return err
  }

  // Check if there are any Pods
  if len(originPodList.Items) == 0 {
   log.Printf(" No pod in %s\n", deployment.Name)
   continue
  }

  // Skip Pods that have already been upgraded
  updateSkip := false
  for _, container := range pod.Spec.Containers {
   if container.Name == "istio-proxy" && container.Image == "proxyv2:1.x.x" {
    log.Printf("  Pod: %s Container: %s has already upgrade, skip\n", pod.Name, container.Name)
    updateSkip = true
   }
  }
  if updateSkip {
   continue
  }

  // Scale the Deployment, create a new pod.
  scale, err := clientSet.AppsV1().Deployments(ns).GetScale(ctx, deployment.Name, metav1.GetOptions{})
  if err != nil {
   return err
  }
  scale.Spec.Replicas = scale.Spec.Replicas + 1
  _, err = clientSet.AppsV1().Deployments(ns).UpdateScale(ctx, deployment.Name, scale, metav1.UpdateOptions{})
  if err != nil {
   return err
  }

  // Wait for pods to be scaled
  for {
   podList, err := clientSet.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{
    LabelSelector: fmt.Sprintf("app=%s", deployment.Name),
   })
   if err != nil {
    log.Fatal(err)
   }
   if len(podList.Items) != int(scale.Spec.Replicas) {
    time.Sleep(time.Second * 10)
   } else {
    break
   }
  }

  // Wait for pods to be running
  for {
   podList, err := clientSet.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{
    LabelSelector: fmt.Sprintf("app=%s", deployment.Name),
   })
   if err != nil {
    log.Fatal(err)
   }
   isPending := false
   for _, item := range podList.Items {
    if item.Status.Phase != v1.PodRunning {
     log.Printf("Deployment: %s Pod: %s Not Running Status: %s\n", deployment.Name, item.Name, item.Status.Phase)
     isPending = true
    }
   }
   if isPending == true {
    time.Sleep(time.Second * 10)
   } else {
    break
   }
  }

  // Remove origin pod
  for _, pod := range originPodList.Items {
   err = clientSet.CoreV1().Pods(ns).Delete(context.Background(), pod.Name, metav1.DeleteOptions{})
   if err != nil {
    return err
   }
   log.Printf(" Remove origin %s success.\n", pod.Name)
  }

  // Recover scale
  newScale, err := clientSet.AppsV1().Deployments(ns).GetScale(ctx, deployment.Name, metav1.GetOptions{})
  if err != nil {
   return err
  }
  newScale.Spec.Replicas = newScale.Spec.Replicas - 1
  newScale.ResourceVersion = ""
  newScale.UID = ""
  _, err = clientSet.AppsV1().Deployments(ns).UpdateScale(ctx, deployment.Name, newScale, metav1.UpdateOptions{})
  if err != nil {
   return err
  }
  log.Printf(" Depoloyment %s rebuild success.\n", deployment.Name)
  log.Println()

 }

 return nil
}

看的出來代碼是比較多的。

最終方案

有沒有更簡單的方法呢,當我把上述的方案和領導溝通后他人都傻了,這也太復雜了:kubectl 不是有一個直接滾動重啟的命令嗎。

? k rollout -h
Manage the rollout of one or many resources.

Available Commands:
  history       View rollout history
  pause         Mark the provided resource as paused
  restart       Restart a resource
  resume        Resume a paused resource
  status        Show the status of the rollout
  undo          Undo a previous rollout

kubectl rollout restart deployment/abc 使用這個命令可以將 abc 這個 deployment 進行滾動更新,這個更新操作發生在 kubernetes 的服務端,執行的步驟和方案二差不多,只是 kubernetes 實現的比我的更加嚴謹。

后來我在查看 Istio 的官方升級指南中也是提到了這個命令:

所以還是得好好看官方文檔。

整合 kubectl

既然有現成的了,那就將這個命令整合到我的腳本里即可,再遍歷 namespace 下的 deployment 的時候循環調用就可以了。

但這個 rollout 命令在 kubernetes  client-go  SDK 中是沒有這個 API 的。

所以我只有參考 kubectl 的源碼,將這部分功能復制過來;不過好在可以直接依賴 kubect 到我的項目里。

require (  
    k8s.io/api v0.28.2  
    k8s.io/apimachinery v0.28.2  
    k8s.io/cli-runtime v0.28.2  
    k8s.io/client-go v0.28.2  
    k8s.io/klog/v2 v2.100.1  
    k8s.io/kubectl v0.28.2  
)

源碼里使用到的 RestartOptions 結構體是公共訪問的,所以我就參考它源碼魔改了一下:

func TestRollOutRestart(t *testing.T) {  
    kubeConfigFlags := defaultConfigFlags()  
    streams, _, _, _ := genericiooptions.NewTestIOStreams()  
    ns := "dev"  
    kubeConfigFlags.Namespace = &ns  
    matchVersionKubeConfigFlags := cmdutil.NewMatchVersionFlags(kubeConfigFlags)  
    f := cmdutil.NewFactory(matchVersionKubeConfigFlags)  
    deploymentName := "deployment/abc"  
    r := &rollout.RestartOptions{  
       PrintFlags: genericclioptions.NewPrintFlags("restarted").WithTypeSetter(scheme.Scheme),  
       Resources:  []string{deploymentName},  
       IOStreams:  streams,  
    }  
    err := r.Complete(f, nil, []string{deploymentName})  
    if err != nil {  
       log.Fatal(err)  
    }  
    err = r.RunRestart()  
    if err != nil {  
       log.Fatal(err)  
    }  
}

最終在幾次 debug 后終于可以運行了,只需要將這部分邏輯移動到循環里,加上 sleep 便可以有規律的重啟 Pod 了。

參考鏈接:

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-07-04 09:13:54

KubernetespodLinux

2022-05-10 10:09:12

KubernetesPod網絡抓包

2024-06-19 09:33:05

2020-11-30 12:15:26

KubernetesPodLinux

2023-02-09 16:47:34

KubernetesPod優先級

2020-04-10 08:00:08

Kubernetes補丁pod

2021-07-21 09:50:35

Linux腳本命令

2021-12-21 15:17:53

Kubernetes緩存Linux

2022-01-21 09:45:42

Mozilla SOKubernetesLinux

2024-04-15 05:00:00

kubernete網絡容器

2022-09-22 12:11:38

PodKubernetes

2021-12-03 11:06:01

VeleroKubernetesLinux

2021-06-04 10:52:51

kubernetes場景容器

2025-04-25 08:55:00

Pod運維

2024-03-29 12:11:46

2019-11-20 09:15:53

KubernetesPod

2021-12-29 17:24:16

Kubernetes集群事件

2021-06-25 15:53:25

Kubernetes程序技巧

2025-09-04 07:45:33

2021-10-26 10:28:41

開發架構Kubernetes
點贊
收藏

51CTO技術棧公眾號

日韩人妻一区二区三区蜜桃视频| 欧美一级大胆视频| 超碰在线资源站| 国内高清免费在线视频| 91热门视频在线观看| 日本视频久久久| 在线日韩国产网站| av成人综合| 日本高清不卡视频| 男人草女人视频| 青青草视频在线免费观看| 麻豆国产91在线播放| 欧美极品少妇xxxxⅹ免费视频| 国产福利在线观看视频| 精品自拍视频| 午夜精品福利一区二区三区蜜桃| 色噜噜狠狠一区二区三区| 99视频免费看| 日韩av中文字幕一区二区| 欧美激情国产高清| 青青草华人在线视频| 久久久久久毛片免费看 | 国产91精品精华液一区二区三区| 欧美一二三视频| 欧美成人三级在线观看| 欧美日韩中文字幕一区二区三区| 精品sm捆绑视频| 91女神在线观看| 另类图片综合电影| 午夜私人影院久久久久| 2022中文字幕| 麻豆视频在线观看免费网站| 国产情人综合久久777777| 草莓视频一区| 国产色综合视频| 看片的网站亚洲| 国产成人午夜视频网址| 日本天堂在线视频| 午夜欧美精品久久久久久久| 伊人av综合网| 欧美黑人欧美精品刺激| 卡一精品卡二卡三网站乱码| 欧美成人精精品一区二区频| 91精品视频国产| 欧美黄页在线免费观看| 欧美在线高清视频| 欧美激情精品久久久久久小说| aa视频在线观看| 亚洲资源中文字幕| 在线看成人av电影| 麻豆视频在线播放| 亚洲女人的天堂| 视频一区二区视频| 国产在线观看a视频| 国产精品久久午夜| 亚洲午夜高清视频| 免费看美女视频在线网站| 国产精品灌醉下药二区| 一区二区三区我不卡| 欧美高清视频| 亚洲免费观看视频| 亚洲国产一区二区三区在线播 | av动漫精品一区二区| 精品国产一区二区三区久久久蜜月 | 成人直播在线| 亚洲乱码精品一二三四区日韩在线| 在线免费一区| 中文在线字幕免费观看| 亚洲成人免费在线| 欧美性大战久久久久xxx| 中文字幕 在线观看| 91成人免费在线视频| 人人干人人干人人| 国产精品亚洲欧美一级在线| 日韩欧美一级精品久久| 亚洲自拍偷拍精品| 精品国产一级毛片| 久久亚洲精品成人| 国产在线观看你懂的| 性欧美xxxx大乳国产app| 国产成人精品视频在线观看| 亚洲综合精品视频| 国产一区二区三区黄视频| 粉嫩av一区二区三区免费观看| 人人妻人人澡人人爽精品日本| 久久这里只有精品首页| 亚洲日本无吗高清不卡| 蜜桃成人365av| 色综合久久88色综合天天6 | 日韩精品一区二区三区电影| 丰满大乳少妇在线观看网站| 日韩欧美亚洲范冰冰与中字| 最新天堂中文在线| 国产精品22p| 自拍视频国产精品| 国产网址在线观看| 免费看欧美美女黄的网站| 亚洲va欧美va国产综合剧情| 涩涩视频在线观看免费| 中文字幕一区二区三区av| 屁屁影院ccyy国产第一页| 在线观看欧美日韩电影| 欧美一个色资源| 人妻大战黑人白浆狂泄| 这里只有精品在线| 国产激情综合五月久久| 精品免费久久久| 国产农村妇女精品| 成人一对一视频| 国产精品一区二区精品| 亚洲美女性视频| 波多野结衣爱爱视频| 国产日韩一区| 成人区精品一区二区| 在线免费观看黄色网址| 天天操天天色综合| 日本少妇xxx| 久久国产中文字幕| 国产91精品在线播放| 欧美视频一二区| 综合欧美亚洲日本| 91日韩视频在线观看| 欧美激情99| 久久久久久18| 99精品国产99久久久久久97| 中文天堂在线一区| 日韩手机在线观看视频| 免费福利视频一区| 久久久亚洲精选| 国产三区在线播放| 亚洲私人黄色宅男| 粉色视频免费看| 日本a级不卡| 国产精品igao视频| 久草视频在线看| 欧美视频不卡中文| 亚洲调教欧美在线| 99在线热播精品免费99热| 99porn视频在线| 人人干在线视频| 精品视频1区2区3区| 一级黄色片大全| 亚洲一区黄色| 久久久久久久久一区| 国产一线二线在线观看| 精品国产一区二区三区不卡| 久久久久久久黄色| 国产不卡视频在线播放| 国产一区 在线播放| 一区二区三区视频播放| 欧美黄色片在线观看| 丰满人妻一区二区三区无码av| 亚洲免费av网站| 好吊操视频这里只有精品| 国产精品hd| 韩日午夜在线资源一区二区| 日韩影院在线| 亚洲图片制服诱惑| 中日精品一色哟哟| 国产精品无人区| 91插插插影院| 亚洲午夜电影| 久久国产精品精品国产色婷婷| 涩涩涩在线视频| 国产亚洲福利一区| 97超碰资源站| 亚洲国产精品久久人人爱| 国产一级伦理片| 亚洲自啪免费| 亚洲欧洲日韩精品| 欧美在线在线| 5278欧美一区二区三区| 国产一区二区三区福利| 欧美美女一区二区| 久久久久亚洲av成人片| www国产成人| 手机看片一级片| 黄色亚洲精品| 天堂一区二区三区 | 日本成人在线一区| 亚洲欧美一二三| 麻豆一区二区| 国产精品久久一区| 色呦呦在线看| 亚洲香蕉成人av网站在线观看 | 一区二区三区 在线观看视| 国产人妖一区二区三区| 亚洲国产一区二区三区青草影视| 国产美女喷水视频| 国产在线一区观看| 国产成人无码精品久久久性色| 禁果av一区二区三区| 亚洲自拍中文字幕| 成人福利视频| 久久99亚洲精品| 国产视频网站在线| 欧美r级在线观看| 亚洲天堂视频在线播放| 一区二区三区中文字幕电影| 中文字幕网站在线观看| 国产成人小视频| 国产又猛又黄的视频| 在线高清一区| 正在播放久久| 精品产国自在拍| 国产精品白丝jk白祙| 91综合国产| 欧美性受xxx| 青青草原av在线| 日韩中文在线视频| 欧美男男激情freegay| 日韩精品一区二区三区视频播放| 国产黄网在线观看| 精品美女永久免费视频| 国模无码国产精品视频| 国产欧美精品一区aⅴ影院 | 4k岛国日韩精品**专区| 成年人黄视频在线观看| 在线播放国产精品| 日韩大胆视频| 亚洲国产高清自拍| 亚洲福利在线观看视频| 91精品黄色片免费大全| 自拍偷拍色综合| 日本精品视频一区二区三区| 国产精品999久久久| 亚洲啪啪综合av一区二区三区| 免费成人深夜天涯网站| 久久亚洲综合色| a天堂视频在线观看| 国产91精品在线观看| 国产chinesehd精品露脸| 国产一区二区视频在线播放| 亚洲综合婷婷久久| 奇米精品一区二区三区在线观看一| 免费在线激情视频| 国产欧美日本| 黄色网页免费在线观看| 亚洲精品社区| 青青青免费在线| 一本色道久久| 国产a级一级片| 免费在线日韩av| 免费裸体美女网站| 爽好久久久欧美精品| 一本久道综合色婷婷五月| 免费一级欧美片在线播放| 久热免费在线观看| 日韩福利视频网| 亚洲高清在线免费观看| 秋霞电影一区二区| 日本免费色视频| 国内精品伊人久久久久av影院| 国产永久免费网站| 国产精品亚洲第一| av电影在线播放| www.成人在线| 黄色aaa视频| 国产精品日日摸夜夜摸av| 很污很黄的网站| 亚洲欧洲制服丝袜| 豆国产97在线 | 亚洲| 五月激情综合色| 无码人妻av免费一区二区三区 | 亚洲男同1069视频| 欧美成欧美va| 精品福利一区二区| 在线免费观看国产精品| 欧美日韩国产综合视频在线观看| 国产精品亚洲lv粉色| 日韩精品一区二区三区四区 | 国产亚洲综合性久久久影院| 天天干天天舔天天操| 自拍偷拍国产精品| 日本一区二区三区免费视频| 欧美午夜精品久久久久久浪潮| 日本视频免费观看| 91精品国产欧美一区二区18| 女人18毛片水真多18精品| 亚洲一区www| av在线网址观看| 欧洲精品在线视频| vam成人资源在线观看| 精品国产免费人成电影在线观...| 欧美美女在线观看| 日韩视频一二三| 噜噜爱69成人精品| 日本人dh亚洲人ⅹxx| 久久中文字幕电影| 国产盗摄一区二区三区在线| 欧美日韩中文字幕日韩欧美| 一级片aaaa| 亚洲级视频在线观看免费1级| 2021av在线| 91精品国产高清久久久久久| 日韩城人网站| 久久成人资源| 欧美88av| 黄色aaa级片| www.欧美日韩| 欧美卡一卡二卡三| 在线国产亚洲欧美| 人妻视频一区二区三区| 久久精品国产欧美亚洲人人爽| 17videosex性欧美| 成人网页在线免费观看| 伊人久久大香线蕉综合网蜜芽| 色一情一乱一乱一区91| 日本一区中文字幕| 国产精品久久AV无码| 综合av第一页| 免费看av在线| 日韩精品免费在线观看| 欧美性爽视频| 成人激情视频在线观看| 欧美亚洲国产激情| 亚洲色成人一区二区三区小说| 国产不卡一区视频| 久草综合在线视频| 欧美日韩国产成人在线91| 激情小视频在线观看| 国内精品视频在线| 在线观看视频一区二区三区| 9999在线观看| 久久精品国产免费| 国产1区2区在线观看| 欧美视频在线免费看| 天堂在线观看av| 久久久久久av| 97品白浆高清久久久久久| 无码人妻精品一区二区三区99v| 美女在线一区二区| 18精品爽国产三级网站| 91黄色免费看| 国产精品麻豆一区二区三区| 日韩免费在线免费观看| 国产欧美日韩一区二区三区四区| 日韩中文字幕三区| 91麻豆精东视频| 毛片在线免费视频| 日韩精品欧美国产精品忘忧草| 久热在线观看视频| 精品国产aⅴ麻豆| 一区二区久久| 国产男女猛烈无遮挡a片漫画 | 国产精品水嫩水嫩| 中文字幕一区二区三区免费看| 国产亚洲精品91在线| 欧美日韩不卡| 亚洲精品高清视频| 麻豆精品在线播放| 欧美大片xxxx| 日韩欧美不卡一区| 9999在线视频| 久久久一本精品99久久精品66| 国产精品试看| 成年人在线免费看片| 欧美三级在线看| v片在线观看| 国产91aaa| 男女精品视频| 国产美女网站视频| 欧美一区二区在线免费观看| 国产一线二线在线观看| 精品久久久久久一区| 日韩国产在线观看| 欧美色视频一区二区三区在线观看| 欧美一区二区三区系列电影| 国产在线xxx| 日韩片电影在线免费观看| 激情小说亚洲一区| 精品亚洲永久免费| 亚洲片在线观看| 91国产一区| 精品欧美一区免费观看α√| 久久久精品影视| 国产精品怡红院| 97精品视频在线播放| 成人3d动漫在线观看| 女人扒开腿免费视频app| 天天av天天翘天天综合网色鬼国产 | 亚洲精品天堂成人片av在线播放| 国产v综合v亚洲欧| 成年人av网站| 欧美高清自拍一区| 国产99久久久国产精品成人免费 | 久久亚洲春色中文字幕久久久| 中文字幕免费高清在线观看| 欧美日韩国产成人在线观看| 亚洲福利网站| 老熟女高潮一区二区三区| 色女孩综合影院| 污污的网站在线看| 日韩精品国内| 成人av在线看| 国产精品毛片久久久久久久av| 97精品一区二区三区| 性xxxx欧美老肥妇牲乱| av在线网站观看| 精品国精品自拍自在线|