持續集成與持續部署寶典Part 3:建立集成環境

兩萬餘字的系列乾貨長文,攻下持續集成與持續部署!docker


經過前兩篇文章《持續集成與持續部署寶典Part 1:將構建環境容器化》和《持續集成與持續部署寶典Part 2:建立持續集成流水線》,咱們使用Docker建立了一個集中管理的構建環境,它能夠應用到任意數量的機器上。接着,咱們將環境設置到了Jenkins CI上,自動化處理了源代碼的持續構建、打包和測試。在本章中,咱們將進一步對流水線進行研究(以下所示),瞭解如何將項目持續部署到一個長時間運行的測試環境中。除了自動驗收測試外,它還將容許人工測試代碼。有了這樣的環境,你就能夠在產品投入生產以前讓你的客戶或者QA(質量管理員)看到最新的變化。此外,它仍是一個構建和部署到生產環境的好方法,咱們將這一章中進行介紹。數據庫

建立應用程序環境瀏覽器

在咱們構建而且測試了應用程序後,能夠將它部署到一個長期運行的、潛在面向外部的環境中。這種環境要容許客戶或者QA在產品投入生產前查看和測試最新的更改,它也是生產過程當中一個重要步驟。有了它,咱們可以發如今自動化集成測試中會隱藏起來、只有在真實環境才能發現的bug。咱們一般把這樣的環境稱爲QA或集成環境,固然你也能夠本身命名。咱們將經過如下步驟來建立集成環境:安全

  1. 在Rancher中建立一個集成環境
  2. 定義Docker Compose以及Rancher Compose模板
  3. 用Rancher建立應用程序堆棧
  4. 用Rancher和AWS Route53管理DNS記錄
  5. 添加對HTTPS的支持

在Rancher中建立一個集成環境服務器

在Rancher UI中,在左上角選擇Manage Environments 以及 Add Environment,會出現下面屏幕顯示的內容,添加Name(Integration),給每一個環境添加必定的描述。你還須要選擇有權訪問環境的用戶和組織清單。負載均衡

在環境設置好後,在屏幕左上角的下拉菜單中選擇Integration(集成)環境。如今咱們能夠爲集成環境建立應用程序堆棧了。在這以前,咱們先了解一下Rancher部署的API密鑰。從頂部菜單中選擇API > Key,接着Add Account API Key。會出現一個彈出式屏幕,在這裏你能夠建立一個命名的API密鑰對。在後續步驟中咱們須要使用到Rancher Compose建立測試環境。咱們將建立名爲JenkinsKey的密鑰對,由Jenkins實例運行Rancher Compose。記得要留下密鑰(access key)和密碼(secret key)以備後用,以後不會再顯示這些值了。請注意,API密鑰匙是針對於特定環境的,所以須要爲每一個環境建立一個新密鑰。dom

定義Compose模板curl

在上篇文章中,咱們建立了一個Docker Compose模板定義咱們的項目所需的容器類型。Compose模板(docker-compose.yml)以下圖所示。如今咱們將使用與以前相同的Docker Compose模板,不過增長了auth-lb服務。這會在咱們的go-auth服務前添加一個負載均衡器,並將全部運行該服務的容器的流量分開。在服務前添加一個負載均衡器對於確保可用性和擴展性來講相當重要,由於即便一個(或多個)服務容器死亡,它依然可以提供流量。另外,它還能將負載擴展到多個容器上,這些容器可能在多個主機上運行。我在本文中使用的Rancher舊版本不支持3版本的compose文件,所以咱們必需要設置版本爲2,刪除錯誤的環境變量,修正go-auth的版本。測試

咱們在多主機環境中使用的是Rancher Compose啓動環境,這樣更貼近生產環境,容許咱們測試和各類服務的集成,例如Rancher和Docker Hub等等。和咱們以前不一樣,咱們之前基於Docker Compose的環境是明確設計成獨立於外部服務,在CI服務器自己上啓動的,無需將鏡像推送到dockerhub。加密

如今咱們使用Rancher Compose啓動一個多主機測試環境來代替Docker Compose,咱們還須要定義一個rancher compose模板。建立一個叫作rancher-compose.yml的文件,添加如下內容。在這個文件中,咱們定義了兩個須要用到auth-service的容器、一個運行數據庫的容器以及另外一個運行負載均衡器的容器。

接下來咱們將向auth-service中添加一個健康檢查(health check),確保咱們能夠檢測到容器什麼時候啓動以及可以響應請求。爲此,咱們使用go-auth服務的/health URI。rancher-compose.yml的auth-service部分如今應該是這樣的:

咱們如今給每2秒(2000毫秒)運行的服務容器的9000端口定義一個健康檢查。該檢查會向/health URL發出http請求,連續3次檢查失敗會將容器標記爲不健康,而2次成功則標記爲健康。

一樣,咱們須要將lb_config部分添加到負載均衡器rancher-compose.yml文件中,讓它知道針對哪一個服務(GoAuth),須要公開哪些端口,以及如何驗證負載均衡器以後實例的健康狀況。rancher-compose.yml文件的auth-lb部分應該以下所示:

用Rancher CLI建立一個應用程序堆棧

如今咱們定義好了模板,就可使用Rancher Compose來啓動咱們的環境了。接下來,只須要檢出go-message項目並從Rancher UI中下載Rancher CLI便可。關於如何在開發機器上設置rancher-compose,能夠參考這裏的說明:

https://rancher.com/docs/ranc...。 運行 ./rancher config爲接下來的命令指定rancher url、access key、secret key和默認環境。

在Rancher CLI設置好後,你可使用下面的建立命令來設置你的集成環境。這裏的命令是假設docker-compose.yml和rancher-compose.yml文件是在當前目錄下的。

在UI中,你如今應該可以看到你的項目的堆棧和服務了。注意,create命令在建立堆棧的同時還會啓動全部的服務。

要確保一切正常,找到運行「authlb」服務的主機的公共IP,使用下面的命令建立一個用戶。你應該會獲得200 OK的回覆,而重複上述請求會返回409錯誤,提示與數據庫現有用戶出現衝突。到這爲止,咱們就爲應用程序提供了一個基本的集成環境,這也是一個長期運行的環境。

管理DNS記錄

如今這個環境是須要長期運行而且對外開放的,咱們將會使用DNS條目以及HTTPS。這樣咱們可以安全地在企業防火錢以外分發應用程序,並容許更多的臨時用戶依賴持久的DNS而不是可能會改變的IPs。你可使用你所選擇的DNS提供者。而咱們在這裏將演示如何在Amazon Route53中設置DNS條目。進入到AWS Console > Route53 > Hosted Zones,選擇Create Hosted Zone。在hosted zone(託管區域)中,你須要指定你選擇的域名(好比gomessenger.com)。當你在AWS Console中時,你還能夠爲Rancher建立用戶進行Route53的更新。轉到AWS Console > IAMS > Users,選擇Create New Users。記住用戶的Access Key和Secret Key,以後咱們還會使用到。在用戶建立後,你須要將AmazonRoute53FullAccess策略添加到用戶中,這樣它就能夠對route53進行更新。

如今咱們已經有了Hosted Zone以及IAMs用戶設置,咱們能夠將Route53集成添加到咱們的 Rancher Server(rancher服務器)。有關如何操做的詳細說明能夠在這裏找到:https://rancher.com/introduci... 。簡而言之,你須要在rancher服務器上瀏覽Catalog > Library並選擇Route 53 DNS。系統會要求你指定以前設置的Hosted Zone,以及具備Route53訪問權限的Rancher IAMs用戶的AWS Access和Secret Keys。輸入信息而且單擊建立後,你應該能看到在你的環境中有一個包含route53服務的新堆棧。

該服務會監聽Rancher事件,捕獲任何任何負載均衡器實例的啓動和終止。有了這些信息,它將自動爲全部運行負載均衡器容器的主機建立DNS條目。DNS條目的格式是[Loadbalancer].[stack].[env].[domain],好比:

goauth.integration.testing.gomessenger.com.

隨着愈來愈多的容器在各個Rancher計算節點上啓動與關閉,Route53服務將保持DNS記錄的一致性。這對咱們的集成測試環境來講相當重要,咱們稍後就會看到它的重要性。咱們須要從新啓動環境容器來,以便將更新做爲持續部署的一部分。經過使用Route53 DNS集成,咱們沒必要再爲給咱們的客戶和測試人員獲取最新主機名而擔憂了。

啓用HTTPS

在爲咱們的環境建立DNS記錄後,讓它支持HTTPS協議會是一個不錯的選擇。首先,咱們須要拿到咱們域名的SSL證書。你能夠從不少可信任的證書頒發機構中選擇一個購買域名的SSL證書。若是你沒有證書,能夠生成自簽名(self-signed)證書來完成設置,在一段時間後把它更換成可信任的證書。自簽名證書的含義是:任何用戶都會在瀏覽器中看到「此鏈接不可信」的警告,但通訊仍然是加密的。那麼要生成自簽名證書,首先須要生成ssl密鑰,它能夠由openssl的genrsa命令實現。而後你能夠用這個密鑰文件,使用req命令生成證書。下面列出了這一步驟。你也能夠將證書的sha256指紋打印並儲存下來,這樣就手動地保證了在發出HTTPS請求時向你顯示相同的證書。在缺乏可信證書的狀況下,手動匹配指紋是避免中間人攻擊的惟一方法。

如今你已經擁有了證書和私鑰文件,下面須要講這些文件上傳到Rancher中。咱們能夠在Rancher UI的Infrastructure選項卡,單擊Certificates部分的Add Certificate按鈕上傳證書。你還須要給你的證書起一個有意義的名稱,填寫描述。接着分別在Private Key和Certificate字段複製粘貼integration.gomessenger.com.key和integration.gomessenger.com.crt的內容(或者選擇Read from File從文件讀取)。在完成了表單後,點擊保存,等待片刻證書便生效了。

證書激活以後,咱們能夠將HTTPS端點添加到咱們的環境中。想要作到這一點,咱們必須修改rancher-compose文件,讓它包含SSL端口配置。咱們將第二個端口(9001)添加到ports部分,讓咱們的環境能夠在負載均衡器以外訪問,而且使用io.rancher.loadbalancer.ssl.ports標籤指定'9001'是具備SSL終止的公共負載均衡器端口。

此外,由於咱們在負載均衡器處終止了SSL,咱們可使用原9000端口上的常規HTTP將請求發送到咱們的實際服務容器中。咱們使用了io.rancher.loadbalancer.target.auth-service標籤來指定從9001到9000的映射。

咱們還須要更新rancher-compose文件指定SSL證書,該證書是咱們在負載均衡器服務中針對SSL終止要使用的。將咱們以前上傳的證書名稱添加到default_cert上。有了這些更改,你還須要刪除並從新建立堆棧,這是由於目前尚未辦法將這些屬性添加到已有的堆棧上。

如今可使用curl命令確保一切正常了。當你使用https協議說明符和9001端口嘗試相同的命令時,應該會看到一個failure,說你使用了一個不受信任的證書。你可使用--insecure開關關閉可信證書檢查,而且在沒有證書的狀況下使用https。

總結

在本文中,咱們開始了持續部署流水線的建立,而且完成了第一部分的重要工做——建立應用程序環境,內容包含在Rancher中建立一個集成環境、定義Compose模板、用Rancher CLI建立一個應用程序堆棧、管理DNS記錄、啓用HTTPS。

下篇文章將是本系列文章的最後一篇,完成建立持續部署流水線的最後工做,敬請期待!

相關文章
相關標籤/搜索