1. 程式人生 > >使用 Tye 輔助開發 k8s 應用竟如此簡單(一)

使用 Tye 輔助開發 k8s 應用竟如此簡單(一)

最近正巧在進行 Newbe.Claptrap 新版本的開發,其中使用到了 Tye 來輔助 k8s 應用的開發。該系列我們就來簡單瞭解一下其用法。

Newbe.Claptrap 是一個用於輕鬆應對併發問題的分散式開發框架。如果您是首次閱讀本系列文章。建議可以先從本文末尾的入門文章開始瞭解。

安裝 Tye

首先,確保已經正確安裝了 netcore 2.1 或以上版本的 dotnet SDK。

Tye 目前還處於開發階段,因此,目前只能安裝預覽版本進行使用。通過以下連結可以搜尋到當前最新的版本,並複製介面上的 CLI 安裝。

https://www.nuget.org/packages/Microsoft.Tye/

dotnet tool install --global Microsoft.Tye --version 0.6.0-alpha.21070.5

安裝完畢後,在控制檯中執行 tye,便可以檢視到如下結果:

PS C:\tools\Cmder> tye
tye:
Developer tools and publishing for microservices.

Usage:
tye [options] [command]

Options:
--no-default Disable default options from environment variables
-?, -h, --help Show help and usage information
--version Show version information

Commands:
init <path> create a yaml manifest
run <path> run the application
build <path> build containers for the application
push <path> build and push application containers to registry
deploy <path> deploy the application
undeploy <path> delete deployed application

建立並執行一個測試專案

接下來我們建立一個 netcore 應用來測試該部署方案。選擇一個合適的位置執行以下命令來建立測試專案:

dotnet new sln -n TyeTest
dotnet new webapi -n TyeTest
dotnet sln .\TyeTest.sln add .\TyeTest\TyeTest.csproj

這樣,我們就得到了一個測試的解決方案和 WebApi 專案。我們可以執行以下命令在本地啟動這個服務:

dotnet run --project .\TyeTest\TyeTest.csproj

啟動後,可以在瀏覽器中開啟 https://localhost:5001/swagger/index.html 來檢視啟動好的 swagger 介面。

使用 tye 在本地執行應用

接下來,我們關閉前面正在執行的應用,改為使用 tye 在本地啟動測試應用。

在解決方案目錄下,使用控制檯執行以下命令:

tye run

執行之後,可能會得到如下的結果:

PS C:\Repos\TyeTest> tye run
Loading Application Details...
Launching Tye Host...

[12:11:30 INF] Executing application from C:\Repos\TyeTest\TyeTest.sln
[12:11:30 INF] Dashboard running on http://127.0.0.1:8000
[12:11:30 INF] Building projects
[12:11:32 INF] Launching service tyetest_9dd91ae4-f: C:\Repos\TyeTest\TyeTest\bin\Debug\net5.0\TyeTest.exe
[12:11:32 INF] tyetest_9dd91ae4-f running on process id 24552 bound to http://localhost:14099, https://localhost:14100
[12:11:32 INF] Replica tyetest_9dd91ae4-f is moving to a ready state
[12:11:32 INF] Selected process 24552.
[12:11:33 INF] Listening for event pipe events for tyetest_9dd91ae4-f on process id 24552

按照以上的提示,在 http://127.0.0.1:8000 成功啟動的 tye dashboard。使用瀏覽器開啟 dashboard 便可以檢視到已經部署起來的應用列表。如下圖所示:

通過 dashboard ,可以看到測試程式已經啟動,並且綁定了 http://localhost:14099 和 https://localhost:14100。實際在自行測試中,這兩個埠是隨機選擇的,因此會有不同。

我們通過上面公開的 https 繫結開啟 swagger 就能看到和前面使用 dotnet run 一樣的效果:https://localhost:14100/swagger

本地部署一個 k8s

接下來,我們將使用 Tye 將應用部署到 k8s 當中。那麼為了實現這個效果,首先需要準備一個 k8s 。

在開發機器上部署 k8s 的方式多種多樣,本次實驗採用的是 Docker Desktop + k8s 的方案,原因不是別的,就是因為使用其他方案在過程中遇到了或多或少的問題。具體的開發者可以自行選擇。

Docker Desktop + k8s 的方案在以下連結中講述的非常清楚,建議開發者可以參考:

《Docker Desktop 啟動 Kubernetes》https://www.cnblogs.com/weschen/p/12658839.html

本次實驗除了 k8s 本體之外,還需要安裝 nginx ingress 和 helm ,也可以參考以上文章中的內容進行安裝。

將應用部署到 k8s 中

但 k8s 配置完畢之後,我們就可以使用 tye 將應用快速釋出到 k8s 中進行檢視。

登入 docker registry

首先,需要為本地的 docker 配置 docker registry。因為在使用 tye 釋出的過程中將會將專案打包的 docker image 並且推送到一個 docker registry 中。

開發者可以選擇多種方式獲得一個自己的 docker registry:

  • Nexus OSS Repository
  • 阿里雲、騰訊雲、DaoCloud 等等都有免費額度的 docker registry
  • docker hub,如果網路都好的話

使用 docker login 登入你的 docker registry。

tye init 建立 tye.yml

在解決方案目錄中,執行以下命令來建立 tye.yml 配置檔案:

tye init

執行之後,將會在解決方案資料夾得到如下檔案:

name: tyetest
services:
- name: tyetest
project: TyeTest/TyeTest.csproj

這就是一個最簡單的 tye.yml 檔案。

修改 tye.yml

我們在 tye.yml 中加入一行關於 docker registry 的配置,以指定構建出來的映象將推送到何處:

name: tyetest
registry: registry.cn-hangzhou.aliyuncs.com/newbe36524
services:
- name: tyetest
project: TyeTest/TyeTest.csproj

例如,此處筆者使用的是阿里雲杭州節點的 docker registry,名稱空間為 newbe36524。因此增加了一行 registry: registry.cn-hangzhou.aliyuncs.com/newbe36524

這就相當於,如果進行構建,將會構建一個 tag 為 registry.cn-hangzhou.aliyuncs.com/newbe36524/tyetest:1.0.0 的映象並推送到阿里雲中。

提前下載 netcore 基礎映象

因為此次我們釋出的是 netcore 程式,他們將會被構建的 netcore 映象,因此,為了更加順利的進行構建,建議先使用加速工具在本地提前下載好基礎映象。

例如,筆者在此次的使用中使用的 net5 TFM 的應用程式,因此,就需要在本地先拉好 mcr.microsoft.com/dotnet/aspnet:5.0 作為基礎映象。

由於現在 netcore 基礎映象的源已經從 docker hub 遷移到 mcr.microsoft.com。故而,建議使用 Newbe.McrMirror 進行加速下載。

詳細的使用方法可以參考:https://github.com/newbe36524/Newbe.McrMirror

如果開發者不知道自己當前需要拉取的基礎映象是什麼,也可以先嚐試下面一個步驟直接釋出,檢視過程中使用的基礎映象內容,再來拉取。

使用 tye deploy

一切已經準備就緒,現在,繼續在解決方案目錄執行以下命令,便可以進行釋出:

tye deploy

可能會得到如下結果:

PS C:\Repos\TyeTest> tye deploy
Loading Application Details...
Verifying kubectl installation...
Verifying kubectl connection to cluster...
Processing Service 'tyetest'...
Applying container defaults...
Compiling Services...
Publishing Project...
Building Docker Image...
#1 [internal] load build definition from Dockerfile
#1 sha256:a3872c76e0ccfd4bade43ecac3349907e0d110092c3ca8c61f1d360689bad7e2
#1 transferring dockerfile: 144B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 sha256:9e3b70115b86134ab4be5a3ce629a55cd6060936130c89b906677d1958215910
#2 transferring context: 2B done
#2 DONE 0.0s

#3 [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:5.0
#3 sha256:3b35130338ebb888f84ec0aa58f64d182f10a676a625072200f5903996d93690
#3 DONE 0.0s

#7 [1/3] FROM mcr.microsoft.com/dotnet/aspnet:5.0
#7 sha256:31acc33a1535ed7869167d21032ed94a0e9b41bbf02055dc5f04524507860176
#7 DONE 0.0s

#5 [internal] load build context
#5 sha256:2a74f859befdf852c0e7cf66b6b7e71ec4ddeedd37d3bb6e4840dd441d712a20
#5 transferring context: 3.87MB 0.0s done
#5 DONE 0.1s

#4 [2/3] WORKDIR /app
#4 sha256:56abde746b4f39a24525b2b730b2dfb6d9688bcf704d367c86a4753aefff33f6
#4 CACHED

#6 [3/3] COPY . /app
#6 sha256:4a3b76a4eea70c858830bad519b2d8faf5b6969a820b7e38994c2116d3bacab2
#6 DONE 0.0s

#8 exporting to image
#8 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00
#8 exporting layers 0.0s done
#8 writing image sha256:8867f4e2ed6ccddb509e9c39e86c736188a78f348d6487d6d2e7a1b5919c1fdb
#8 writing image sha256:8867f4e2ed6ccddb509e9c39e86c736188a78f348d6487d6d2e7a1b5919c1fdb done
#8 naming to registry.cn-hangzhou.aliyuncs.com/newbe36524/tyetest:1.0.0 done
#8 DONE 0.1s
Created Docker Image: 'registry.cn-hangzhou.aliyuncs.com/newbe36524/tyetest:1.0.0'
Pushing Docker Image...
Pushed docker image: 'registry.cn-hangzhou.aliyuncs.com/newbe36524/tyetest:1.0.0'

Validating Secrets...
Generating Manifests...
Deploying Application Manifests...
Applying Kubernetes Manifests...
Verifying kubectl installation...
Verifying kubectl connection to cluster...
Writing output to 'C:\Users\Administrator\AppData\Local\Temp\tmp2BC2.tmp'.
Deployed application 'tyetest'.
Time Elapsed: 00:00:12:99

從輸出的日誌,我們可以看出,應用已經發布成功。並且使用 k8s dashboard 或者 k9s,我們都可以檢視到應用已經成功部署,並且啟動完成。

tyetest-674865dcc4-mxkd5    ●●  1/1   Δ            0 Running   Δ 10.1.0.73     docker-desktop     3m46s

值得注意的是,確保這一步正常執行有幾個前提:

  • 需要確保本地的 kubectl 已經正確配置。一般來說,如果是使用 docker desktop,那麼已經配置好了
  • 需要確保 docker login 已經成功。開發者可以在執行部署前,測試以下是否可以手動推送映象
  • MCR 映象的下載速度不是很理想的話,記得用 Newbe.McrMirror 進行加速

建立並使用 ingress

到這一步,我們已經完成了應用的釋出。但是,由於沒有配置 nginx ingress,服務雖然已經可以在 k8s 內部運行了,但是沒有在外部進行訪問。也就是說,在電腦上使用瀏覽器現在依然處於打不開的狀態。故而,我們還需要為服務配置 ingress。還沒有為 k8s 安裝 ingress 的朋友,建議檢視前面安裝 k8s 的相關章節。

這裡,我們開啟 tye.yml 新增 ingress 相關配置:

name: tyetest
registry: registry.cn-hangzhou.aliyuncs.com/newbe36524
services:
- name: tyetest
project: TyeTest/TyeTest.csproj
ingress:
- name: tyetest-ingress
bindings:
- name: https
protocol: https
rules:
- host: www.yueluo.pro
service: tyetest

我們增加了一個 ingress 配置,使得當流量從 ingress 進入,並且域名為 www.yueluo.pro 的時候,將會轉發到 tyetest 服務。這樣就實現了從外部訪問 k8s 內部服務的目的。

首先,使用 tye run 命令可以在本地檢視一下這個效果。執行命令之後可能在 dashboard 中檢視到以下情況:

其中,https://localhost:8310 就是 ingress 的入口地址。由於我們採用的是域名繫結,因此可以採用兩種方式進行訪問以驗證效果:

  • 在 hosts 中加入 www.yueluo.pro -> 127.0.0.1 的對映關係
  • 使用 http 請求檔案直接訪問。

這裡我們採用 http 請求檔案直接訪問:

GET https://localhost:8310/WeatherForecast
Host: www.yueluo.pro

這樣,我們就成功驗證了繫結的結果。

注意,其中的埠由於筆者沒有配置為固定埠,因此每次執行開發者都要注意發生的變化。

將 ingress 部署到 k8s 中

接下來,停止 tye run, 執行 tye deploy 將 ingress 和應用程式釋出到 k8s 中。

注意,ingress 的部署可能會花費數十秒的時間,因此需要進行一下等待。

部署完成之後,便可以通過 k8s dashboard 或者 k9s 檢視部署的結果。

並且,可以使用以下 http 請求來驗證部署的結果:

GET https://localhost/WeatherForecast
Host: www.yueluo.pro

其得到的結果與先前自然是一樣的。

從 k8s 中解除安裝應用

解除安裝應用,非常簡單,tye undeploy

PS C:\Repos\TyeTest> tye undeploy
Loading Application Details...
Found 3 resource(s).
Deleting 'Service' 'tyetest' ...
Deleting 'Deployment' 'tyetest' ...
Deleting 'Ingress' 'tyetest-ingress' ...
Time Elapsed: 00:00:02:87

小結

本篇,我們簡單介紹瞭如何使用 tye 執行或者部署應用的簡單步驟。實際過程中還有很多可以擴充套件和自定義的選項。感興趣的朋友可以檢視 https://github.com/dotnet/tye 中的內容進行學習。

下一篇,我們將來部署一些稍微複雜一點的多例項應用。

最後但是最重要!

如果讀者對該內容感興趣,歡迎轉發、評論、收藏文章以及專案。

最近作者正在構建以反應式Actor模式事件溯源為理論基礎的一套服務端開發框架。希望為開發者提供能夠便於開發出 “分散式”、“可水平擴充套件”、“可測試性高” 的應用系統 ——Newbe.Claptrap

本篇文章是該框架的一篇技術選文,屬於技術構成的一部分。

聯絡方式:

  • Github Issue
  • Gitee Issue
  • QQ 群 610394020

您還可以查閱本系列的其他選文:

理論入門篇

  1. Newbe.Claptrap - 一套以 “事件溯源” 和 “Actor 模式” 作為基本理論的服務端開發框架

術語介紹篇

  1. Actor 模式
  2. 事件溯源(Event Sourcing)
  3. Claptrap
  4. Minion
  5. 事件 (Event)
  6. 狀態 (State)
  7. 狀態快照 (State Snapshot)
  8. Claptrap 設計圖 (Claptrap Design)
  9. Claptrap 工廠 (Claptrap Factory)
  10. Claptrap Identity
  11. Claptrap Box
  12. Claptrap 生命週期(Claptrap Lifetime Scope)
  13. 序列化(Serialization)

實現入門篇

  1. Newbe.Claptrap 框架入門,第一步 —— 建立專案,實現簡易購物車
  2. Newbe.Claptrap 框架入門,第二步 —— 簡單業務,清空購物車
  3. Newbe.Claptrap 框架入門,第三步 —— 定義 Claptrap,管理商品庫存
  4. Newbe.Claptrap 框架入門,第四步 —— 利用 Minion,商品下單

樣例實踐篇

  1. 構建一個簡易的火車票售票系統,Newbe.Claptrap 框架用例,第一步 —— 業務分析
  2. 線上體驗火車票售票系統

其他番外篇

  1. 談反應式程式設計在服務端中的應用,資料庫操作優化,從 20 秒到 0.5 秒
  2. 談反應式程式設計在服務端中的應用,資料庫操作優化,提速 Upsert
  3. 十萬同時線上使用者,需要多少記憶體?——Newbe.Claptrap 框架水平擴充套件實驗
  4. docker-mcr 助您全速下載 dotnet 映象
  5. 十多位全球技術專家,為你獻上近十個小時的.Net 微服務介紹
  6. 年輕的樵夫喲,你掉的是這個免費 8 核 4G 公網伺服器,還是這個隨時可用的 Docker 實驗平臺?
  7. 如何使用 dotTrace 來診斷 netcore 應用的效能問題
  8. 只要十步,你就可以應用表示式樹來優化動態呼叫
  9. 使用 Tye 輔助開發 k8s 應用竟如此簡單(一)

GitHub 專案地址:https://github.com/newbe36524/Newbe.Claptrap

Gitee 專案地址:https://gitee.com/yks/Newbe.Claptrap

您當前檢視的是先行釋出於 www.newbe.pro 上的部落格文章,實際開發文件隨版本而迭代。若要檢視最新的開發文件,需要移步 claptrap.newbe.pro。