1. 程式人生 > >ASP.NET Core on K8S學習初探(3)部署API到K8S

ASP.NET Core on K8S學習初探(3)部署API到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的容器服務)去部署和實踐公司的生產環境,相信到時也會有很多的分享的!

參考資料

  • Jesse,http://video.jessetalk.cn/my/course/6
  • 阿里雲,https://github.com/AliyunContainerService/k8s-for-docker-desktop/tree/18.09
  • 阿里雲,https://yq.aliyun.com/articles/508460?spm=a2c4e.11153940.blogcont221687.18.7dd57733hFolMo
  • 聖傑,https://www.cnblogs.com/sheng-jie/p/10591794.html
  • 忱康,https://blog.csdn.net/cuipengchong/article/details/72459299

 

作者:周旭龍

出處:http://edisonchou.cnblogs.com

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。