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