摘要:序,可以使得服務(wù)近乎無(wú)縫地平滑升級(jí),即在不停止對(duì)外服務(wù)的前提下完成應(yīng)用的更新。如果少于指定數(shù)量的,會(huì)創(chuàng)建新的,反之則會(huì)刪除掉多余的以保證數(shù)量不變。對(duì)于應(yīng)用,默認(rèn)的帶有接口,可以用來(lái)進(jìn)行啟動(dòng)成功的判斷。
序
rolling update,可以使得服務(wù)近乎無(wú)縫地平滑升級(jí),即在不停止對(duì)外服務(wù)的前提下完成應(yīng)用的更新。
replication controller與deployment的區(qū)別 replication controllerReplication Controller為Kubernetes的一個(gè)核心內(nèi)容,應(yīng)用托管到Kubernetes之后,需要保證應(yīng)用能夠持續(xù)的運(yùn)行,Replication Controller就是這個(gè)保證的key,主要的功能如下:
確保pod數(shù)量:它會(huì)確保Kubernetes中有指定數(shù)量的Pod在運(yùn)行。如果少于指定數(shù)量的pod,Replication Controller會(huì)創(chuàng)建新的,反之則會(huì)刪除掉多余的以保證Pod數(shù)量不變。
確保pod健康:當(dāng)pod不健康,運(yùn)行出錯(cuò)或者無(wú)法提供服務(wù)時(shí),Replication Controller也會(huì)殺死不健康的pod,重新創(chuàng)建新的。
彈性伸縮 :在業(yè)務(wù)高峰或者低峰期的時(shí)候,可以通過(guò)Replication Controller動(dòng)態(tài)的調(diào)整pod的數(shù)量來(lái)提高資源的利用率。同時(shí),配置相應(yīng)的監(jiān)控功能(Hroizontal Pod Autoscaler),會(huì)定時(shí)自動(dòng)從監(jiān)控平臺(tái)獲取Replication Controller關(guān)聯(lián)pod的整體資源使用情況,做到自動(dòng)伸縮。
滾動(dòng)升級(jí):滾動(dòng)升級(jí)為一種平滑的升級(jí)方式,通過(guò)逐步替換的策略,保證整體系統(tǒng)的穩(wěn)定,在初始化升級(jí)的時(shí)候就可以及時(shí)發(fā)現(xiàn)和解決問(wèn)題,避免問(wèn)題不斷擴(kuò)大。
DeploymentDeployment同樣為Kubernetes的一個(gè)核心內(nèi)容,主要職責(zé)同樣是為了保證pod的數(shù)量和健康,90%的功能與Replication Controller完全一樣,可以看做新一代的Replication Controller。但是,它又具備了Replication Controller之外的新特性:
Replication Controller全部功能:Deployment繼承了上面描述的Replication Controller全部功能。
事件和狀態(tài)查看:可以查看Deployment的升級(jí)詳細(xì)進(jìn)度和狀態(tài)。
回滾:當(dāng)升級(jí)pod鏡像或者相關(guān)參數(shù)的時(shí)候發(fā)現(xiàn)問(wèn)題,可以使用回滾操作回滾到上一個(gè)穩(wěn)定的版本或者指定的版本。
版本記錄: 每一次對(duì)Deployment的操作,都能保存下來(lái),給予后續(xù)可能的回滾使用。
暫停和啟動(dòng):對(duì)于每一次升級(jí),都能夠隨時(shí)暫停和啟動(dòng)。
多種升級(jí)方案:Recreate:刪除所有已存在的pod,重新創(chuàng)建新的; RollingUpdate:滾動(dòng)升級(jí),逐步替換的策略,同時(shí)滾動(dòng)升級(jí)時(shí),支持更多的附加參數(shù),例如設(shè)置最大不可用pod數(shù)量,最小升級(jí)間隔時(shí)間等等。
deployment的常用命令 查看部署狀態(tài)kubectl rollout status deployment/review-demo --namespace=scm kubectl describe deployment/review-demo --namespace=scm
或者這種寫法
kubectl rollout status deployments review-demo --namespace=scm kubectl describe deployments review-demo --namespace=scm升級(jí)
kubectl set image deployment/review-demo review-demo=library/review-demo:0.0.1 --namespace=scm
或者
kubectl edit deployment/review-demo --namespace=scm
編輯.spec.template.spec.containers[0].image的值
終止升級(jí)kubectl rollout pause deployment/review-demo --namespace=scm繼續(xù)升級(jí)
kubectl rollout resume deployment/review-demo --namespace=scm回滾
kubectl rollout undo deployment/review-demo --namespace=scm查看deployments版本
kubectl rollout history deployments --namespace=scm
回滾到指定版本
kubectl rollout undo deployment/review-demo --to-revision=2 --namespace=scm升級(jí)歷史
kubectl describe deployment/review-demo --namespace=scm Name: review-demo Namespace: scm CreationTimestamp: Tue, 31 Jan 2017 16:42:01 +0800 Labels: app=review-demo Selector: app=review-demo Replicas: 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge OldReplicaSets:deployment文件NewReplicaSet: review-demo-2741031620 (3/3 replicas created) Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set review-demo-2741031620 to 1 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set review-demo-1914295649 to 2 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set review-demo-2741031620 to 2 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set review-demo-1914295649 to 1 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set review-demo-2741031620 to 3 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set review-demo-1914295649 to 0
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: review-demo namespace: scm labels: app: review-demo spec: replicas: 3 # minReadySeconds: 60 #滾動(dòng)升級(jí)時(shí)60s后認(rèn)為該pod就緒 strategy: rollingUpdate: ##由于replicas為3,則整個(gè)升級(jí),pod個(gè)數(shù)在2-4個(gè)之間 maxSurge: 1 #滾動(dòng)升級(jí)時(shí)會(huì)先啟動(dòng)1個(gè)pod maxUnavailable: 1 #滾動(dòng)升級(jí)時(shí)允許的最大Unavailable的pod個(gè)數(shù) template: metadata: labels: app: review-demo spec: terminationGracePeriodSeconds: 60 ##k8s將會(huì)給應(yīng)用發(fā)送SIGTERM信號(hào),可以用來(lái)正確、優(yōu)雅地關(guān)閉應(yīng)用,默認(rèn)為30秒 containers: - name: review-demo image: library/review-demo:0.0.1-SNAPSHOT imagePullPolicy: IfNotPresent livenessProbe: #kubernetes認(rèn)為該pod是存活的,不存活則需要重啟 httpGet: path: /health port: 8080 scheme: HTTP initialDelaySeconds: 60 ## equals to the maximum startup time of the application + couple of seconds timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: #kubernetes認(rèn)為該pod是啟動(dòng)成功的 httpGet: path: /health port: 8080 scheme: HTTP initialDelaySeconds: 30 ## equals to minimum startup time of the application timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 resources: # keep request = limit to keep this container in guaranteed class requests: cpu: 50m memory: 200Mi limits: cpu: 500m memory: 500Mi env: - name: PROFILE value: "test" ports: - name: http containerPort: 8080幾個(gè)重要參數(shù)說(shuō)明 maxSurge與maxUnavailable
maxSurge: 1 表示滾動(dòng)升級(jí)時(shí)會(huì)先啟動(dòng)1個(gè)pod
maxUnavailable: 1 表示滾動(dòng)升級(jí)時(shí)允許的最大Unavailable的pod個(gè)數(shù)
由于replicas為3,則整個(gè)升級(jí),pod個(gè)數(shù)在2-4個(gè)之間
k8s將會(huì)給應(yīng)用發(fā)送SIGTERM信號(hào),可以用來(lái)正確、優(yōu)雅地關(guān)閉應(yīng)用,默認(rèn)為30秒。
如果需要更優(yōu)雅地關(guān)閉,則可以使用k8s提供的pre-stop lifecycle hook 的配置聲明,將會(huì)在發(fā)送SIGTERM之前執(zhí)行。
livenessProbe與readinessProbelivenessProbe是kubernetes認(rèn)為該pod是存活的,不存在則需要kill掉,然后再新啟動(dòng)一個(gè),以達(dá)到replicas指定的個(gè)數(shù)。
readinessProbe是kubernetes認(rèn)為該pod是啟動(dòng)成功的,這里根據(jù)每個(gè)應(yīng)用的特性,自己去判斷,可以執(zhí)行command,也可以進(jìn)行httpGet。比如對(duì)于使用java web服務(wù)的應(yīng)用來(lái)說(shuō),并不是簡(jiǎn)單地說(shuō)tomcat啟動(dòng)成功就可以對(duì)外提供服務(wù)的,還需要等待spring容器初始化,數(shù)據(jù)庫(kù)連接連接上等等。對(duì)于spring boot應(yīng)用,默認(rèn)的actuator帶有/health接口,可以用來(lái)進(jìn)行啟動(dòng)成功的判斷。
其中readinessProbe.initialDelaySeconds可以設(shè)置為系統(tǒng)完全啟動(dòng)起來(lái)所需的最少時(shí)間,livenessProbe.initialDelaySeconds可以設(shè)置為系統(tǒng)完全啟動(dòng)起來(lái)所需的最大時(shí)間+若干秒。
doc這幾個(gè)參數(shù)配置好了之后,基本就可以實(shí)現(xiàn)近乎無(wú)縫地平滑升級(jí)了。對(duì)于使用服務(wù)發(fā)現(xiàn)的應(yīng)用來(lái)說(shuō),readinessProbe可以去執(zhí)行命令,去查看是否在服務(wù)發(fā)現(xiàn)里頭應(yīng)該注冊(cè)成功了,才算成功。
【分享】幾種常見的不停機(jī)發(fā)布方式
Deployment vs ReplicationController in Kubernetes
kubernetes-user-guide-deployments
Kubernetes用戶指南(三)--在生產(chǎn)環(huán)境中使用Pod來(lái)工作、管理部署
Kubernetes livenessProbe shutdown during application startup
Kubernetes技術(shù)研究容器監(jiān)控監(jiān)測(cè)
Graceful shutdown of pods with Kubernetes
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/32541.html
摘要:在中,被用來(lái)管理有狀態(tài)應(yīng)用的對(duì)象。并行管理并行管理告訴控制器以并行的方式啟動(dòng)或者終止所有的。如果設(shè)置為,則控制器將會(huì)刪除和重建中的每一。在大部分的情況下,不會(huì)使用分隔當(dāng)希望進(jìn)行金絲雀發(fā)布,或者執(zhí)行階段發(fā)布時(shí),分隔是很有用的。 在Kubernetes中,StatefulSet被用來(lái)管理有狀態(tài)應(yīng)用的API對(duì)象。StatefulSets在Kubernetes 1.9版本才穩(wěn)定。Statefu...
摘要:命令用于程序在負(fù)載加重或縮小時(shí)進(jìn)行擴(kuò)容或縮小,我們通過(guò)一些實(shí)際例子來(lái)觀察命令到底能達(dá)到什么效果。 kubectl scale命令用于程序在負(fù)載加重或縮小時(shí)進(jìn)行pod擴(kuò)容或縮小,我們通過(guò)一些實(shí)際例子來(lái)觀察scale命令到底能達(dá)到什么效果。 命令行創(chuàng)建一個(gè)deployment: kubectl run jerry-nginx --image=nginx:1.12.2 showImg(htt...
摘要:命令用于程序在負(fù)載加重或縮小時(shí)進(jìn)行擴(kuò)容或縮小,我們通過(guò)一些實(shí)際例子來(lái)觀察命令到底能達(dá)到什么效果。 kubectl scale命令用于程序在負(fù)載加重或縮小時(shí)進(jìn)行pod擴(kuò)容或縮小,我們通過(guò)一些實(shí)際例子來(lái)觀察scale命令到底能達(dá)到什么效果。 命令行創(chuàng)建一個(gè)deployment: kubectl run jerry-nginx --image=nginx:1.12.2 showImg(htt...
摘要:命令用于程序在負(fù)載加重或縮小時(shí)進(jìn)行擴(kuò)容或縮小,我們通過(guò)一些實(shí)際例子來(lái)觀察命令到底能達(dá)到什么效果。 kubectl scale命令用于程序在負(fù)載加重或縮小時(shí)進(jìn)行pod擴(kuò)容或縮小,我們通過(guò)一些實(shí)際例子來(lái)觀察scale命令到底能達(dá)到什么效果。 命令行創(chuàng)建一個(gè)deployment: kubectl run jerry-nginx --image=nginx:1.12.2 showImg(htt...
摘要:默認(rèn)監(jiān)聽在端口,所以我們把宿主機(jī)的端口映射到容器的端口用下面的命令可以看到正在運(yùn)行中的容器這時(shí)如果你用瀏覽器訪問(wèn),就能看到我們剛才創(chuàng)建的頁(yè)面。這時(shí)如果刷新瀏覽器,就可以看到更新的內(nèi)容。 早在 Docker 正式發(fā)布幾個(gè)月的時(shí)候,LeanCloud 就開始在生產(chǎn)環(huán)境大規(guī)模使用 Docker,在過(guò)去幾年里 Docker 的技術(shù)棧支撐了我們主要的后端架構(gòu)。這是一篇寫給程序員的 Docker ...
閱讀 2771·2019-08-30 15:55
閱讀 1872·2019-08-30 15:53
閱讀 2733·2019-08-29 18:38
閱讀 982·2019-08-26 13:49
閱讀 551·2019-08-23 15:42
閱讀 3261·2019-08-22 16:33
閱讀 1062·2019-08-21 17:59
閱讀 1145·2019-08-21 17:11