思路:環(huán)境遷移的核心是服務(wù)運(yùn)行實(shí)例+流量切換
對(duì)于k8s來(lái)說(shuō),就是先執(zhí)行Deployment部署實(shí)例蝗羊,然后配置Ingress暴露服務(wù),驗(yàn)證沒(méi)問(wèn)題后再把原有域名解析切換到新的服務(wù)
過(guò)程:
在集群內(nèi)部署注冊(cè)中心,各項(xiàng)目組部署應(yīng)用哮翘,并注冊(cè)服務(wù)到集群內(nèi)的新注冊(cè)中心
部署完成后,驗(yàn)證服務(wù)是否正常(存在依賴(lài)關(guān)系的應(yīng)用需全部部署)
驗(yàn)證完成后毛秘,修改域名指向饭寺,進(jìn)行外部流量切換
流量切分完畢后阻课,原 dev/UAT 環(huán)境停機(jī),并回收資源
分布式環(huán)境服務(wù)之間都有著各種的調(diào)用關(guān)系艰匙,所以環(huán)境遷移要保證新環(huán)境有依賴(lài)的服務(wù)實(shí)例可調(diào)用限煞,所以可以分成兩步:
1:先部署所有服務(wù)實(shí)例到新環(huán)境
先部署實(shí)例會(huì)遇到的困難:
1.1 :普通的服務(wù)間調(diào)用都是由外部發(fā)起,即服務(wù)通過(guò)內(nèi)外網(wǎng)域名等方式暴露地址出去之后才會(huì)有流量员凝,由于這里我們先只部署署驻,還沒(méi)暴露服務(wù),所以不用擔(dān)心這次部署會(huì)因?yàn)橥獠苛髁吭斐蓡?wèn)題
1.2: 部署的服務(wù)可能有消費(fèi) mq 消息健霹,定時(shí)任務(wù)等自發(fā)起的流量旺上,這時(shí)我們要保證新部署到新環(huán)境的實(shí)例能屏蔽這部分流量,防止跟外面已經(jīng)在跑的環(huán)境沖突消費(fèi)骤公,
1.2.1:這里以 xxl-job 為例抚官。假如服務(wù)用了 xxl-job,部署到新環(huán)境有必要不運(yùn)行定時(shí)任務(wù)阶捆,可以通過(guò)修改配置實(shí)現(xiàn)
-Dxxl.job.admin.addresses=
這樣就可以保證凌节,部署到新環(huán)境的服務(wù)不會(huì)運(yùn)行 xxl-job 的定時(shí)任務(wù),其他定時(shí)任務(wù)也可以通過(guò)類(lèi)似的方式修改達(dá)到目的
1.2.2:這里以 RabbitMQ 為例洒试。假如服務(wù)用了 xxl-job倍奢,部署到新環(huán)境有必要不消費(fèi)隊(duì)列里的消息,可以通過(guò)修改配置實(shí)現(xiàn)
-Dspring.rabbitmq.virtual-host=404
即配置一個(gè)不存在的 vhost垒棋,這樣服務(wù)啟動(dòng)后就不會(huì)消費(fèi)消息卒煞,而且不影響服務(wù)啟動(dòng)成功
或者其他方式,例如注釋 RabbitListener 代碼叼架,缺點(diǎn)是需要改代碼
注意:以上配置一般通過(guò) - D 覆蓋畔裕,這樣可以不用改 Apollo 上的配置,因?yàn)?Apollo 的配置外面正常跑的實(shí)例還在用乖订,不要互相影響扮饶。
1.3 注冊(cè)中心
如果服務(wù)用到注冊(cè)中心,如 Eureka乍构,需要先修改Eureka的注冊(cè)中心地址
1.4 恢復(fù)配置
等所有服務(wù)都在新環(huán)境部署新實(shí)例后甜无,則可以恢復(fù)原來(lái)的配置讓實(shí)例正常的消息 mq 和定時(shí)任務(wù)
2: 新增路由
第一步都完成之后,所有的服務(wù)實(shí)例都部署到新的環(huán)境里了哥遮,服務(wù)注冊(cè)中心上也有相應(yīng)的實(shí)例岂丘,這時(shí)候我們可以開(kāi)始驗(yàn)證了
對(duì)于舊服務(wù),一般都有自己正在使用的域名眠饮,這時(shí)我們可以對(duì)原有域名在新環(huán)境新增一個(gè)應(yīng)用路由奥帘,用于暴露部署的服務(wù)實(shí)例
部署完后可以通過(guò)本地綁 hosts 的方式進(jìn)行訪(fǎng)問(wèn),域名綁定頁(yè)面上的這個(gè)入口 ip 地址即可
對(duì)于 https 的場(chǎng)景仪召,使用命令驗(yàn)證 https 是否生效:
curl --resolve domain:443:ip /check_status
驗(yàn)證沒(méi)問(wèn)題后讓運(yùn)維切域名流量到指定的 ip
優(yōu)勢(shì):
以上遷移分為 2 個(gè)步驟寨蹋,業(yè)務(wù)方可以只關(guān)注第二步即驗(yàn)證確保遷移沒(méi)問(wèn)題牲距,第一步可以交由專(zhuān)人來(lái)部署钥庇,職業(yè)分明,降低業(yè)務(wù)方接入的成本
回顧:
以上過(guò)程评姨,新舊 2 套環(huán)境都是完全隔離萤晴,互不影響吐句,只有等新環(huán)境的驗(yàn)證沒(méi)問(wèn)題了才切換流量到新環(huán)境,最大程度地避免了遷移環(huán)境期間的故障店读。不僅可用于遷移效能平臺(tái)嗦枢,遷移其他環(huán)境大體思路也可參考屯断,包括生產(chǎn)切換環(huán)境也可以考慮使用
總結(jié):
此方案并不要求新舊兩套環(huán)境之間的服務(wù)網(wǎng)絡(luò)打通,但是對(duì)于數(shù)據(jù)庫(kù) mysql殖演,redis氧秘,消息隊(duì)列 mq 這些中間件,是需要在新環(huán)境打通原有的網(wǎng)絡(luò)趴久,因?yàn)檫@些都涉及持久層丸相,遷移起來(lái)可能比較困難彼棍。如果要遷移數(shù)據(jù)庫(kù)可以等流量切到新環(huán)境后,在新環(huán)境部署新的數(shù)據(jù)庫(kù)座硕,然后舊數(shù)據(jù)庫(kù)單向同步數(shù)據(jù)到新數(shù)據(jù)庫(kù),然后再流量低峰期修改連接的數(shù)據(jù)庫(kù)到新環(huán)境的數(shù)據(jù)庫(kù)
而對(duì)于注冊(cè)中心 Eureka 和 xxl-job缆蝉,這些組件要求先部署到新環(huán)境