Openshift上使用Nginx Pod作灰度發(fā)布

參考文章:使用 Nginx 實(shí)現(xiàn)灰度發(fā)布

什么是灰度發(fā)布

  • 【百度百科】灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間步责,能夠平滑過渡的一種發(fā)布方式悼沿。 在其上可以進(jìn)行A/B testing卫键,即讓一部分用戶繼續(xù)用產(chǎn)品特性A潜慎,一部分用戶開始用產(chǎn)品特性B抹剩,如果用戶對B沒有什么反對意見嗽测,那么逐步擴(kuò)大范圍绪励,把所有用戶都遷移到B上面來。
  • 除了AB test灰度發(fā)布另一種思想是唠粥,只發(fā)布給一小部分用戶疏魏,如:App在發(fā)布之前,針對性的給一小批用戶測試下新版本晤愧,用小流量發(fā)布的方式來檢驗(yàn)新版會不會有問題大莫。
  • 灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)养涮、調(diào)整問題葵硕,以保證其影響度眉抬。

Openshift上實(shí)現(xiàn)藍(lán)綠部署

image.png

在openshift上的部署兩個版本的Service:service01, service02贯吓。在創(chuàng)建Route的時候懈凹,可以非常簡單地指定同一個Route流量訪問兩個service的百分比service01(25%流量), service02(75%流量)。所有請求該Route的流量會被按指定的比例訪問后service悄谐。


配置發(fā)布75%-25%.png

Route詳情展示.png

對應(yīng)的Route yaml配置文件如下:

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: grey-test
  name: grey-test
  namespace: grey
spec:
  alternateBackends:
    - kind: Service
      name: service_v2
      weight: 75
  host: grey-test.sample.com
  port:
    targetPort: web
  to:
    kind: Service
    name: service_v1
    weight: 25
  wildcardPolicy: None

金絲雀發(fā)布的不足

  • openshift中Route自帶的金絲雀發(fā)布配置非常簡單介评,也很實(shí)用。但是它沒辦法對請求的流量進(jìn)行定義控制爬舰。
  • 例如根據(jù)IP们陆,指定IP為'202.38.12.10'的用戶訪問service_v2,那么Openshift中Route自帶的分流就無法實(shí)現(xiàn)。
  • 所以必須對特定用戶訪問特定版本的問題情屹,我們需要尋求其它辦法坪仇。使用傳統(tǒng)的方法,Nginx是一個比較常見的選擇垃你。在openshift的灰度方案中椅文,我們也嘗試使用Nginx來實(shí)現(xiàn)對特定用戶的灰度發(fā)布。

Nginx配置實(shí)現(xiàn)灰度發(fā)布

  1. 創(chuàng)建兩個upstream
  2. 針對remote_addr進(jìn)行分流惜颇,默認(rèn)訪問default的upstream皆刺,如果ip為'202.38.12.10',則訪問api_v2的upstream凌摄。

無需多解釋羡蛾,直接上配置。

upstream default{
    server 172.30.198.194:8080 max_fails=1 fail_timeout=60;
}

upstream api_v2{
    server 172.30.198.194:8080 max_fails=1 fail_timeout=60;
}

server {
  listen 80;
  server_name  _;

  set $group default;
  if ($remote_addr ~ "202.38.12.10") {
      set $group api_v2;
  }

location / {                       
    proxy_pass http://$group;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    index  index.html index.htm;
  }
}

對配置作進(jìn)一步優(yōu)化

怎么獲取客戶端IP锨亏?

  • 如果直接訪問Nginx服務(wù)的話痴怨,在Nginx上通過 $remote_addr 能夠獲得客戶端IP,但是我們知道在Openshift高可用部署中器予,我們使用了負(fù)載均衡器浪藻。通過負(fù)載均衡器轉(zhuǎn)發(fā)后,Nginx webserver獲得的$remote_addr其實(shí)是負(fù)載均衡器的IP劣摇,而不是客戶端真實(shí)IP珠移。
  • 為了能在Nginx webserver中獲得客戶端IP,需要在附加HTTP頭字段開啟客戶端真實(shí)IP末融。同時在Nginx的配置中使用$http_x_forwarded_for來檢查客戶端IP.


    IaaS上創(chuàng)建負(fù)載均衡器.png
  • 新的配置如下
upstream default{
    server 172.30.198.194:8080 max_fails=1 fail_timeout=60;
}

upstream api_v2{
    server 172.30.198.194:8080 max_fails=1 fail_timeout=60;
}

server {
  listen 80;
  server_name  _;

  set $group default;
  if ($http_x_forwarded_for ~ "202.38.12.10") {
      set $group api_v2;
  }

location / {                       
    proxy_pass http://$group;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    index  index.html index.htm;
  }
}

如何實(shí)現(xiàn)高可用钧惧?

這個非常簡單,只需要在Openshift上將為Nginx的DeploymentConfig增加Pod數(shù)增就可以了勾习。

我要有多個IP加入白名單浓瞪,有沒有更方便的配置方法?

Nginx有map函數(shù)巧婶,能將IP與訪問的后臺服務(wù)乾颁。

map $http_x_forwarded_for $group {
        default 172.30.198.194:8080;
        ~202.38.12.10 172.30.198.194:8080;
    }
server{
    listen  8080;
    server_name _; 
    location /{
        proxy_pass http://$group;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        index index.html index.htm;
    }
} 

明明有域名為啥只能是IP涂乌?

  • Openshift對于Service除了有固定的IP外,還有固定的域名英岭,一般域名形式為:servername-projectname.svc湾盒。我們能否用域名代替IP,讓這個配置的可讀性更高,什么IP訪問什么服務(wù)一目了然诅妹。
  • 但是直接將IP更改為對應(yīng)Service的域名罚勾,在啟動Nginx時會報無法解析域名的錯誤。
  • Nginx需要在map配置中解析域名需要指定dns吭狡。
  • 最終配置如下(172.30.0.1為Openshif集群默認(rèn)的內(nèi)部DNS尖殃,可在master的配置文件中查看):
resolver 172.30.0.1;
map $http_x_forwarded_for $group {
        default api_v1.server.svc:8080;
        ~202.38.12.10 api_v2.server.svc:8080;
    }
server{
    listen  8080;
    server_name _; 
    location /{
        proxy_pass http://$group;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        index index.html index.htm;
    }
} 

Openshift中對于443端口的負(fù)載均衡器使用的是TCP協(xié)議,無法轉(zhuǎn)發(fā)X_forward_for划煮,那https服務(wù)要怎么弄送丰?

如何應(yīng)用請求為Https,無法直接使用TCP負(fù)載均衡器弛秋,而Openshift部署時是通過TCP負(fù)載均衡器來作443端口的負(fù)載的器躏。

  • 這就需要創(chuàng)建一個Https負(fù)載均衡器, 后臺Openshift Nginx的Route設(shè)置為正常的Http铐懊。其它配置一樣邀桑。既能將clientIP傳給后臺webserver,同時又滿足了該業(yè)務(wù)請求為Http協(xié)議科乎。
  • 最終的流程圖如下:


    Nginx作負(fù)載均衡器圖.png

拓展思考

  • 是否一定要在Openshift上部署呢?【必然不需要】
  • Nginx實(shí)現(xiàn)灰度發(fā)布除了支持ip還支持啥壁畸?【對Header頭信息等】
  • 除了對頁面HTTP請求實(shí)現(xiàn)這種灰度,那么對于TCP服務(wù)呢茅茂,比如說數(shù)據(jù)庫捏萍?【也是OK的】
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市空闲,隨后出現(xiàn)的幾起案子令杈,更是在濱河造成了極大的恐慌,老刑警劉巖碴倾,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗噩,死亡現(xiàn)場離奇詭異,居然都是意外死亡跌榔,警方通過查閱死者的電腦和手機(jī)异雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僧须,“玉大人纲刀,你說我怎么就攤上這事〉F剑” “怎么了示绊?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵锭部,是天一觀的道長。 經(jīng)常有香客問我面褐,道長拌禾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任盆耽,我火速辦了婚禮蹋砚,結(jié)果婚禮上扼菠,老公的妹妹穿的比我還像新娘框沟。我一直安慰自己飞涂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咙轩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巧还。 梳的紋絲不亂的頭發(fā)上穗泵,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音盗尸,去河邊找鬼柑船。 笑死,一個胖子當(dāng)著我的面吹牛泼各,可吹牛的內(nèi)容都是我干的鞍时。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼扣蜻,長吁一口氣:“原來是場噩夢啊……” “哼逆巍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起莽使,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锐极,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芳肌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灵再,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年亿笤,在試婚紗的時候發(fā)現(xiàn)自己被綠了翎迁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡责嚷,死狀恐怖鸳兽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罕拂,我是刑警寧澤揍异,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布全陨,位于F島的核電站,受9級特大地震影響衷掷,放射性物質(zhì)發(fā)生泄漏辱姨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一戚嗅、第九天 我趴在偏房一處隱蔽的房頂上張望雨涛。 院中可真熱鬧,春花似錦懦胞、人聲如沸替久。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚯根。三九已至,卻和暖如春胀糜,著一層夾襖步出監(jiān)牢的瞬間颅拦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工教藻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留距帅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓括堤,卻偏偏與公主長得像碌秸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痊臭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容