ASP.NET Core on K8S学习初探(3)部署API到K8S

 终于可以部署ASP.NET Core到K8S中了...


640?wx_fmt=gif

在上一篇《基本概念快速一览》中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程。


01

准备一个WebAPI



    这里准备一个空的ASP.NET Core WebAPI项目,使用默认自带的ValuesController控制器,具体代码见这里(https://github.com/EdisonChou/AspNetCore.On.K8S/tree/master/src/01_hello-k8s/EDC.K8S.Demo.WebApi)。

  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)。

  640?wx_fmt=png


02


部署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

  640?wx_fmt=png

  看到上面的提示"service created",就可以知道已经创建好了,这里我们再通过下面这个命令来验证一下:

kubectl get svc -n aspnetcore

  640?wx_fmt=png

  可以看到,在命名空间aspnetcore下,就有了一个k8s-demo的服务运行起来了,并通过端口号31435向外部提供访问。

2.3 在K8S中验证WebAPI

  首先,我们可以通过浏览器来访问一下这个API接口,看看是否能正常访问到。

  640?wx_fmt=png

  640?wx_fmt=png

  其次,还记得在第一篇中部署的Dashboard吗?我们通过Dashboard来看看我们的k8s-demo的状态:

  640?wx_fmt=png

  从Dashboard中可以看到更为详细的信息,包括运行的Deployment、容器组(由于我们设置的replicas=2,因此会有2个容器运行起来)、副本集等等,也可以通过Dashboard实时初步地监控我们的API的运行情况。


03


在K8S中对WebAPI进行伸缩



3.1 通过Dashboard伸缩WebAPI

  在Dashboard中,我们可以可视化地对我们的Deployment进行容器实例的伸缩,如下图所示:

  640?wx_fmt=png

  在弹出的伸缩选项对话框中输入个数,例如我们这里从2个缩减为1个,然后确定。

  640?wx_fmt=png

  再次观看Dashboard,可以看到已经从原来的2个容器实例变为1个了。

  640?wx_fmt=png

3.2 通过Kubectl伸缩WebAPI

  除了在Dashboard中可视化地操作进行伸缩,也可以通过kubectl来进行,例如下面这句命令,将容器实例扩展到3个。需要注意的是,由于我们的k8s-demo所在的命名空间是在aspnetcore下,因此也需要指明--namespace=aspnetcore。

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

  640?wx_fmt=png

  再到Dashboard中来验证一下,是否扩展到了3个容器实例:

  640?wx_fmt=png

3.2 自动伸缩WebAPI实例

  在K8S中,提供了一个autoscale接口来实现服务的自动伸缩,它会采用默认的自动伸缩策略(例如根据CPU的负载情况)来帮助我们实现弹性伸缩的功能。例如下面这句命令可以实现我们的k8s-demo可以伸缩的范围是1~3个,根据负载情况自己伸缩,在没有多少请求量压力很小时收缩为一个,在压力较大时启动另一个实例来降低负载。

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

  640?wx_fmt=png



04


一些补充知识点

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

  640?wx_fmt=png

  更多YAML文件的节点参考:https://www.kubernetes.org.cn/1414.html

4.3 更多K8S基础知识?

  推荐阅读《18张插画了解Kubernetes背景与概念

   640?wx_fmt=png



05


小结



        本文简单的介绍了一下在Docker for Windows环境下,通过kubectl部署一个ASP.NET Core WebAPI到K8S中,并初步使用了K8S的伸缩特性对Deployment进行实例的伸缩,体验了一下所谓的容器的编排。当然,笔者也是初玩,有很多还没学习,这也只是K8S的冰山一角,后续我会学习在Linux下部署K8S的生产级集群环境,深入学习K8S的各种概念并实践,最后会学习阿里云ACK服务(容器服务Kubernetes版)或腾讯云TKE服务(基于Kubernetes的容器服务)去部署和实践公司的生产环境,相信到时也会有很多的分享的!


References


参考资料


  1. Jesse,http://video.jessetalk.cn/my/course/6

  2. 阿里云,https://github.com/AliyunContainerService/k8s-for-docker-desktop/tree/18.09

  3. 阿里云,https://yq.aliyun.com/articles/508460?spm=a2c4e.11153940.blogcont221687.18.7dd57733hFolMo

  4. 圣杰,https://www.cnblogs.com/sheng-jie/p/10591794.html

  5. 忱康,https://blog.csdn.net/cuipengchong/article/details/72459299

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K-D Tree学习笔记

引入 K-D Tree 是一种处理高维空间的数据结构。 支持O(nk−1k)O(n^{\frac {k-1}k})O(nkk−1​)查询给定超矩形内的点的信息, kkk 为维数。 可以用替罪羊树的思想实现动态插入。 但其实用的最多的是在错误的复杂度内查询奇奇怪怪的点信息。 构建 K-D Tree 是平…

Codeforces Round #633 B. Edge Weight Assignment 结论题 + dp

传送门 文章目录题意:思路:题意: 思路: 首先考虑最小值,如果从一个叶子结点出发到任意叶子的距离都为偶数,那么只需要一个值就可以满足条件。如果有奇数的,考虑111 ^ 222 ^ 303030,…

ASP.NET Core Web API中使用Swagger

本节导航Swagger介绍在ASP.NET CORE 中的使用swagger在软件开发中,管理和测试API是一件重要而富有挑战性的工作。在我之前的文章《研发团队,请管好你的API文档》 也专门阐述了通过文档管理工具,来保证API文档和代码的一致性,这样更加有助于团队的协作。以往我们总是通过第三方平…

【ZJOI2015】幻想乡战略游戏【点分树】【带权重心】

题意:nnn个点带边权的树,动态修改点权viv_ivi​,最小化 钦定一个点xxx 后 ∑idist(x,i)∗vi\sum\limits_{i} dist(x,i)*v_ii∑​dist(x,i)∗vi​的值。 n,q≤105n,q \leq10^5n,q≤105,度数不超过202020 限制度数的树上的一些诡异…

NuGet是什么?理解与使用

如果你了解python,那么它类似pip。如果你了解nodejs,那么它类似npm。如果你了解ruby,那么它类似gem。对,它就是一个包(package)管理平台,确切的说是 .net平台的包管理工具,它提供了一…

P2468 [SDOI2010]粟粟的书架 主席树 + 二分 + 二维前缀和

传送门 文章目录题意:题意:题意: 给你一个n∗mn*mn∗m的矩阵,每次询问一个矩形,左上角是(x1,y1)(x_1,y_1)(x1​,y1​),右上角是(x2,y2)(x_2,y_2)(x2​,y2​),和一个hhh,问是否能选出…

带花树学习笔记

引入 带花树解决的是一般图的最大匹配问题。 学习此算法前你需要掌握二分图匹配的匈牙利算法,至少需要知道它的思想。 理论 众所周知,二分图匹配的思想是不断地找增广路。 严谨地讲,是找到了一条简单路径,它的起点和终点都未…

你竟然没用 Nuget 构建项目?

想写这篇文章缘起于公众号文章里的一条留言:对于一个现代化的开发平台,建立一种让开发者创建,分享与使用可复用代码的机制是十分必要的。这种“可复用代码”被打包后的文件通常被称作“包”(package),对于.…

Codeforces Round #339 (Div. 1) D. Kingdom and its Cities 虚树 + dp

传送门 文章目录题意:思路:题意: n≤1e5,∑k≤1e5,q≤1e5n\le1e5,\sum k\le1e5,q\le1e5n≤1e5,∑k≤1e5,q≤1e5。 思路: 经过分析,外敌占领的城市只有可能是两点的lcalcalca或者两点之间任意一点,是哪个点…

小白开学Asp.Net Core《四》 —— 使用AspectCore-Framework

小白开学Asp.Net Core《四》—— 使用AspectCore-Framework一、AspectCore-Framework说AspectCore-Framework不得不先谈谈的AOP,AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通…

P4103 [HEOI2014]大工程 虚树 + dp

传送门 文章目录题意:思路:题意: 思路: 简化一下题意就是求树上给定点集中每两个点之间的距离之和,相距最远的点,相距最近的点。 对于距离和我们统计一下边的贡献就好啦,边两头的sizesizesize乘…

【翻译】Keras.NET简介 - 高级神经网络API in C#

用C#,远离996Keras.NETKeras.NET是一个高级神经网络API,它使用C#编写,并带有Python绑定,可以在Tensorflow、CNTK或Theano上运行。其关注点是实现快速实验。因为做好研究的关键是:能在尽可能短的时间内从一个想法发展出…

TIOBE 6月排行:C# 以微弱的优势超过了 Visual Basic .NET 的排名,再次进入 TOP 5

月经贴警告……TIOBE 编程语言排行榜 7 月更新已公布,排名前十的分别是:Java, C, Python, C, C#, Visual Basic .NET, JavaScript, PHP, SQL 和汇编语言。和上个月的不同之处主要是 C# 以微弱的优势超过了 Visual Basic .NET 的排名,再次进入…

用.NET Core实现一个类似于饿了吗的简易拆红包功能

需求说明以前很讨厌点外卖的我,最近中午经常点外卖,因为确实很方便,提前点好餐,算准时间,就可以在下班的时候吃上饭,然后省下的那些时间就可以在中午的时候多休息一下了。点餐结束后,会有一个好…

kubernetes实战篇之helm示例yaml文件文件详细介绍

前面完整示例里,我们主要讲解helm打包,部署,升级,回退等功能,关于这里面的文件只是简单介绍,这一节我们详细介绍一下这里面的文件,以方便我们参照创建自己的helm chart.Helm Chart 结构Chart 目录结构mychart/ Chart.yaml LICENSE README.md values.yaml requirements.yam…

P4309 [TJOI2013]最长上升子序列 平衡树 + dp

传送门 文章目录题意:思路:题意: 思路: 注意到一个很关键的条件,每次插入iii,而iii是递增的,也就是说插入iii之后只会从前面的最大值转移过来,所以我们现在只需要维护插入操作即可&…

【AGC035C】Skolem XOR Tree【异或】【构造】

传送门 题意:给定nnn,构造或判断无法构造一个2n2n2n个结点的树,其中结点iii和ininin的权值为iii,且所有iii和ininin路径权值异或和等于iii。 注意到 2i⊕2i112i\oplus2i112i⊕2i11,然后可以脑补出 然而111没处理 发现1⊕2⊕301\…

ASP.NET Core 管道再探

几乎任何服务器端处理环境都有自己的直通组件管道,用于检查、重路由或修改传入请求和传出响应。经典 ASP.NET 围绕 HTTP 模块理念进行排列,而 ASP.NET Core 采用基于中间件组件的更现代的体系结构。最终目的是相同的 - 允许可配置的外部模块以请求&#…

GRPC与.net core

QQ讨论群:953553560正文系列章节GRPC与.net coreGRPC截止时间与元数据GRPC与netcore IdentityGRPC与netcore IdentityServer4概述GRPC的数据交互模式有:1.单项RPC,最简单的数据交换方式,客户端发出单个请求,收到单个响…

程序员修神之路--做好分库分表其实很难之一

点击上方“蓝字”带你去看小星星菜哥,领导让我开发新系统了这么说领导对你还是挺信任的呀~必须的,为了设计好这个新系统,数据库设计我花了好多心思呢做一个系统我觉得不应该从数据库入手,应该从设计业务模型开始,先不说…