本篇已加入《.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的容器服務)去部署和實踐公司的生產環境,相信到時也會有很多的分享的!
參考資料
- 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