日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core 借助 K8S 玩转容器编排

發布時間:2023/12/4 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 借助 K8S 玩转容器编排 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


Production-Grade Container Orchestration - Automated container deployment, scaling, and management. 生產級別的容器編排系統——自動化的容器部署、擴展和管理。

1. 引言

由于最近在學習微服務,所以就基于之前docker的基礎上把玩一下k8s(Kubernetes),以了解基本概念和核心功能。

2. What's k8s?

k8s涉及到很多基本概念,可以看十分鐘帶你理解Kubernetes核心概念快速了解。 下面這張圖包含了k8s了核心組成模塊:

這里就簡單羅列以下:

  • k8s Master:k8s主節點,主要包括:

  • API Server:提供可以用來和集群交互的REST端點。

  • Replication Controller:用來創建和復制Pod。

  • Node:k8s節點,可以是虛擬機或物理機。其又包含以下組件:

  • Kubelet:是主節點代理。

  • Kube-proxy:Service使用其將鏈接路由到Pod,如上文所述。

  • Docker或Rocket:Kubernetes使用的容器技術來創建容器。

  • Pod:用來托管應用程序實例,包含:

  • Container:運行的容器

  • Volume:共享存儲 (卷)

  • IP Address:IP 地址

  • Labels:標簽,用于給pod打標簽

  • Service:服務,由一組相同Label的Pod組成,其用來控制訪問Pods的策略

3. 環境準備

梳理完基本概念,我們來動手玩一玩吧。有三種玩法:一種就是跟隨k8s官方的在線實驗室進行實操;第二種就是基于Docker For Windows 中集成的k8s進行玩耍;第三種就是安裝 MiniKube搗鼓。這里選擇第二種進行講解。

PS:很多初學者在環境準備階段遭遇挫折的后就直接放棄了,筆者為了搭建這個k8s環境也耗費了不少時日,其中包含一次重裝系統,汗!希望下面的步驟助你k8s之行有個好的開端。

3.1. 在Docker for Windows中啟用Kubernetes

首先確保你已安裝Docker for Windows。 因為那道墻,在Docker For Windows Client中啟用Kubernetes,并沒有想象的那么順利。最后參照這篇文章成功啟用:為中國用戶在 Docker for Mac/Windows 中開啟 Kubernetes。 如果安裝了最新版本的docker for windows 客戶端(v2.0.0.3),可參考以下步驟:

  • 為 Docker daemon 配置 Docker Hub 的中國官方鏡像加速?https://registry.docker-cn.com

  • git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git

  • cd k8s-for-docker-desktop

  • git checkout v2.0.0.2?(這一步很重要!!!)

  • Powell shell執行?./load_images.ps1

  • Enable Kubernetes

  • 執行?kubectl cluster-info,輸出以下,表示正常啟動。

  • Kubernetes master is running at https://localhost:6445

  • KubeDNS is running at https://localhost:6445/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy


  • To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

  • 環境搭建成功,你就成功了一半,請再接再厲動手完成以下實驗!

    4. 運行第一個Pod

    4.1. 創建初始鏡像

    1:首先我們執行 dotnetnewmvc-n K8s.NET.Demo 創建一個ASP.NET Core Mvc應用 K8s.NET.Demo修改 HomeController如下所示:

  • public class HomeController : Controller {

  • public IActionResult Index () {

  • var hostname = Dns.GetHostName ();

  • ViewBag.HostName = hostname;

  • ViewBag.HostIp = Dns.GetHostAddresses (hostname).FirstOrDefault (ip => ip.AddressFamily == AddressFamily.InterNetwork);

  • return View ();

  • }

  • public IActionResult Privacy () {

  • return View ();

  • }

  • public IActionResult CheckHealth () {

  • if (new Random ().Next (100) > 50) {

  • return Ok ("OK");

  • } else {

  • return BadRequest ();

  • }

  • }

  • [ResponseCache (Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]

  • public IActionResult Error () {

  • return View (new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });

  • }

  • }

  • 修改 Index.cshtml如下:

  • @{

  • ViewData["Title"] = "Home Page";

  • }

  • <div class="text-center">

  • <h1 class="display-4">Welcome</h1>

  • <h1>Host Name@ViewBag.HostName</h1>

  • <h1>Host IP@ViewBag.HostIp</h1>

  • <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>

  • </div>

  • 2:然后添加 Dockerfile:

  • FROM microsoft/dotnet:sdk AS build-env

  • WORKDIR /app


  • # Copy csproj and restore as distinct layers

  • COPY *.csproj ./

  • RUN dotnet restore


  • # Copy everything else and build

  • COPY . ./

  • RUN dotnet publish -c Release -o out


  • # Build runtime image

  • FROM microsoft/dotnet:aspnetcore-runtime

  • WORKDIR /app

  • COPY --from=build-env /app/out .

  • ENTRYPOINT ["dotnet", "K8s.NET.Demo.dll"]

  • 3:然后執行 docker build-t k8s.net.demo.構造鏡像,構造成功后執行 docker images即可查看到名為 k8s.net.demo的鏡像。

    4.2. 創建 pod 描述文件

    添加 k8s-web-pod.yaml文件如下:

  • apiVersion: v1

  • kind: Pod # 定義Kubernetes資源的類型為Pod

  • metadata:

  • name: k8s-net-pod # 定義資源的名稱

  • labels: # 為Pod貼上標簽,后面會介紹其用處

  • app: k8s-net-pod

  • spec: # 定義資源的狀態,對于Pod來說,最重要屬性就是containers

  • containers: # containers一個數組類型,如果你希望部署多個容器,可以添加多項

  • - name: web # 定義本Pod中該容器的名稱

  • image: k8s.net.demo # 定義Pod啟動的容器鏡像地址

  • imagePullPolicy: IfNotPresent # k8s默認值為Always,總是從遠端拉取鏡像,通過設置IfNotPresent或Never來使用本地鏡像

  • ports:

  • - containerPort: 80 # 定義容器監聽的端口(與Dockerfile中的EXPOSE類似,只是為了提供文檔信息)

  • livenessProbe: # 存活探針定義

  • httpGet:

  • path: /Home/CheckHealth # 存活探針請求路徑

  • port: 80 #存活探針請求端口

  • 4.3. 使用kubectl create 創建 pod

    執行以下命令完成pod的創建:

  • $ kubectl create -f k8s-web-pod.yaml

  • pod "k8s-web-pod.yaml" created

  • $ kubectl get pod

  • NAME READY STATUS RESTARTS AGE

  • k8s-net-pod 1/1 Running 0 1m

  • 4.4. 訪問 pod 中運行的容器

    要想與 pod 進行通信,可以通過 kubectl port-forward配置端口轉發,來完成。

  • $ kubectl port-forward k8s-net-pod 8090:80

  • Forwarding from 127.0.0.1:8090 -> 80

  • Forwarding from [::1]:8090 -> 80

  • 瀏覽器訪問http://localhost:8090/,效果如下圖所示:

    至此我們成功跑起了第一個pod。

    這時你可能會問,這和我直接用 docker run-d-p8091:80k8s.net.demo 運行一個容器有什么區別呢?并沒有看到k8s強大在哪里啊?! 別急,你現在再執行一次 kubectlgetpod,我來告訴你答案。

  • $ kubectl get po

  • NAME READY STATUS RESTARTS AGE

  • k8s-net-pod 1/1 Running 17 1h

  • 看到RESTARTS列沒有,它是用來說明pod重啟了多少次。使用docker運行容器,如果容器掛掉,docker是不會負責給你重啟容器的。 而在k8s中,只需要配置存活探針,k8s就會自動探測容器的運行狀態,進行自動重啟。而存活探針僅需要在yaml文件中指定 livenessProbe節點即可。(PS:/home/checkhealth 使用隨機數來模擬容器應用運行狀態,當隨機數小于50,就返回BadRequest。)

    而這,只是k8s的冰山一角。

    5. 運行第一個 Service

    Pod運行于集群內部,雖然使用 kubect port-forward可以映射端口在本機訪問,但對于外部依舊無法訪問,如果需要暴露供外部直接訪問,則需要創建 service。

    5.1. 使用 kubectl expose 創建 service

    我們可以通過 kubectl expose pod直接將當前運行的pod實例暴露出去。

  • $ kubectl expose pod k8s-net-pod --name k8s-net-service --type=NodePort

  • service "k8s-net-service" exposed

  • $ kubectl get service

  • NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  • k8s-net-service NodePort 10.98.62.192 <none> 80:30942/TCP 7m

  • 如上,它有一個CLUSTER-IP為 10.98.62.192,因此我們可以在集群內使用 10.98.62.192:80來訪問該服務,如果是在集群外部,可以使用 NodeIP:30942(節點所在服務器IP)來訪問。

    5.2. 使用 servive 描述文件創建

    另外一種方式就是創建描述文件來創建了,添加 k8s-net-service.yaml文件:

  • apiVersion: v1

  • kind: Service # 定義Kubernetes資源的類型為Service

  • metadata:

  • name: k8s-net-service # 定義資源的名稱

  • spec:

  • selector: # 指定對應的Pod

  • app: k8s-net-pod # 指定Pod的標簽為k8s-net-pod

  • ports:

  • - protocol: TCP # 協議類型

  • port: 80 # 指定Service訪問的端口

  • targetPort: 80 # 指定Service轉發請求的端口

  • nodePort: 30000

  • type: NodePort # 指定Service的類型,在這里使用NodePort來對外訪問

  • 執行 kubectl create-f k8s-net-service.yaml來創建service。

  • $ kubectl create -f k8s-net-service.yaml

  • service "k8s-net-service" created

  • $ kubectl get service

  • NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  • k8s-net-service NodePort 10.98.62.192 <none> 80:30942/TCP 23m

  • k8s-net-service NodePort 10.97.110.150 <none> 80:30000/TCP 34s

  • kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d

  • 6. 試試 k8s 的自由伸縮

    是時候來體驗下k8s強大的自動伸縮功能了。k8s中通過創建 ReplicaSetDeployment來管理 pod,進而完成自動化擴展和管理。PS: 也可以使用ReplicaController,但推薦使用ReplicaSet,因為其標簽匹配功能更強大。

    6.1. 運行第一個 ReplicaSet

    首先定義 ReplicaSet 描述文件 k8s-net-replicaset.yaml

  • apiVersion: apps/v1beta2 # rs 的版本號為apps/v1beta2

  • kind: ReplicaSet # 定義Kubernetes資源的類型為ReplicaSet

  • metadata:

  • name: k8s-net-replicaset # 定義資源的名稱

  • spec:

  • replicas: 3 # 指定pod實例的個數

  • selector: # pod選擇器

  • matchLabels: # 指定匹配的標簽

  • app: k8s-net-pod # 指定Pod的標簽為k8s-net-pod

  • template: # 創建新的pod模板配置

  • metadata:

  • labels:

  • app: k8s-net-pod # 指定使用哪個pod

  • spec:

  • containers:

  • - name: k8s-net-replicaset

  • image: k8s.net.demo # 指定使用的鏡像

  • imagePullPolicy: IfNotPresent # k8s默認值為Always,總是從遠端拉取鏡像,通過設置IfNotPresent或Never來使用本地鏡像

  • 執行以下命令創建 ReplicaSet,并觀察自動創建的pod實例。

  • $ kubectl create -f k8s-net-replicaset.yaml

  • replicaset.apps "k8s-net-replicaset" created

  • $ kubectl get rs

  • NAME DESIRED CURRENT READY AGE

  • k8s-net-replicaset 3 3 3 8s

  • $ kubectl get pod

  • NAME READY STATUS RESTARTS AGE

  • k8s-net-pod 1/1 Running 61 12h

  • k8s-net-replicaset-bxw9c 1/1 Running 0 35s

  • k8s-net-replicaset-k6kf7 1/1 Running 0 35s

  • $ kubectl delete po k8s-net-replicaset-bxw9c

  • pod "k8s-net-replicaset-bxw9c" deleted

  • $ kubectl get po

  • NAME READY STATUS RESTARTS AGE

  • k8s-net-pod 1/1 Running 61 12h

  • k8s-net-replicaset-bxw9c 0/1 Terminating 0 2m

  • k8s-net-replicaset-k6kf7 1/1 Running 0 2m

  • k8s-net-replicaset-xvb9l 1/1 Running 0 6s

  • 從上面看到, k8s-net-replicasetk8s-net-pod為模板創建了額外兩個pod副本,當我們嘗試刪除其中一個副本后,再次查看pod列表,replicaset會自動幫我們重新創建一個pod。 那我們嘗試把剛創建的 k8s-net-replicaset暴露為Service,看看實際運行是什么效果吧。依次執行以下命令:

  • $ kubectl expose replicaset k8s-net-replicaset --type=LoadBalancer --port=8091 --target-port=80 --name k8s-net-rs

  • -service

  • service "k8s-net-rs-service" exposed

  • $ kubectl get service

  • NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  • k8s-net-rs-service LoadBalancer 10.99.134.237 localhost 8091:32641/TCP 8s

  • k8s-net-service NodePort 10.104.21.80 <none> 80:30000/TCP 12h

  • kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12h

  • 然后瀏覽器訪問http://localhost:8091/,嘗試多次刷新瀏覽器,顯示效果如下,我們發現ReplicaSet已幫我們做好了負載均衡。

    假如現在網站訪問量劇增,3個實例任然無法有效支撐,可以不停止應用的情況下做到水平伸縮嗎?Of course, Yes! 僅需執行 kubectl scale命令進行擴展即可。

  • $ kubectl get pod

  • NAME READY STATUS RESTARTS AGE

  • k8s-net-replicaset-g4n6g 1/1 Running 0 13m

  • k8s-net-replicaset-lkrf7 1/1 Running 0 13m

  • k8s-net-replicaset-tf992 1/1 Running 0 13m

  • $ kubectl scale replicaset k8s-net-replicaset --replicas=6

  • replicaset.extensions "k8s-net-replicaset" scaled

  • $ kubectl get pod

  • NAME READY STATUS RESTARTS AGE

  • k8s-net-replicaset-cz2bs 0/1 ContainerCreating 0 3s

  • k8s-net-replicaset-g4n6g 1/1 Running 0 13m

  • k8s-net-replicaset-lkrf7 1/1 Running 0 13m

  • k8s-net-replicaset-pjl9m 0/1 ContainerCreating 0 3s

  • k8s-net-replicaset-qpn2l 0/1 ContainerCreating 0 3s

  • k8s-net-replicaset-tf992 1/1 Running 0 13m

  • 從以上的輸出可以看,我們一句命令就擴展pod實例到6個,是不是很簡單?!

    你可能又問了,我現在訪問高峰過了,我怎么快速縮放應用呢?啊,和上面一樣的,你把 --replicas參數改小點就是了,就像這樣 kubectl scale replicaset k8s-net-replicaset--replicas=3

    7. 最后

    本文從使用docker創建image,到使用k8s創建第一個pod,到暴露第一個Service,再到使用ReplicaSet 進行容器伸縮,基本串通了k8s的核心基礎概念,從而對k8s有了基礎的認知,希望對你的K8S之路有所幫助。

    由于篇幅有限,筆者也是初玩,k8s的很多功能并未一一羅列,那就留著下次分享吧。 如果要問我,k8s有什么好書推薦,首推《Kubernetes In Action》,國內已經有中文版了,翻譯的不錯! 本文示例代碼已上傳至GitHub: K8S.NET.Demo

    參考資料雨夜朦朧 - Kubernetes初探[1]:部署你的第一個ASP.NET Core應用到k8s集群


    總結

    以上是生活随笔為你收集整理的ASP.NET Core 借助 K8S 玩转容器编排的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。