<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
隨著小步快跑、快速迭代的開發模式被越來越多的網際網路企業認同和採用,應用的變更、升級頻率變得越來越頻繁。為了應對不同的升級需求,保證升級過程平穩順利地進行,誕生了一系列的部署釋出模式。
隨著越來越多的應用被容器化,如何方便地讓容器應用平穩順利升級受到了廣泛關注。本文將介紹 k8s 中不同部署形式下應用的升級方法,並重點介紹如何對 Deployment 中的應用實施捲動釋出(本文所作的調研基於k8s 1.13
)。
在 k8s 中,pod 是部署和升級的基本單位。一般來說,一個 pod 代表一個應用範例,而 pod 又會以 Deployment、StatefulSet、DaemonSet、Job 等形式部署執行,下面依次介紹在這些部署形式下 pod 的升級方法。
Deployment 是 pod 最常見的部署形式,這裡將以基於 spring boot 的 java 應用為例進行介紹。該應用是基於真實應用抽象出來的簡單版本,非常具有代表性,它有如下特點:
為了讓具有上述特點的應用實現零宕機時間和無生產中斷的升級,需要精心地設定 Deployment 中的相關引數。這裡和升級有關的設定如下(完整設定參見 spring-boot-probes-v1.yaml)。
kind: Deployment ... spec: replicas: 8 strategy: type: RollingUpdate rollingUpdate: maxSurge: 3 maxUnavailable: 2 minReadySeconds: 120 ... template: ... spec: containers: - name: spring-boot-probes image: registry.cn-hangzhou.aliyuncs.com/log-service/spring-boot-probes:1.0.0 ports: - containerPort: 8080 terminationGracePeriodSeconds: 60 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 failureThreshold: 1 livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 40 periodSeconds: 20 successThreshold: 1 failureThreshold: 3 ...
通過 strategy 可以設定 pod 的替換策略,主要引數如下。
.spec.strategy.type
- 用於指定替換 pod 的策略型別。該引數可取值 Recreate 或 RollingUpdate,預設為 RollingUpdate。
.spec.strategy.rollingUpdate.maxSurge
- 指定在捲動更新過程中最多可建立多少個額外的 pod,可以是數位或百分比。該值設定得越大、升級速度越快,但會消耗更多的系統資源。.spec.strategy.rollingUpdate.maxUnavailable
- 指定在捲動更新過程中最多允許多少個 pod 不可用, 可以是數位或百分比。該值設定得越大、升級速度越快,但服務會越不穩定。通過調節 maxSurge 和 maxUnavailable,可以滿足不同場景下的升級需求。
樣例選擇了一個折中方案,將 maxSurge 設定為 3,將 maxUnavailable 設定為 2,平衡了穩定性、資源消耗和升級速度。
K8s 提供以下兩類探針:
探針的設定非常靈活,使用者可以指定探針的探測頻率、探測成功閾值、探測失敗閾值等。各引數的含義和設定方法可參考檔案 Configure Liveness and Readiness Probes。
樣例為目標容器設定了就緒探針和活性探針:
預設情況下,一旦新建立的 pod 變成就緒狀態 k8s 就會認為該 pod 是可用的,從而將老的 pod 刪除掉。但有時問題可能會在新 pod 真正處理使用者請求時才暴露,因此一個更穩健的做法是當某個新 pod 就緒後對其觀察一段時間再刪掉老的 pod。
引數 minReadySeconds 可以控制 pod 處於就緒狀態的觀察時間。如果 pod 中的容器在這段時間內都能正常執行,k8s 才會認為新 pod 可用,從而將老的 pod 刪除掉。在設定該引數時,需要仔細權衡,如果設定得過小,可能造成觀察不充分,如果設定得過大,又會拖慢升級進度。樣例將 minReadySeconds 設定成了 120 秒,這樣能保證處於就緒狀態的 pod 能經歷一個完整的活性探測週期。
當 k8s 準備刪除一個 pod 時,會向該 pod 中的容器傳送 TERM 訊號並同時將 pod 從 service 的 endpoint 列表中移除。如果容器無法在規定時間(預設 30 秒)內終止,k8s 會向容器傳送 SIGKILL 訊號強制終止程序。Pod 終止的詳細流程可參考檔案 Termination of Pods。
由於應用處理請求最長耗時 40 秒,為了讓其在關閉前能夠處理完已到達伺服器端的請求,樣例設定了 60 秒的優雅關閉時間。針對不同的應用,您可以根據實際情況調整 terminationGracePeriodSeconds 的取值。
上述設定能夠保證目標應用的平滑升級。我們可以通過更改 Deployment 中 PodTemplateSpec 的任意欄位觸發 pod 升級,並通過執行命令kubectl get rs -w
觀察升級行為。這裡觀察到的新老版本的 pod 副本數的變化情況如下:
應用的升級並不總會一帆風順,在升級過程中或升級完成後都有可能遇到新版本行為不符合預期需要回滾到穩定版本的情況。K8s 會將 PodTemplateSpec 的每一次變更(如果更新模板標籤或容器映象)都記錄下來。這樣,如果新版本出現問題,就可以根據版本號方便地回滾到穩定版本。回滾 Deployment 的詳細操作步驟可參考檔案 Rolling Back a Deployment。
StatefulSet 是針對有狀態 pod 常用的部署形式。針對這類 pod,k8s 同樣提供了許多引數用於靈活地控制它們的升級行為。好訊息是這些引數大部分都和升級 Deployment 中的 pod 相同。這裡重點介紹兩者存在差異的地方。
在 k8s 1.7 及之後的版本中,StatefulSet 支援 OnDelete 和 RollingUpdate 兩種策略型別。
可以通過引數.spec.updateStrategy.rollingUpdate.partition
實現只升級部分 pod 的目的。在設定了 partition 後,只有序號大於或等於 partition 的 pod 才會進行卷動升級,其餘 pod 將保持不變。
Partition 的另一個應用是可以通過不斷減少 partition 的取值實現金絲雀升級。具體操作方法可參考檔案 Rolling Out a Canary。
DaemonSet 保證在全部(或者一些)k8s 工作節點上執行一個 pod 的副本,常用來執行監控或紀錄檔收集程式。對於 DaemonSet 中的 pod,用於控制它們升級行為的引數與 Deployment 幾乎一致,只是在策略型別方面略有差異。DaemonSet 支援 OnDelete 和 RollingUpdate 兩種策略型別。
捲動更新 DaemonSet 的具體操作步驟可參考檔案 Perform a Rolling Update on a DaemonSet。
Deployment、StatefulSet、DaemonSet 一般用於部署執行常駐程序,而 Job 中的 pod 在執行完特定任務後就會退出,因此不存在捲動更新的概念。當您更改了一個 Job 中的 PodTemplateSpec 後,需要手動刪掉老的 Job 和 pod,並以新的設定重新執行該 job。
K8s 提供的功能可以讓大部分應用實現零宕機時間和無生產中斷的升級,但也存在一些沒有解決的問題,主要包括以下幾點:
範例設定:
livenessProbe: failureThreshold: 3 httpGet: path: /user/service/test port: 8080 scheme: HTTP initialDelaySeconds: 40 periodSeconds: 20 successThreshold: 1 timeoutSeconds: 1 name: dataline-dev ports: - containerPort: 8080 protocol: TCP readinessProbe: failureThreshold: 1 httpGet: path: /user/service/test port: 8080 scheme: HTTP initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1
經測試 , 再對sprintboot 應用進行更新時, 存取不再出現502的報錯。
更多關於阿里雲k8s服務springboot專案應用升級時出現502錯誤技術文章請檢視下面的相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45