ASP.NET Core on K8S學習初探(3)部署API到K8S


本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點擊查看更多容器化技術相關系列文章。

在上一篇《基本概念快速一覽》中,我們把基本的一些概念快速地簡單地不求甚解地過了一下,本篇開始我們會將ASP.NET Core WebAPI部署到K8S,從而結束初探的旅程。

Section 1 - ASP.NET Core on K8S學習初探(1)K8S單節點環境搭建

Section 2 - ASP.NET Core on K8S學習初探(2)K8S基本概念快速一覽

Section 3 - ASP.NET Core on K8S學習初探(3)部署API到K8S

一、准備一個WebAPI

  這里准備一個空的ASP.NET Core WebAPI項目,使用默認自帶的ValuesController控制器,具體代碼見這里

  Dockerfile如下:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY . .

RUN dotnet restore
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "EDC.K8S.Demo.WebApi.dll"]

  我們可以事先在自己的Docker環境構建這樣的一個鏡像,看看能否正常使用。

  由於后面會使用到這個鏡像,因此可以將此鏡像push到Docker Hub上。

docker push your-image-name:tagname

  當然你也可以直接使用我上傳的這個鏡像(edisonsaonian/k8s-demo)。

  

二、部署WebAPI到K8S

2.1 准備Deployment YAML

  在上一篇中我們知道Deployment主要負責Pod的編排,那么我們這里就通過一個YAML來創建一個Deployment。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-demo
  namespace: aspnetcore
  labels:
    name: k8s-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      name: k8s-demo
  template:
    metadata:
      labels:
        name: k8s-demo
    spec:
      containers:
      - name: k8s-demo
        image: edisonsaonian/k8s-demo
        ports:
        - containerPort: 80
        imagePullPolicy: Always

---

kind: Service
apiVersion: v1
metadata:
  name: k8s-demo
  namespace: aspnetcore
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    name: k8s-demo

  這里這個deploy.yaml就會告訴K8S關於你的API的所有信息,以及通過什么樣的方式暴露出來讓外部訪問。

  需要注意的是,這里我們提前為要部署的ASP.NET Core WebAPI項目創建了一個namespace,叫做aspnetcore,因此這里寫的namespace : aspnetcore。

  K8S中通過標簽來區分不同的服務,因此這里統一name寫成了k8s-demo。

  在多實例的配置上,通過replicas : 2這個設置告訴K8S給我啟動2個實例起來,當然你可以寫更大的一個數量值。

  最后,在spec中告訴K8S我要通過NodePort的方式暴露出來公開訪問,因此端口范圍從上一篇可以知道,應該是 30000-32767這個范圍之內。

2.2 通過kubectl部署到K8S

  首先,確保你的Docker for Windows以及Kubernetes都啟動起來了。

  然后,在Powershell中通過kubectl完成API的部署,只需要下面這一句命令行即可:

kubectl create -f deploy.yaml

  

  看到上面的提示"service created",就可以知道已經創建好了,這里我們再通過下面這個命令來驗證一下:

kubectl get svc -n aspnetcore

  

  可以看到,在命名空間aspnetcore下,就有了一個k8s-demo的服務運行起來了,並通過端口號31435向外部提供訪問。

2.3 在K8S中驗證WebAPI

  首先,我們可以通過瀏覽器來訪問一下這個API接口,看看是否能正常訪問到。

  • /api/values

  

  • /api/values/1000

  

  其次,還記得在第一篇中部署的Dashboard嗎?我們通過Dashboard來看看我們的k8s-demo的狀態:

  

  從Dashboard中可以看到更為詳細的信息,包括運行的Deployment、容器組(由於我們設置的replicas=2,因此會有2個容器運行起來)、副本集等等,也可以通過Dashboard實時初步地監控我們的API的運行情況。

三、在K8S中對WebAPI的伸縮

3.1 通過Dashboard伸縮WebAPI

  在Dashboard中,我們可以可視化地對我們的Deployment進行容器實例的伸縮,如下圖所示:

  

  在彈出的伸縮選項對話框中輸入個數,例如我們這里從2個縮減為1個,然后確定。

  

  再次觀看Dashboard,可以看到已經從原來的2個容器實例變為1個了。

  

3.2 通過Kubectl伸縮WebAPI

  除了在Dashboard中可視化地操作進行伸縮,也可以通過kubectl來進行,例如下面這句命令,將容器實例擴展到3個。需要注意的是,由於我們的k8s-demo所在的命名空間是在aspnetcore下,因此也需要指明--namespace=aspnetcore。

kubectl scale deployment k8s-demo --replicas=3 --namespace=aspnetcore

  

  再到Dashboard中來驗證一下,是否擴展到了3個容器實例:

  

3.2 自動伸縮WebAPI實例

  在K8S中,提供了一個autoscale接口來實現服務的自動伸縮,它會采用默認的自動伸縮策略(例如根據CPU的負載情況)來幫助我們實現彈性伸縮的功能。例如下面這句命令可以實現我們的k8s-demo可以伸縮的范圍是1~3個,根據負載情況自己伸縮,在沒有多少請求量壓力很小時收縮為一個,在壓力較大時啟動另一個實例來降低負載。

kubectl autoscale deployment k8s-demo --min=1 --max=3 --namespace=aspnetcore

  

四、補充知識點

4.1 常用Kubectl命令

kubectl get svc -n kube-system  //獲取指定命名空間的服務
kubectl cluster-info // 獲取集群信息
kubectl get nodes // 獲取集群節點信息
kubectl delete node 192.168.2.152  //刪除節點 192.168.2.152
kubectl get namespaces // 獲取所有命名空間
kubectl create namespace aspnetcore // 創建一個命名空間“aspnetcore”

  更多kubectl命令參考:

  (1)https://jimmysong.io/kubernetes-handbook/guide/kubectl-cheatsheet.html

  (2)https://www.jianshu.com/p/fb5c0d115421

4.2 YAML文件解析

   關於YAML文件各個節點的解釋,可以通過下面這個命令去了解:

kubectl explain deployment.metadata

  

  更多YAML文件的節點參考:https://www.kubernetes.org.cn/1414.html

4.3 更多K8S基礎知識?

  推薦閱讀《18張插畫了解Kubernetes背景與概念

   

五、小結

  本文簡單的介紹了一下在Docker for Windows環境下,通過kubectl部署一個ASP.NET Core WebAPI到K8S中,並初步使用了K8S的伸縮特性對Deployment進行實例的伸縮,體驗了一下所謂的容器的編排。當然,筆者也是初玩,有很多還沒學習,這也只是K8S的冰山一角,后續我會學習在Linux下部署K8S的生產級集群環境,深入學習K8S的各種概念並實踐,最后會學習阿里雲ACK服務(容器服務Kubernetes版)或騰訊雲TKE服務(基於Kubernetes的容器服務)去部署和實踐公司的生產環境,相信到時也會有很多的分享的!

參考資料

 


免責聲明!

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



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