您好,登錄后才能下訂單哦!
原文鏈接: https://yq.aliyun.com/articles/631182?spm=a2c4e.11153940.bloghomeflow.78.7ada291a5uIWrz
現(xiàn)在Kubernters越來越熱了,很多公司都在開發(fā)、測試以及生產(chǎn)上逐步使用上了Kubernetes作為容器集群管理平臺。最新調(diào)查顯示,在5000+的大型企業(yè)中,有超過40%的生產(chǎn)環(huán)境已經(jīng)使用上Kubernetes(*)。但是一般的理解,Kubernetes是更偏運維類的系統(tǒng),開發(fā)似乎不用太關注,是否是這樣?答案是否定的!
雖然說,多數(shù)開發(fā)者可以不用改動原有應用就可以把這些應用遷移/搬移到容器平臺里(這里用“搬移”意思是,更多的是使用者把容器直接作為虛機對待),但是如果需要更好的使用Kubernetes,則開發(fā)者需要理解kubernetes的一些架構以及原理,并對程序架構以及一些實現(xiàn)細節(jié)作出調(diào)整。本文從一些細節(jié)上解釋一下程序需要做出的適配點,以更好的把程序運行到Kuberentes上。
在程序中,要做到把程序間的相互調(diào)用做到不寫死IP,而且要能適配容器的IP的漂移。要做到IP無關性,可以通過以下幾個方式:
通過微服務的服務注冊與發(fā)現(xiàn)的方式來獲取對端IP。注意這個是容器IP,一般在集群外是不可見的。如果還有Kubernetes集群外的應用,要直接訪問POD(特別是Springcloud類應用混布),則需要考慮網(wǎng)絡模型的問題。在阿里云里,提供了Terway的網(wǎng)絡模式,利用了彈性網(wǎng)卡技術(ENI)可以直接支持ECS與POD的互通,很好的支持程序往容器化演進。
(terway已經(jīng)開源
https://github.com/AliyunContainerService/terway
,求star)
通過Kubernetes的SLB Service或者Ingress的方式訪問POD。特別是對于傳統(tǒng)非改造的的應用直接搬遷,需要使用這個模式。因為SLB/Ingress的對外IP是固定。如果是集群中訪問,則使用service的域名方式訪問更好。
通常,原有的程序都是將相關配置寫到本地配置文件的。到了容器特別是Kubernetes后,這個方式務必改變,因為程序的啟動過程已經(jīng)無法人為干預,同時需要能適配支持程序?qū)嵗纳炜s,而不是固定將程序設計成固定的實例數(shù)。
對于啟動時的配置以及環(huán)境變量配置,盡可能配置到configmap以及secret中。這里需要注意的是,configmap/secret的改動是無法改變已經(jīng)運行的容器的環(huán)境變量。如果是通過volume方式使用,則對應的文件在不確定時間時在已有的程序中生效。所以對于configmap/secret的使用,后續(xù)的變更都要通過rolling upgrade的方式使其新配置生效
對于運行態(tài)的配置變更,需要利用微服務體系中的配置中心的概念來處理,需要其更好支持以下核心特性:
必須支持動態(tài)推送
必須支持版本管理
必須支持容錯和恢復
支持安全通信
在阿里云上可以免費使用配置中心:ACM,其已經(jīng)很好的提供了以上特性。并且其已經(jīng)開源出來,叫NACOS(
https://nacos.io)
雖然很多時候我們聽到容器的宣傳是“秒級”啟動,但是對于程序如何在容器/Kubernetes里啟動,是需要程序有明確的認識的。
這里需要特別注意的是:“秒級啟動”不能等同于“秒級可用”。因為程序在容器的啟動過程大體如下:
cdn.com/1e9b2c7cc652ee02326a2f63d4076cf8abda4a32.png">
這里標示的時間級別以一個普通tomcat業(yè)務程序為例(例如其需要連接mysql等)
所以開發(fā)者需要考慮這個過程對于程序的影響
以往健康檢查的概念是做health check,但是到Kubernetes則變?yōu)榱藘芍氐臋z查,分別為:liveness和readiness,為什么呢?從上面的程序啟動過程可以看見,容器啟動并不代表程序已經(jīng)可以被訪問,特別是對于java類程序,還有springboot/tomcat等的啟動過程,這個過程也是比較費時的。如果在這個時候去訪問程序則是很容易timeout的。
Liveness: 確保應用還存活,不然Kubernetes就會重啟這個POD
Liveness prob合理設置initialDelaySeconds值,避免不斷重啟POD(考慮使用99%的最大延遲最為配置值比較合適)
Readiness: 確保應用已經(jīng)可以接收流量了,不然不會分發(fā)流量給他,常見問題如:首次訪問超時
用于檢查的三種類型探針:http, cmd, tcp,可以根據(jù)程序情況使用
基于這個設計原則,程序需要考慮提供兩個被檢查的接口。一個即刻歐用于判斷程序是否存活,例如直接返回http 200。一個接口用于判斷程序是否能正常處理請求,特別是對于程序依賴連接數(shù)據(jù)庫、redis等外資源才能提供服務,則這個接口需要去檢查這些外部資源是否可以使用。這兩個接口是明確的含義,千萬別用反了。
對于IT系統(tǒng)架構越來越復雜的越來越智能的今天,開發(fā)者已經(jīng)可以把更多的精力放在了業(yè)務開發(fā)上,但是從架構設計上,還是需要對Kubernetes有個深刻的認識,以免違背Kubernetes的設計原則。
(*) 數(shù)據(jù)來源: https://www.cncf.io/blog/2018/08/29/cncf-survey-use-of-cloud-native-technologies-in-production-has-grown-over-200-percent/
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。