1. 程式人生 > >Docker最全教程——從理論到實戰(七)

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

本篇教程持續編寫了3個星期左右並且一直在完善、補充具體的細節和實踐,預計全部完成還需要1到2個月的時間。整個教程完成之後,我們將會出書(目前已聯絡出版社)。在這個過程中,您可以加入我們的QQ群(85318032)一起討論、交流和分享這一塊的技術。根據目前和大家的交流,筆者針對大家的情況進行了一些修改和補充,希望對大家有所幫助。另外,對於熟悉容器服務的你,也可以參與進來,讓我們一起打造這個系列教程,以幫助更多的人。同時,我們也希望得到大家的支援,請多多點贊或者請我們喝杯咖啡,你們的支援是我們前進的最大動力!

目錄

640?wx_fmt=png 640?wx_fmt=png 640?wx_fmt=png 640?wx_fmt=png


託管到騰訊雲容器服務

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

自建還是託管?

在開始之前,我們先來討論一個問題——是自建容器服務還是託管到雲容器服務?

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

接下來,我們結合官方資料進行一定的對比:


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

640?wx_fmt=png


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

騰訊雲容器服務監控為容器叢集、服務、例項提供資料收集和資料展示功能。使用容器服務監控,您可以檢視叢集、節點、服務、例項,容器近 30 個指標的監控統計資料,驗證叢集是否正常執行並建立相應告警,監控指標覆蓋面全,並且在持續增加中。具體如下所示:

640?wx_fmt=png


關於騰訊雲容器服務

在使用雲端產品時,我們需要先了解該產品。

640?wx_fmt=png



騰訊雲容器服務(Tencent Kubernetes Engine,即TKE)為使用者解決容器叢集的搭建以及運維管理工作,無縫銜接了騰訊雲的計算、網路、儲存、監控、安全能力,幫助使用者升級開發模式、變更應用交付、重構資料管理方式。騰訊雲容器服務提速應用部署、簡化叢集管理,助力企業快速上雲。

瞭解騰訊雲容器服務,會涉及到以下概念:

  • 叢集:是指容器執行所需雲資源的集合,包含了若干臺雲伺服器、負載均衡器等騰訊雲資源。

  • 節點:一臺已註冊到叢集內的雲伺服器。

  • 服務:由多個相同配置的容器和訪問這些容器的規則組成的微服務。

  • 映象:Docker映象,用於部署容器服務,每個映象有特定的唯一標識(映象的Registry地址+映象名稱+映象Tag)。

騰訊自今年起,對騰訊雲投入了大量的資源,並且給予了前所未有的重視和支援。筆者前不久受邀參與了騰訊雲TKE專場技術交流會,這裡分享幾張照片給大家

640?wx_fmt=jpeg 640?wx_fmt=jpeg


騰訊與容器服務

騰訊在很早的時候就已經開始使用容器服務了,並且根據內部訊息透露,騰訊的新業務基本上均使用容器服務進行託管,而舊有業務也在逐步遷移到容器服務之中。比如大家所熟悉的LOL(英雄聯盟),就使用了大量的容器例項用於構建和託管相關服務。

眾所周知,一個複雜遊戲的構建是非常不容易的。英雄聯盟的構建包含了超過150個獨立的任務,需要構建每個英雄聯盟的特徵。而構建包括各種形式和尺寸,從傳統的除錯構建到各種形式的未來內容構建,還包括全球合作者,如騰訊(Tencent)和競舞臺(Garena)。單單完成構建,就使用超過了450臺虛擬機器!後續改為使用Docker之後,構建的成本的降低大大提高了團隊的迭代速度。當然,中間也出現過許多問題,這些我們後續再講述。本篇先行略過。


640?wx_fmt=jpeg


一般服務部署流程

為了讓大家更好的理解和使用雲端產品,這裡我們結合騰訊雲容器服務,根據日常情況下我們服務部署的情況,來講解本流程。

在開始之前,有很多額外的初始步驟——比如註冊、充值等等,這裡筆者先行略過,本篇只圍繞一般情況下服務部署到雲端的配置和部署流程。因此,這裡再強調下前提條件:

  • 騰訊雲賬號正常並且資金足夠,或者無門檻代金券充足,能夠滿足此次使用

  • 本地服務映象已經打包完畢(具體可以參閱之前的講解)

  • 您已經充分閱讀了前面的教程,或者對容器服務已經比較瞭解

滿足了以上的前提條件,對於一般情況下,服務託管到騰訊雲,我們的主體流程如下所示:

640?wx_fmt=png



建立叢集和節點

叢集:是指容器執行所需雲資源的集合,包含了若干臺雲伺服器、負載均衡器等騰訊雲資源;

節點:一臺已註冊到叢集內的雲伺服器。

如果大家對此不是很好理解的話,這裡筆者做一個比喻——叢集就好比某款手遊,節點就如同該手遊的某個區,我們要玩遊戲的話,是必須登入到某個區才能玩,就如同我們的服務例項,最終也是分佈在各個節點上。

注意:叢集建立完畢之後,可以新增已有的節點,也就是已購買的伺服器,不過,作業系統必須一致!如果不一致,新增已有節點時可以自動重置該伺服器的作業系統。

建立介面如下所示:

640?wx_fmt=png

其中,如果CIDR顯示衝突,我們就改到不衝突為止。

節點這塊,大家可以選擇購買新的主機或者選擇已有主機,這裡就不多介紹了。


建立名稱空間和映象

這裡我們需要了解下映象倉庫。什麼是映象倉庫?映象倉庫就是用於存放Docker映象的倉庫,而Docker映象用於部署容器服務,每個映象有特定的唯一標識(映象的Registry地址+映象名稱+映象Tag)。

除了Docker官方提供了Docker Hub官方映象倉庫之外,各大雲廠商往往也提供了自己的映象倉庫,比如騰訊雲的映象倉庫是TencentHub。如果我們要獲得最佳的體驗,那麼使用雲端產品時,我們建議將Docker映象推送到該雲產品的映象倉庫,這樣映象拉取的延遲更小,支援粒度以及可用性更高。

注意:此步驟不是必須的,使用雲端產品,我們依然可以使用官方映象和第三方公共映象。

在本篇教程,我們講解使用TencentHub,也就是騰訊雲的映象倉庫。在容器服務的管理頁,我們就可以看到入口:


640?wx_fmt=png

首先,我們需要建立名稱空間和映象。這裡,我們進入【我的映象】頁面,先來建立名稱空間。


建立名稱空間

名稱空間的建立比較簡單:

640?wx_fmt=png

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


建立映象

640?wx_fmt=png

新建頁面如下所示:

640?wx_fmt=png

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


640?wx_fmt=png

通過程式碼庫的類比,相信你能夠更好的理解映象倉庫。


建立服務

映象有了,那麼接下來就可以建立服務了,相當於是把我們的程式碼丟到web伺服器上跑起來。服務很易於理解,比如資料庫服務、web服務等等。

騰訊雲容器服務的建立過程如下所示:

640?wx_fmt=png



640?wx_fmt=png


  • 基本設定

    服務名稱、容器名稱我們建議和映象名稱保持一致,由於有些命名約束,比如“.”需要改成“_” )。

640?wx_fmt=png
  • 部署設定

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

640?wx_fmt=png
  • 訪問設定

    提供公網訪問,埠可以設定成80。如果需要提供https,那麼還需要開放443埠,對於某些僅需內網訪問的服務,建議大家不要開啟公網埠。

640?wx_fmt=png

服務建立完成之後,我們希望映象在推送之後,能夠自動觸發服務更新。因此,我們還需要配置映象觸發器。


配置映象觸發器

映象觸發器可以在每次生成新的Tag(映象版本)時,自行執行動作,如:自動更新使用該映象倉庫的服務。

我們可以通過【我的映象】頁面,點選剛新增的映象名稱,進入詳情頁,然後點選【觸發器】tab頁來開啟觸發器管理頁面。

640?wx_fmt=png

點選【新增觸發器】按鈕可以來建立觸發器。相關配置如下所示:

640?wx_fmt=png

我們需要選擇對應的容器服務。我們推薦使用全部觸發這個觸發條件,大家也可以根據自己的需求設定指定Tag觸發,比如針對生產、測試和開發環境。


推送映象

觸發器設定好了,也就是整個水管都鋪設好了,只要開啟水龍頭就可以開閘放水了。對於我們這裡,這個水指的就是映象。我們只需將我們的映象推送到騰訊雲映象倉庫,即可自動完成整個服務部署流程。

映象推送的方式有很多,比如通過CI工具構建和推送,也可以通過指令碼來推送已有的映象。這裡,我們將介紹通過指令碼來推送映象。

核心指令碼程式碼為:

docker login --username {使用者名稱} --password {密碼} ccr.ccs.tencentyun.com

docker push {映象名稱}:{映象版本}

注意:ccr.ccs.tencentyun.com為騰訊倉庫的地址。username為騰訊雲賬號Id,密碼為倉庫密碼。

如果忘記密碼,可以在此處重置:

640?wx_fmt=png

Magicodes.Admin框架提供了騰訊雲推送指令碼,相關引數如下所示:

640?wx_fmt=png

一般情況下,我們僅需提供預設的配置即可,即配置tencentyun.config即可:

640?wx_fmt=png

映象地址可以從騰訊雲的【我的映象】獲取:

640?wx_fmt=png

如果沒有特殊的配置,我們僅需執行此指令碼即可完成編譯、執行單元測試、打包、生成映象以及映象推送的整個過程。編譯的檔案會放在tsoutputs目錄,如下所示:

640?wx_fmt=png


例如,我們可以執行以下命令來發布Host工程,也就是後臺服務:

./build-with-tencentyun.ps1 -pushType HOST -debug true

640?wx_fmt=png 640?wx_fmt=png

如果需要傳遞相關應用的自定義設定,指令碼這邊也提供了對設定檔案的支援,例如:

640?wx_fmt=png

如果在編譯前需要執行單元測試並通過之後才允許釋出,指令碼也提供了引數進行支援:

640?wx_fmt=png

例如:

./build-with-tencentyun.ps1 -pushType HOST -debug true -runTest true

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

640?wx_fmt=png

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


問題排查

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


映象拉取問題

目前騰訊雲容器服務日誌中不會列印映象拉取失敗的具體錯誤,如下圖所示:

640?wx_fmt=png 640?wx_fmt=png 640?wx_fmt=png


我們需要在伺服器上拉取映象來檢視具體日誌錯誤,比如執行以下命令:

sudo su

docker login --username {使用者名稱} --password {密碼} ccr.ccs.tencentyun.com

docker pull {映象名稱}

640?wx_fmt=png


遠端登入

在某些情況下,我們需要登入具體的容器例項來排查問題,這點,騰訊雲是能夠支援的:

640?wx_fmt=png

登入之後,我們可以直接執行命令,比如執行dir命令列出所有的檔案和目錄:

640?wx_fmt=png

我們也可以上傳下載容器例項中的檔案,如圖所示:

640?wx_fmt=png


通過檔案助手,我們能夠很方便的檢查和修改例項中的配置檔案,或者檢視具體日誌。這對於我們調測或者檢查問題非常重要。

注意:使用檔案助手上傳下載檔案時,注意加上當前工作目錄路徑,比如“/app/appsettings.json”。


利用容器服務日誌

在開發過程中,容器服務例項可能經常會崩潰或者在執行中出現問題,一方面,我們可以記錄相關日誌或者將日誌推送到日誌服務,另一方面,我們強烈推薦大家利用好容器服務日誌。

在前面的【控制檯日誌提供程式】章節,我們有詳細講解,配置了控制檯日誌提供程式之後,我們可以在容器服務例項中看到所有的日誌,包括導致容器例項崩潰的日誌,這點對於我們排錯也非常重要——因為往往崩潰太快,有可能檔案日誌都來不及記錄或者推送。

640?wx_fmt=png

往期內容

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

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

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

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

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

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


長按識別二維碼,瞭解更多精彩內容

640?wx_fmt=gif 640?wx_fmt=jpeg 640?wx_fmt=gif

如果喜歡作者的文章,請關注“magiccodes”訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊資訊科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。


QQ群:

程式設計交流群<85318032> 

產品交流群<897857351>