ASP.NET Core on K8S深入学习(3)Deployment


640?wx_fmt=gif

上一篇《部署过程解析与安装Dashboard》中我们了解K8S的部署过程,这一篇我们来了解一下K8S为我们提供的几种应用运行方式:Deployment、DaemonSet与Job,它们是Kubernetes最重要的核心功能提供者。考虑到篇幅和更新速度,我将其分为两篇文章,本篇会主要介绍Deployment,主要参考自CloudMan《每天5分钟玩转Kubernetes》,也推荐大家购买阅读。


01

创建资源的两种方式对比


K8S支持两种创建资源的方式,分别是 使用kubectl命令直接创建 与 通过配置文件+kubectl apply创建,下面以上一篇中的ASP.NET Core示例来分别介绍下这两种方式。

1.1 Kubectl命令直接创建

  第一种是通过kubectl命令直接创建:

kubectl run k8s-demo-deployment --image=edisonsaonian/k8s-demo:latest --replicas=2 --namespace=aspnetcore

  这样我们就部署了一个具有2个副本的k8s-demo(一个ASP.NET Core API示例)。

1.2 YAML配置文件创建

  第二种是通过配置文件+kubectl apply(kubectl create也可以)创建:

apiVersion: apps/v1	
kind: Deployment	
metadata:	name: k8s-demo-deployment	namespace: aspnetcore	
spec:	replicas: 2	template:	spec:	containers:	- name: k8s-demo	image: edisonsaonian/k8s-demo	ports:	- containerPort: 80

  不过,上面的配置文件可能并不能直接运行,因为默认情况下K8S还有一些必填项的验证,完整你可以参考下面这段配置。更多yaml文件的语法基础,可以参考这一篇文章:https://www.kubernetes.org.cn/1414.html

apiVersion: apps/v1	
kind: Deployment	
metadata:	name: k8s-demo-deployment	namespace: aspnetcore	
spec:	replicas: 2	selector:	matchLabels:	app: aspnetcore_webapi	template:	metadata:	labels:	app: aspnetcore_webapi	spec:	containers:	- name: k8s-demo	image: edisonsaonian/k8s-demo	ports:	- containerPort: 80

  如上所示,我们将资源的属性都写在了一个yaml格式的配置文件中,有了这个配置文件,我们只需要执行一句:

kubectl apply -f k8s-demo-deployment.yaml

1.3 相关补充

  如果要删除deployment,也只需要执行一句:

kubectl delete deployment k8s-demo-deployment

  或者是下面这一句:

kubectl delete -f k8s-demo-deployment.yaml

  执行之后,K8S会自动帮我们删除相关Deployment、ReplicaSet(副本集)以及Pod。

  可以看出,直接通过kubectl创建会比较省力和快捷,但是它无法做到很好的管理,不适合正式的、规模化的部署,因此我们一般会更加倾向于采用配置文件的方式,但是使用配置文件要求我们熟悉yaml的语法,如果存在类似制表符之类的特殊字符都是无法成功执行的。


02

Deployment必知必会


2.1 Deployment类型应用运行

  这里我们仍以上面提到的k8s-demo示例项目为例,通过下面这个配置文件来创建资源:

apiVersion: apps/v1	
kind: Deployment	
metadata:	name: k8s-demo-deployment	namespace: aspnetcore	
spec:	replicas: 2	selector:	matchLabels:	app: aspnetcore_webapi	template:	metadata:	labels:	app: aspnetcore_webapi	spec:	containers:	- name: k8s-demo	image: edisonsaonian/k8s-demo	ports:	- containerPort: 80

  通过下面的命令创建资源:

kubectl apply -f k8s-demo-deployment.yaml

  下面我们来看看K8S到底为我们做了些什么工作:

  (1)查看k8s-demo-deployment状态

kubectl get deployment k8s-demo-deployment -n aspnetcore

  640?wx_fmt=png

   可以看到,对于我们的这个deployment,生成了2个副本且正常运行。

  如果想要获得更加相信的信息,可以使用下面这句:

kubectl describe deployment k8s-demo-deployment -n aspnetcore

  从deployment的日志中,可以看到如下图所示的信息:  640?wx_fmt=png

   可以看到,K8S的Deployment-Controller为k8s-demo创建了一个ReplicaSet名叫k8s-demo-deployment-54d5c97fb7,后面的Pod就是由这个ReplicaSet来管理的。

  (2)查看ReplicaSet的状态

kubectl describe replicaset -n aspnetcore

  会得到以下两个图所示的信息:  640?wx_fmt=png

   从上图可以看出,这个ReplicaSet是由Deployment k8s-demo-deployment 创建的。  640?wx_fmt=png

   从上图中的日志(Events代表日志)可以看出,两个副本Pod是由ReplicaSet-Controller创建的,且创建成功。

  (3)查看Pod的状态

kubectl describe pod -n aspnetcore

  同样,也会得到如下图所示的两个信息:  640?wx_fmt=png

   可以看出,此Pod是由ReplicaSet k8s-demo-deployment-54d5c97fb7创建的。下图的日志记录了Pod的启动过程:  640?wx_fmt=png

   从日志中可以看到Pod的启动过程,如果启动过程中发生了异常(比如拉取镜像失败),都可以通过输出的错误信息查看原因。

  下图是整个Deployment的部署过程,即kubectl→Deployment→ReplicaSet→Pod,也可以看出对象的命名方式的规则:  640?wx_fmt=png

2.2 伸缩Scale

  所谓伸缩,是指在线实时增加或减少Pod的副本数量。在刚刚的部署中,我们在配置文件中定义的是2个副本,如下图所示:  640?wx_fmt=png

   可以看到,两个副本分别位于k8s-node1 和 k8s-node2上面。一般默认情况下,K8S不会将Pod调度到Master节点上,虽然Master节点也是可以作为Node节点晒用的。

  这时,如果我们想要扩展副本数量从2到3,只需要修改配置文件:

apiVersion: apps/v1	
kind: Deployment	
metadata:	name: k8s-demo-deployment	namespace: aspnetcore	
spec:	replicas: 3	
......

  然后再次apply:

kubectl apply -f k8s-demo-deployment.yaml

  最终结果如下图所示:

  640?wx_fmt=png

  同理,如果想缩小副本数量,也是如上所述的步骤,不再赘述。

2.3 故障转移FailOver

  所谓K8S中的故障转移(FailOver),就是当某个Node节点失效或宕机时,会将该Node上所运行的所有Pod转移到其他健康的Node节点上继续运行。

  这里继续上例,我们有两个Pod都运行在k8s-node2上,那么我们这里模拟k8s-node2故障,强制关闭该节点:

halt -h

  640?wx_fmt=png

  等待一段时间后(放心,不会很快),当K8S检测到k8s-node2不可用,会将k8s-node2上的Pod最终标记为Terminating状态,并在k8s-node1上新建两个Pod,维持副本总数量为3。  640?wx_fmt=png

  当然,也可以从Dashboard中直观的看到:

  640?wx_fmt=png

  当k8s-node2恢复后,Terminating的Pod会自动被删除,不过已经运行在k8s-node1的Pod是不会重新调度回k8s-node2的。

  640?wx_fmt=png

2.4 善用label控制Pod位置

  默认情况下,K8S的Scheduler会均衡调度Pod到所有可用的Node节点,但是有些时候希望将指定的Pod部署到指定的Node节点。例如,一个I/O密集型的Pod可以尽量部署在配置了SSD的Node节点,又或者一个需要GPU的Pod可以尽量部署在配置了GPU的Node节点上。

  不用担心,K8S为我们提供了label来实现这个功能,label是一个key/value对,可以灵活设置各种自定义的属性。比如,我们这里假设我们的k8s-demo示例项目是一个I/O密集型的API,还假设k8s-node1是一个配置了SSD的Node节点:

kubectl label node k8s-node1 disktype=ssd	
kubectl get node --show-labels

  显示结果如下:可以看到,现在k8s-node多了一个label => disktype=ssd  640?wx_fmt=png

  接下来,我们就可以在配置文件中为要部署的应用指定label了:

apiVersion: apps/v1	
kind: Deployment	
metadata:	name: k8s-demo-deployment	namespace: aspnetcore	
spec:	replicas: 3	selector:	matchLabels:	app: aspnetcore_webapi	template:	metadata:	labels:	app: aspnetcore_webapi	spec:	containers:	- name: k8s-demo	image: edisonsaonian/k8s-demo	ports:	- containerPort: 80	nodeSelector:	disktype: ssd

   然后,再次apply创建资源:

kubectl apply -f k8s-demo-deployment.yaml

  验证一下,所有的k8s-demo的Pod全都调度到了k8s-node1上面,符合预期:

  640?wx_fmt=png

   如果k8s-node1不再是配置SSD了,那么我们就可以为其删掉这个label了:

kubectl label node k8s-node1 disktype-

  注意,这里的 - 就代表删除,而且此时Pod不会重新部署,除非你删除配置文件中的配置然后再次apply。


03

小结


本文介绍了K8S中创建资源的两种方式及对比,然后重点介绍了一下Deployment这个Controller,把玩了Deployment类型的应用运行、伸缩、故障转移以及使用label来控制Pod的位置。运行应用是K8S最核心的功能,下一篇会继续研究DaemonSet和Job这两个Controller的应用方式和场景。当然,笔者也还是初学,有很多不足之处,也请多包涵。对于催更的童鞋,请耐心等待。


参考资料:

(1)CloudMan,《每天5分钟玩转Kubernetes

(2)李振良,《一天入门Kubernets教程

(3)马哥(马永亮),《Kubernetes快速入门



恰童鞋骚年,风华不再正茂,仍想挥斥方遒

640?wx_fmt=jpeg


点个在看少个bug ?


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

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

相关文章

8月语言排行:C#继续呈现增长态势

TIOBE 编程语言排行榜 8 月更新已公布,排名前十的分别是:Java, C, Python, C, C#, Visual Basic .NET, JavaScript, PHP, Objective-C 和 SQL。和上个月唯一的不同之处在于 Objective-C 和 SQL 的排名发生了交换。事实上,上周 Dice Insights …

面试必谈的哈希,.Net 程序员温故而知新

引言:作为资深老鸟,有事没事,出去面试;找准差距、定位价值。面试必谈哈希,Q1:什么是哈希?Q2:哈希为什么快?Q3:你是怎么理解哈希算法利用空间换取时间的?Q4:…

Grpc Proto To Nuget Package 插件使用说明

Grpc Proto To Nuget Package 是一个 VS 插件(支持 VS2019),目的是将基于 gRPC 的接口定义 .proto 文件一键转成 Nuget Package,然后发布到私有仓库上。下载最新 GrpcProtoToNugetPackageTemplate.zip ASP.NET 的项目模板&#xf…

.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新

.NET Core 3.0 Preview 7现已推出,它包含一系列ASP.NET Core和Blazor的新更新。以下是此预览中的新功能列表:最新的Visual Studio预览包括.NET Core 3.0作为默认运行时Visual Studio中的顶级ASP.NET核心模板简化的网页模板组件的属性splattingTypeConver…

你必须知道的Docker数据卷

本篇已加入《.NET Core on K8S学习实践系列文章索引》(微信上暂无法访问,可以通过cnblogs博客园访问),可以点击查看更多容器化技术相关系列文章。本篇预计阅读时间为5分钟。01—Docker数据挂载到容器在Docker中,要想实…

牛客小白月赛11:Rinne Loves Data Structure

Rinne Loves Data Structure 思路 我们插入的位置大概分了四种: 第一种 显然我们找到比当前插入的值的pre,也就是比当前节点大的最小值。 第二种 我们只要找到当前节点的suc,也就是比当前节点小的,最大值。 第三种 我们只…

VS Code 1.37 发布!多达数十个图标迎来全新设计

今天(北京时间 2019 年 8 月 9 日),微软发布了 Visual Studio Code 1.37 版本。此版本主要更新的内容包括:Full product icon refresh - 多达数十个图标迎来全新的现代化设计Edit string arrays in the Settings UI - 在配置编辑器…

Serilog 自定义 Enricher 来增加记录的信息

Serilog 自定义 Enricher 来增加记录的信息IntroSerilog 是 .net 里面非常不错的记录日志的库,结构化日志记录,而且配置起来很方便,自定义扩展也很方便Serilog is a diagnostic logging library for .NET applications. It is easy to set up…

基于@media (prefers-color-scheme: [dark|light])的暗黑与亮色主题切换

今天有人反馈使用pdf.js的时候,发现pdf.js阅读器在自己的Mac Book电脑上显示的背景是暗黑色,而别人的电脑上却是白色: 根据这个问题,找到了pdf.js使用的view.css有段代码,类似这样: media (prefers-color-…

做「容量预估」可没有true和false

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「85」篇原创敬上随着20年来互联网的蓬勃发展,一个软件系统所要面对的访问压力上限被逐渐提高。虽然如此,但是那些体量达到亿级或者是千万级…

你不得不了解的10款服务器监控工具

监控Web服务器或Web主机的运行状况和正常运行非常重要。如果希望确保您的网站可用性在您的控制之中,那你就需要收集服务器各种性能数据以供分析和调整。以下是收集的常用大多数服务器监控组件解决方案。01Performance Co-PilotPerformance Co-Pilot,简称…

统一流控服务开源:基于.Net Core的流控服务

先前有一篇博文,梳理了流控服务的场景、业界做法和常用算法统一流控服务开源-1:场景&业界做法&算法篇最近完成了流控服务的开发,并在生产系统进行了大半年的验证,稳定可靠。今天整理一下核心设计和实现思路,开…

.NET Core 编写 Azure Function 并连接 GitHub 持续部署

点击上方蓝字关注“汪宇杰博客”导语Azure Function 是一个事件驱动型无服务器计算平台,可以解决复杂的业务流程问题,更加高效地进行开发。在本地构建和调试,而无需额外的设置,在云中大规模部署和操作,并使用触发器和绑…

「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...

在前面一文中,正式引出了SSIS专业数据ETL工具,笔者仅能作引路作用,未能使用文章的方式给大家写出更多的入门级的文章,希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习。同时也想给大家分享到SSIS的能力边界性&…

数据结构为什么那么难?

来源 | 异步 | 文末赠书2017年8月,本着让更多的人轻松学习算法的初心,我写作了第一本书《趣学算法》,该书在出版后受到广大读者一致好评,在一年内重印了10次,并输出了繁体版的版权。一位读者对我说,读这本书…

书籍推荐:《C#7.0本质论》

在dotNet平台中有多种开发语言可以使用,C#无疑是其中应用得最为广泛的。学习一门编程语言最好的方式就是找一本好书系统地学习,我读过的关于C#的书籍中,我认为下面三本最为经典:《C#本质论》:入门类,目前最…

gRPC的简单使用

前言八月初的时候,在公司内部做了一个主题为《gRPC的简单使用》的分享,其实就是和小伙伴们扯扯淡,现在抽空回忆一下,也算是一个小小的总结吧。现在市面上耳熟能详的RPC框架也很多,下面列举几个遇到比较多的。谷歌的gRP…

生命周期结束,Spring Boot 1.x退役

一年前 Spring 官方宣布 Spring Boot 1.x 生命周期将于今年 8 月 1 日结束,如今时间已到,在发布 Spring Boot 1.5.22 的同时,Spring 确认将不再为 1.x 系列发布维护版本。官方希望用户尽快迁移到 Spring Boot 2.x 上,为此还制作了…

Apollo 配置中心:分布式部署

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端…

使用Redis实现最近N条数据的决策

前言很多时候,我们会根据用户最近一段时间的行为,做出一些相应的策略,从而改变系统的运动轨迹。举个简单的例子来说明一下:假设A公司现在有两个合作伙伴(B和C),B和C都是提供天气数据的,现在A公司做了一个聚…