本篇已加入《.NET Core on K8S學習實踐系列文章索引》,能夠點擊查看更多容器化技術相關係列文章。html
在上一篇《基本概念快速一覽》中,咱們把基本的一些概念快速地簡單地不求甚解地過了一下,本篇開始咱們會將ASP.NET Core WebAPI部署到K8S,從而結束初探的旅程。node
Section 1 - ASP.NET Core on K8S學習初探(1)K8S單節點環境搭建git
Section 2 - ASP.NET Core on K8S學習初探(2)K8S基本概念快速一覽github
Section 3 - ASP.NET Core on K8S學習初探(3)部署API到K8Sdocker
這裏準備一個空的ASP.NET Core WebAPI項目,使用默認自帶的ValuesController控制器,具體代碼見這裏。shell
Dockerfile以下:api
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上。app
docker push your-image-name:tagname
固然你也能夠直接使用我上傳的這個鏡像(edisonsaonian/k8s-demo)。ide
在上一篇中咱們知道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這個範圍以內。
首先,確保你的Docker for Windows以及Kubernetes都啓動起來了。
而後,在Powershell中經過kubectl完成API的部署,只須要下面這一句命令行便可:
kubectl create -f deploy.yaml
看到上面的提示"service created",就能夠知道已經建立好了,這裏咱們再經過下面這個命令來驗證一下:
kubectl get svc -n aspnetcore
能夠看到,在命名空間aspnetcore下,就有了一個k8s-demo的服務運行起來了,並經過端口號31435向外部提供訪問。
首先,咱們能夠經過瀏覽器來訪問一下這個API接口,看看是否能正常訪問到。
其次,還記得在第一篇中部署的Dashboard嗎?咱們經過Dashboard來看看咱們的k8s-demo的狀態:
從Dashboard中能夠看到更爲詳細的信息,包括運行的Deployment、容器組(因爲咱們設置的replicas=2,所以會有2個容器運行起來)、副本集等等,也能夠經過Dashboard實時初步地監控咱們的API的運行狀況。
在Dashboard中,咱們能夠可視化地對咱們的Deployment進行容器實例的伸縮,以下圖所示:
在彈出的伸縮選項對話框中輸入個數,例如咱們這裏從2個縮減爲1個,而後肯定。
再次觀看Dashboard,能夠看到已經從原來的2個容器實例變爲1個了。
除了在Dashboard中可視化地操做進行伸縮,也能夠經過kubectl來進行,例以下面這句命令,將容器實例擴展到3個。須要注意的是,因爲咱們的k8s-demo所在的命名空間是在aspnetcore下,所以也須要指明--namespace=aspnetcore。
kubectl scale deployment k8s-demo --replicas=3 --namespace=aspnetcore
再到Dashboard中來驗證一下,是否擴展到了3個容器實例:
在K8S中,提供了一個autoscale接口來實現服務的自動伸縮,它會採用默認的自動伸縮策略(例如根據CPU的負載狀況)來幫助咱們實現彈性伸縮的功能。例以下面這句命令能夠實現咱們的k8s-demo能夠伸縮的範圍是1~3個,根據負載狀況本身伸縮,在沒有多少請求量壓力很小時收縮爲一個,在壓力較大時啓動另外一個實例來下降負載。
kubectl autoscale deployment k8s-demo --min=1 --max=3 --namespace=aspnetcore
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
關於YAML文件各個節點的解釋,能夠經過下面這個命令去了解:
kubectl explain deployment.metadata
更多YAML文件的節點參考:https://www.kubernetes.org.cn/1414.html
推薦閱讀《18張插畫了解Kubernetes背景與概念》
本文簡單的介紹了一下在Docker for Windows環境下,經過kubectl部署一個ASP.NET Core WebAPI到K8S中,並初步使用了K8S的伸縮特性對Deployment進行實例的伸縮,體驗了一下所謂的容器的編排。固然,筆者也是初玩,有不少還沒學習,這也只是K8S的冰山一角,後續我會學習在Linux下部署K8S的生產級集羣環境,深刻學習K8S的各類概念並實踐,最後會學習阿里雲ACK服務(容器服務Kubernetes版)或騰訊雲TKE服務(基於Kubernetes的容器服務)去部署和實踐公司的生產環境,相信到時也會有不少的分享的!
原文出處:https://www.cnblogs.com/edisonchou/p/aspnet_core_on_k8s_firststudy_part3.html