1. 程式人生 > >Kubernetes滾動更新介紹及使用

Kubernetes滾動更新介紹及使用

我們 k8s叢集使用的是1.7.7版本的,該版本中官方已經推薦使用 Deployment代替 ReplicationController(rc)了, Deployment繼承了rc的全部功能外,還可以檢視升級詳細進度和狀態,當升級出現問題的時候,可以使用回滾操作回滾到指定的版本,每一次對Deployment的操作,都會儲存下來,變能方便的進行回滾操作了,另外對於每一次升級都可以隨時暫停和啟動,擁有多種升級方案: Recreate刪除現在的 Pod,重新建立; RollingUpdate滾動升級,逐步替換現有 Pod,對於生產環境的服務升級,顯然這是一種最好的方式。

建立Deployment

Deployment結構

可以看出一個Deployment擁有多個Replica Set,而一個Replica Set擁有一個或多個Pod。一個Deployment控制多個rs主要是為了支援回滾機制,每當Deployment操作時,Kubernetes會重新生成一個Replica Set並保留,以後有需要的話就可以回滾至之前的狀態。 下面建立一個Deployment,它建立了一個Replica Set來啟動3個nginx pod,yaml檔案如下:

123456789101112131415161718 apiVersion: apps/v1beta1kind: Deploymentmetadata:name: nginx-deploylabels:k8s-app: nginx-demospec:replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- containerPort: 80

將上面內容儲存為: nginx-deployment.yaml,執行命令:

12 $kubectlcreate-fnginx-deployment.yamldeployment"nginx-deploy"created

然後執行一下命令檢視剛剛建立的Deployment:

123 $kubectlgetdeploymentsNAMEDESIREDCURRENTUP-TO-DATEAVAILABLEAGEnginx-deploy30001s

隔一會再次執行上面命令:

123 $kubectlgetdeploymentsNAMEDESIREDCURRENTUP-TO-DATEAVAILABLEAGEnginx-deploy33334m

我們可以看到Deployment已經建立了3個Replica Set了,執行下面的命令檢視rs和pod:

123 $kubectlgetrsNAMEDESIREDCURRENTREADYAGEnginx-deploy-4310807873336m
12345 $kubectlgetpod--show-labelsNAMEREADYSTATUSRESTARTSAGELABELSnginx-deploy-431080787-53z8q1/1Running07mapp=nginx,pod-template-hash=431080787nginx-deploy-431080787-bhhq01/1Running07mapp=nginx,pod-template-hash=431080787nginx-deploy-431080787-sr44p1/1Running07mapp=nginx,pod-template-hash=431080787

上面的Deployment的yaml檔案中的 replicas:3將會保證我們始終有3個POD在執行。

滾動升級Deployment

現在我們將剛剛儲存的yaml檔案中的nginx映象修改為 nginx:1.13.3,然後在spec下面新增滾動升級策略:

1234567 minReadySeconds: 5strategy:# indicate which strategy we want for rolling updatetype: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 1
  • minReadySeconds:
    • Kubernetes在等待設定的時間後才進行升級
    • 如果沒有設定該值,Kubernetes會假設該容器啟動起來後就提供服務了
    • 如果沒有設定該值,在某些極端情況下可能會造成服務服務正常執行
  • maxSurge:
    • 升級過程中最多可以比原先設定多出的POD數量
    • 例如:maxSurage=1,replicas=5,則表示Kubernetes會先啟動1一個新的Pod後才刪掉一箇舊的POD,整個升級過程中最多會有5 1個POD。
  • maxUnavaible:
    • 升級過程中最多有多少個POD處於無法提供服務的狀態
    • maxSurge不為0時,該值也不能為0
    • 例如:maxUnavaible=1,則表示Kubernetes整個升級過程中最多會有1個POD處於無法服務的狀態。

然後執行命令:

12 $kubectlapply-fnginx-deployment.yamldeployment"nginx-deploy"configured

然後我們可以使用 rollout命令:

  • 檢視狀態:

    123 $kubectlrolloutstatusdeployment/nginx-deployWaitingforrollouttofinish:1outof3newreplicashavebeenupdated..deployment"nginx-deploy"successfullyrolledout
  • 暫停升級

    1 $kubectlrolloutpausedeployment<deployment>
  • 繼續升級

    1 $kubectlrolloutresumedeployment<deployment>

升級結束後,繼續檢視rs的狀態:

12345 $kubectlgetrsNAMEDESIREDCURRENTREADYAGEnginx-deploy-207888989700047mnginx-deploy-329744537233342mnginx-deploy-4310807870001h

根據AGE我們可以看到離我們最近的當前狀態是:3,和我們的yaml檔案是一致的,證明升級成功了。用 describe命令可以檢視升級的全部資訊:

1234567891011121314151617181920212223242526272829303132333435363738 Name:nginx-deployNamespace:defaultCreationTimestamp:Wed,18Oct201716:58:52+0800Labels:k8s-app=nginx-demoAnnotations:deployment.kubernetes.io/revision=3kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1beta1","kind":"Deployment","metadata":{"annotations":{},"labels":{"k8s-app":"nginx-demo"},"name":"nginx-deploy","namespace":"defa...Selector:app=nginxReplicas:3desired|3updated|3total|3available|0unavailableStrategyType:RollingUpdateMinReadySeconds:0RollingUpdateStrategy:25%maxunavailable,25%maxsurgePodTemplate:Labels:app=nginxContainers:nginx:Image:nginx:1.13.3Port:80/TCPEnvironment:<none>    Mounts:   <none>  Volumes:    <none>Conditions:  Type    Status  Reason  ----    ------  ------  Progressing   True  NewReplicaSetAvailable  Available   True  MinimumReplicasAvailableOldReplicaSets: <none>NewReplicaSet:nginx-deploy-3297445372(3/3replicascreated)Events:FirstSeenLastSeenCountFromSubObjectPathTypeReasonMessage------------------------------------------------------------50m50m1deployment-controllerNormalScalingReplicaSetScaledupreplicasetnginx-deploy-2078889897to145m45m1deployment-controllerNormalScalingReplicaSetScaleddownreplicasetnginx-deploy-2078889897to045m45m1deployment-controllerNormalScalingReplicaSetScaledupreplicasetnginx-deploy-3297445372to139m39m1deployment-controllerNormalScalingReplicaSetScaleddownreplicasetnginx-deploy-431080787to239m39m1deployment-controllerNormalScalingReplicaSetScaledupreplicasetnginx-deploy-3297445372to238m38m1deployment-controllerNormalScalingReplicaSetScaleddownreplicasetnginx-deploy-431080787to138m38m1deployment-controllerNormalScalingReplicaSetScaledupreplicasetnginx-deploy-3297445372to338m38m1deployment-controllerNormalScalingReplicaSetScaleddownreplicasetnginx-deploy-431080787to0

回滾Deployment

我們已經能夠滾動平滑的升級我們的Deployment了,但是如果升級後的POD出了問題該怎麼辦?我們能夠想到的最好最快的方式當然是回退到上一次能夠提供正常工作的版本,Deployment就為我們提供了回滾機制。

首先,檢視Deployment的升級歷史:

123456 $kubectlrollouthistorydeploymentnginx-deploydeployments"nginx-deploy"REVISIONCHANGE-CAUSE1<none>2   <none>3kubectlapply--filename=Desktop/nginx-deployment.yaml--record=true

從上面的結果可以看出在執行Deployment升級的時候最好帶上 record引數,便於我們檢視歷史版本資訊。同樣我們可以使用下面的命令檢視單個REVISION的資訊:

12345678910111213 $kubectlrollouthistorydeploymentnginx-deploy--revision=3deployments"nginx-deploy"withrevision#3PodTemplate:Labels:app=nginxpod-template-hash=3297445372Annotations:kubernetes.io/change-cause=kubectlapply--filename=nginx-deployment.yaml--record=trueContainers:nginx:Image:nginx:1.13.3Port:80/TCPEnvironment:<none>    Mounts: <none>  Volumes:  <none>

假如現在要直接回退到當前版本的前一個版本:

12 $kubectlrolloutundodeploymentnginx-deploydeployment"nginx-deploy"rolledback

當然也可以用

相關推薦

Kubernetes滾動更新介紹使用

我們 k8s叢集使用的是1.7.7版本的,該版本中官方已經推薦使用 Deployment代替 ReplicationController(rc)了, Deployment繼承了rc的全部功能外,還可以檢視升級詳細進度和狀態,當升級出現問題的時候,可以使用回滾操作回滾到指

kubernetes 滾動更新發布回滾

bsp uber record kubectl 滾動 app 記錄 post 回滾 基本命令 記錄歷史 --record kubectl apply -f **** --record 查看當前狀態 kubectl rollout status deployment/dem

kubernetes 滾動更新

set grace ini 版本 mina desc mman exp pau 示例: 創建一個app:kubectl create deployment nginx --image=nginx:1.11 創建service kubectl expose deploy

Kubernetes儲存系統介紹機制實現

一、Kubernetes中儲存的應用場景 在Kubernetes中部署和執行的服務大致分為: 1. 無狀態服務 Kubernetes使用ReplicaSet來保證一個服務的例項數量,如果說某個Pod例項由於某種原因掛掉或崩潰,ReplicaSet會立刻用這個Pod的模版

Kubernetes儲存系統介紹機制實現_Kubernetes中文社群

【編者的話】本次分享分為三大部分。第一部分主要介紹Kubernetes中常用的幾種儲存,及其使用場景和生命週期等等。第二部分試圖介紹一些設計原則和基本架構,並簡要介紹各種儲存plugin的實現機制及持久卷的一些特性,例如訪問模式、回收策略等等。動態卷供給是一個Kubernetes獨有的功能,這

Kubernetes Service滾動更新

cond 發出 point rpo use 應用 一次 歷史 針對 [toc] 簡介 滾動更新 當kubernetes集群中的某個服務需要升級時,傳統的做法是,先將要更新的服務下線,業務停止後再更新版本和配置,然後重新啟動並提供服務。如果業務集群規模較大時,這個工作就變成了

Kubernetes集群中Service的滾動更新

k8s config level apiserver div restfu ceph 成功 lac Kubernetes集群中Service的滾動更新 二月 9, 2017 0 條評論 在移動互聯網時代,消費者的消費行為已經“全天候化”,為此,商家的業務系統也要保持7

kubernetes 環境搭建 基礎架構介紹 一個進銷存管理系統 簡單搭建

kubernetes是一個全新的基於容器技術的分散式架構領先方案。它是谷歌十幾年來大規模應用容器技術的經驗積累和昇華的一個重要成果 kubernetes是一個完備的分散式系統支撐平臺。kubernetes具有完備的叢集管理能力,包括多層次的安全防護和准入機制,多租戶應用支撐能力,透明的服務註冊和

Jenkins持續整合介紹外掛安裝版本更新演示(一)--技術流ken

  Jenkins介紹    Jenkins是一個開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。 Jenkins功能包括: 1、持續的軟體版本釋出/測試專案。 2、監控外部呼叫執行

Kubernetes介紹主要功能筆記

Kubernetes介紹: google 2014年開源的一個容器叢集管理系統,採用go語言開發,也簡稱K8S,K8S是google內部一個叫Borg的容器叢集管理系統衍生出來的,borg在google大規模生產執行10年之久 K8S主要用於自動化部署、擴充套件和管理容器應用,提供了資源排程

Kubernetes Pod應用的滾動更新(八)

一、環境準備 我們緊接上一節的環境,進行下面的操作,如果不清楚的,可以先檢視上一篇博文。 滾動更新是一次只更新一小部分副本,成功後,再更新更多的副本,最終完成所有副本的更新。滾動更新的最大的好處是零停機,整個更新過程始終有副本在執行,從而保證了業務的連續性。 二、更新 我們檢視一下上一節的配置檔案my

聊聊你可能誤解的Kubernetes Deployment滾動更新機制

Author: [email protected] 摘要: Kubernetes Deployment滾動更新機制不同於ReplicationController rolling update,Deployment rollout還提供了滾

kubernetes學習(一) Scale應用 & 滾動更新

一、Scale應用   預設請款下應用只會執行一個副本,可通過kubectl get deployments 檢視副本數。 ~$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILA

react-native熱更新之CodePush詳細介紹使用方法

react-native熱更新之CodePush詳細介紹及使用方法 2018年03月04日 17:03:21 clf_programing 閱讀數:7979 標籤: react native熱更新code pus

Kubernetes Deployment滾動更新場景分析

基於Kubernetes v1.7.4 關於Kubernetes Deployment滾動更新 場景1:正常滾動更新流程 新建deployment:webserver,replicas=10,image=tomcat。 滾動更新

kubernetes DaemonSet的滾動更新

DaemonSet的滾動更新 DaemonSet 更新策略 DaemonSet 有兩種更新策略 : OnDelete: 預設的向後相容更新策略. 只有當你手動刪除老的DaemonSet pods

ARM嵌入式常用開發工具介紹插畫開發流程(更新)

    這裡接著前邊的開發環境的配置說,其實用於開發的話,基本的開發環境已經架構好了,不過由於嵌入式開發環境的特殊性(交叉編譯),我們還會用到一些其他的外圍工具,這裡做簡要的說明。並重新介紹一下整個開發環境中,各個工具的使用,及一個簡單應用的開發流程。 SecureCR

06 . Kubernetes之Pod控制器詳細介紹應用

#### Pod API屬性詳解 > Pod是k8s叢集中的最小編排單位。將這個設計落實到API物件上,容器就成了Pod屬性裡一個普通的欄位。那麼到底哪些屬性屬於Pod物件,哪些屬性屬於容器的呢?先看下面的一段描述: > > > > 假如把Pod看成傳統環境裡的"機器"、那麼容器就是執行在這個"機器"

JavaWeb網上圖書商城完整項目--day03-1.圖書模塊功能介紹相關類創建

class default package ren 書籍 logs main java getc 1 前兩天我們學習了user用戶模塊和圖書的分類模塊,接下來我們學習圖書模塊 圖書模塊的功能主要是下面的功能: 2 接下來我們創建對應的包 我們來看看對應的數據庫表t_bo

C#數據緩存介紹Caching通用幫助類整理

能夠 eric article for generic arr stat ati cti C#緩存主要是為了提高數據的讀取速度。由於server和應用client之間存在著流量的瓶頸,所以讀取大容量數據時,使用緩存來直接為client服務,能夠降低client與serv