Docker最全教程——從理論到實戰(六)

雪雁發表於2018-12-07

託管到騰訊雲容器服務

託管到騰訊雲容器服務,我們的公眾號“magiccodes”已經發布了相關的錄屏教程,大家可以結合本篇教程一起查閱。
 

自建還是託管?

在開始之前,我們先來討論一個問題——是自建容器服務還是託管到雲容器服務?
這裡筆者建議大家託管到雲容器服務。對於中小團隊來說,很多情況下,團隊中的運維人員是缺失的,或者運維人員的水平非常有限——大部分比網咖的網管就好那麼一點,從成本、安全(雲端產品往往提供了一些解決方案,比如許可權控制、災備、高可用、資料加密等)、擴充套件性的角度,使用雲容器服務更加靠譜和省事,而且是可以直接開箱即用的(可以直接跳過自建的初始化時間)。而且隨著生產力的繼續發展,人的成本一定會越來越高於機器的成本,而且目前已經是遠遠高於機器的成本了。因此,如何選擇,大家是否心中有數了呢?
接下來,我們結合官方資料進行一定的對比:

 

騰訊雲容器服務TKE對比自建容器服務

優勢
騰訊雲容器服務(TKE)
自建容器服務
簡單易用
簡化叢集管理
騰訊雲容器服務提供超大規模容器叢集管理、資源排程、容器編排、程式碼構建,遮蔽了底層基礎構架的差異,簡化了分散式應用的管理和運維,您無需再操作叢集管理軟體或設計容錯叢集架構,因此也無需參與任何相關的管理或擴充套件工作。
您只需啟動容器叢集,並指定想要執行的任務即可,騰訊雲容器服務幫您完成所有的叢集管理工作,讓您可以集中精力開發 Docker 化的應用程式。
自建容器管理基礎設施通常涉及安裝、操作、擴充套件自己的叢集管理軟體、配置管理系統和監控解決方案,管理複雜。
靈活擴充套件
靈活叢集託管,整合負載均衡
您可以使用容器服務靈活安排長期執行的應用程式和批量作業。您還可以使用 API 獲得最新的叢集狀態資訊,以便整合您自己的自定義計劃程式和第三方計劃程式。
騰訊雲容器服務與負載均衡整合,支援在多個容器之間分配流量。您只需指定容器配置和要使用的負載均衡器,容器服務管理程式將自動新增和刪除。另外騰訊雲容器服務可以自動恢復執行狀況不佳的容器,保證容器數量滿足您的需求,以便為應用程式提供支援。
需要根據業務流量情況和健康情況人工確定容器服務的部署,可用性和可擴充套件性差
安全可靠
資源高度隔離,服務高可用
容器服務在您自己的雲伺服器例項中啟動,不與其他客戶共享計算資源。
您的叢集在私有網路中執行,因此您可以使用您自己的安全組和網路 ACL,這些功能為您提供了高隔離水平,並幫助您使用雲伺服器構建高度安全可靠的應用程式。
容器服務採用分散式服務架構,保證服務的故障自動恢復、快速遷移;結合有狀態服務後端的分散式儲存,實現服務和資料的安全、高可用。
自建容器服務因其核心問題及 Namespace 不夠完善,租戶、裝置、核心模組隔離性都比較差
高效
映象快速部署,業務持續整合
騰訊雲容器服務執行在您的私有網路中,高品質的 BGP 網路保證映象極速上傳下載,輕鬆支援海量容器秒級啟動,極大程度降低了執行開銷,使您的部署更加專注於業務執行。
您可以在騰訊雲容器服務上部署業務,開發人員在 GitHub 或其他程式碼平臺提交程式碼後,容器服務可立即進行構建、測試、打包整合,將整合的程式碼部署到預釋出環境和現網環境上。
自建容器服務的網路無保證,因此無法保證使用映象建立容器的效率
低成本
容器服務免費騰訊雲容器服務沒有任何附加費用,您可以在容器中免費呼叫 API 構建您的叢集管理程式。您只需為您建立的用於儲存和執行應用程式的雲服務資源(例如雲伺服器、雲硬碟等)付費。
需要投入資金構建、安裝、運維、擴充套件自己的叢集管理基礎設施,成本開銷大

 

騰訊雲容器服務TKE監控與自建容器監控對比

騰訊雲容器服務監控為容器叢集、服務、例項提供資料收集和資料展示功能。使用容器服務監控,您可以檢視叢集、節點、服務、例項,容器近 30 個指標的監控統計資料,驗證叢集是否正常執行並建立相應告警,監控指標覆蓋面全,並且在持續增加中。具體如下所示:
 
 
 
 
優勢
騰訊雲容器服務(TKE)
自建容器服務
指標完整
涉及到叢集,服務,容器,pod 近 30 個指標
指標不完整,很多需要開發
搭建成本低
建立叢集時自帶
人工搭建,成本高
運維成本低
平臺助力運維,保證資料準確性
人工維護
儲存成本低
每個指標免費儲存 3 個月資料
根據儲存大小計算
擴充套件性高
平臺側會不斷完善和增加新的指標項
需要技術人員大量投入開發新指標
告警
問題排查手段
控制檯可以方便檢視容器 log, 並與 webshell 結合一鍵登入容器快速排查問題
需要手動登入到容器或者機器排查
 
 
 
 

關於騰訊雲容器服務

在使用雲端產品時,我們需要先了解該產品。
騰訊雲容器服務(Tencent Kubernetes Engine,即TKE)為使用者解決容器叢集的搭建以及運維管理工作,無縫銜接了騰訊雲的計算、網路、儲存、監控、安全能力,幫助使用者升級開發模式、變更應用交付、重構資料管理方式。騰訊雲容器服務提速應用部署、簡化叢集管理,助力企業快速上雲。
瞭解騰訊雲容器服務,會涉及到以下概念:
  • 叢集:是指容器執行所需雲資源的集合,包含了若干臺雲伺服器、負載均衡器等騰訊雲資源。
  • 節點:一臺已註冊到叢集內的雲伺服器。
  • 服務:由多個相同配置的容器和訪問這些容器的規則組成的微服務。
  • 映象Docker映象,用於部署容器服務,每個映象有特定的唯一標識(映象的Registry地址+映象名稱+映象Tag)。
騰訊自今年起,對騰訊雲投入了大量的資源,並且給予了前所未有的重視和支援。筆者前不久受邀參與了騰訊雲TKE專場技術交流會,這裡分享幾張照片給大家:

騰訊與容器服務

騰訊在很早的時候就已經開始使用容器服務了,並且根據內部訊息透露,騰訊的新業務基本上均使用容器服務進行託管,而舊有業務也在逐步遷移到容器服務之中。比如大家所熟悉的LOL(英雄聯盟),就使用了大量的容器例項用於構建和託管相關服務。
眾所周知,一個複雜遊戲的構建是非常不容易的。英雄聯盟的構建包含了超過150個獨立的任務,需要構建每個英雄聯盟的特徵。而構建包括各種形式和尺寸,從傳統的除錯構建到各種形式的未來內容構建,還包括全球合作者,如騰訊(Tencent)和競舞臺(Garena)。單單完成構建,就使用超過了450臺虛擬機器!後續改為使用Docker之後,構建的成本的降低大大提高了團隊的迭代速度。當然,中間也出現過許多問題,這些我們後續再講述。本篇先行略過。

一般服務部署流程

為了讓大家更好的理解和使用雲端產品,這裡我們結合騰訊雲容器服務,根據日常情況下我們服務部署的情況,來講解本流程。
在開始之前,有很多額外的初始步驟——比如註冊、充值等等,這裡筆者先行略過,本篇只圍繞一般情況下服務部署到雲端的配置和部署流程。因此,這裡再強調下前提條件:
  1. 騰訊雲賬號正常並且資金足夠,或者無門檻代金券充足,能夠滿足此次使用
  2. 本地服務映象已經打包完畢(具體可以參閱之前的講解)
  3. 您已經充分閱讀了前面的教程,或者對容器服務已經比較瞭解
滿足了以上的前提條件,對於一般情況下,服務託管到騰訊雲,我們的主體流程如下所示:

建立叢集和節點

叢集:是指容器執行所需雲資源的集合,包含了若干臺雲伺服器、負載均衡器等騰訊雲資源;
節點:一臺已註冊到叢集內的雲伺服器。
如果大家對此不是很好理解的話,這裡筆者做一個比喻——叢集就好比某款手遊,節點就如同該手遊的某個區,我們要玩遊戲的話,是必須登入到某個區才能玩,就如同我們的服務例項,最終也是分佈在各個節點上。
注意:叢集建立完畢之後,可以新增已有的節點,也就是已購買的伺服器,不過,作業系統必須一致!如果不一致,新增已有節點時可以自動重置該伺服器的作業系統。
 
建立介面如下所示:
其中,如果CIDR顯示衝突,我們就改到不衝突為止。
節點這塊,大家可以選擇購買新的主機或者選擇已有主機,這裡就不多介紹了。

建立名稱空間和映象

這裡我們需要了解下映象倉庫。什麼是映象倉庫?映象倉庫就是用於存放Docker映象的倉庫,而Docker映象用於部署容器服務,每個映象有特定的唯一標識(映象的Registry地址+映象名稱+映象Tag)。
除了Docker官方提供了Docker Hub官方映象倉庫之外,各大雲廠商往往也提供了自己的映象倉庫,比如騰訊雲的映象倉庫是TencentHub。如果我們要獲得最佳的體驗,那麼使用雲端產品時,我們建議將Docker映象推送到該雲產品的映象倉庫,這樣映象拉取的延遲更小,支援粒度以及可用性更高。
 
注意:此步驟不是必須的,使用雲端產品,我們依然可以使用官方映象和第三方公共映象。
 
在本篇教程,我們講解使用TencentHub,也就是騰訊雲的映象倉庫。在容器服務的管理頁,我們就可以看到入口:
首先,我們需要建立名稱空間和映象。這裡,我們進入【我的映象】頁面,先來建立名稱空間。

建立名稱空間

名稱空間的建立比較簡單:
名稱空間大家可以理解為目錄或者字首,起一定的分類和約束作用,大家可以使用公司的名稱或者自己心中神往的詞彙,只要易於理解就行。名稱空間OK之後,我們就需要建立映象:

建立映象

新建頁面如下所示:
整個建立過程其實和我們在Github上建立一個程式碼庫非常類似,只是這裡介面的呈現不夠友好(先把產品經理打一頓)。我們在建立程式碼庫的時候,也是需要填寫路徑(名稱空間)和專案名稱(映象名稱),如下所示:
通過程式碼庫的類比,相信你能夠更好的理解映象倉庫。

建立服務

映象有了,那麼接下來就可以建立服務了,相當於是把我們的程式碼丟到web伺服器上跑起來。服務很易於理解,比如資料庫服務、web服務等等。
騰訊雲容器服務的建立過程如下所示:
  • 基本設定
         服務名稱、容器名稱我們建議和映象名稱保持一致,由於有些命名約束,比如“.”需要改成“_” )。

 

  • 部署設定
我們推薦使用存活檢查和就緒檢查,啟動延時最好不要設為0,例項數量大家可以根據需要改為自動調節,比如根據CPU的使用率來彈性擴充套件。

  • 訪問設定
提供公網訪問,埠可以設定成80。如果需要提供https,那麼還需要開放443埠,對於某些僅需內網訪問的服務,建議大家不要開啟公網埠。
服務建立完成之後,我們希望映象在推送之後,能夠自動觸發服務更新。因此,我們還需要配置映象觸發器。

配置映象觸發器

映象觸發器可以在每次生成新的Tag(映象版本)時,自行執行動作,如:自動更新使用該映象倉庫的服務
我們可以通過【我的映象】頁面,點選剛新增的映象名稱,進入詳情頁,然後點選【觸發器】tab頁來開啟觸發器管理頁面。

點選【新增觸發器】按鈕可以來建立觸發器。相關配置如下所示:
我們需要選擇對應的容器服務。我們推薦使用全部觸發這個觸發條件,大家也可以根據自己的需求設定指定Tag觸發,比如針對生產、測試和開發環境。

推送映象

觸發器設定好了,也就是整個水管都鋪設好了,只要開啟水龍頭就可以開閘放水了。對於我們這裡,這個水指的就是映象。我們只需將我們的映象推送到騰訊雲映象倉庫,即可自動完成整個服務部署流程。
映象推送的方式有很多,比如通過CI工具構建和推送,也可以通過指令碼來推送已有的映象。這裡,我們將介紹通過指令碼來推送映象。
核心指令碼程式碼為:
docker login --username {使用者名稱} --password {密碼} ccr.ccs.tencentyun.com
docker push {映象名稱}:{映象版本}
注意:ccr.ccs.tencentyun.com為騰訊倉庫的地址。username為騰訊雲賬號Id,密碼為倉庫密碼。
如果忘記密碼,可以在此處重置:
Magicodes.Admin框架提供了騰訊雲推送指令碼,相關引數如下所示:
一般情況下,我們僅需提供預設的配置即可,即配置tencentyun.config即可:
映象地址可以從騰訊雲的【我的映象】獲取:

如果沒有特殊的配置,我們僅需執行此指令碼即可完成編譯、執行單元測試、打包、生成映象以及映象推送的整個過程。編譯的檔案會放在tsoutputs目錄,如下所示:
例如,我們可以執行以下命令來發布Host工程,也就是後臺服務:
./build-with-tencentyun.ps1 -pushType HOST -debug true
 
如果需要傳遞相關應用的自定義設定,指令碼這邊也提供了對設定檔案的支援,例如:
如果在編譯前需要執行單元測試並通過之後才允許釋出,指令碼也提供了引數進行支援:
例如:
./build-with-tencentyun.ps1 -pushType HOST -debug true -runTest true

當單元測試失敗時,指令碼將終止執行:

除了使用指令碼推送之外,我們還可以通過CI工具或者服務來完成自動構建和推送。在後續的章節,我們會進行講述。

問題排查

將服務託管到雲端時,我們可能會碰到一些問題。掌握一些手段或技巧,能夠讓我們更易於排查問題以及解決問題。

映象拉取問題

目前騰訊雲容器服務日誌中不會列印映象拉取失敗的具體錯誤,如下圖所示:
 
我們需要在伺服器上拉取映象來檢視具體日誌錯誤,比如執行以下命令:
sudo su
docker login --username {使用者名稱} --password {密碼} ccr.ccs.tencentyun.com
docker pull {映象名稱}

遠端登入

在某些情況下,我們需要登入具體的容器例項來排查問題,這點,騰訊雲是能夠支援的:
登入之後,我們可以直接執行命令,比如執行dir命令列出所有的檔案和目錄:
我們也可以上傳下載容器例項中的檔案,如圖所示:
通過檔案助手,我們能夠很方便的檢查和修改例項中的配置檔案,或者檢視具體日誌。這對於我們調測或者檢查問題非常重要。
注意:使用檔案助手上傳下載檔案時,注意加上當前工作目錄路徑,比如“/app/appsettings.json”。

利用容器服務日誌

在開發過程中,容器服務例項可能經常會崩潰或者在執行中出現問題,一方面,我們可以記錄相關日誌或者將日誌推送到日誌服務,另一方面,我們強烈推薦大家利用好容器服務日誌。
在前面的【控制檯日誌提供程式】章節,我們有詳細講解,配置了控制檯日誌提供程式之後,我們可以在容器服務例項中看到所有的日誌,包括導致容器例項崩潰的日誌,這點對於我們排錯也非常重要——因為往往崩潰太快,有可能檔案日誌都來不及記錄或者推送。

往期內容連結

相關文章