使用 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 便可以查看到已經部署起來的應用列表。如下圖所示:

tye 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 中查看到以下情況:

tye dashboard2

其中,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

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

聯系方式:

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

理論入門篇

  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

Newbe.Claptrap


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM