最近闲了点,写个大活:部署Dotnet应用到K8s。

写在前边的话

一直想完成这个主题。但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在。

这个主题,会是一个系列。在这个系列中,我会讨论将应用部署到K8s时需要的各个内容和知识,以及各种刨过的坑。

为了避免这个系列被扩得过大,我不深入讨论K8s的技术,也不去解释如何建立K8s集群之类的问题。这个主题会侧重在开发人员方面,侧重于如何开发适合K8s的应用,以及在K8s上部署。

另外,这个主题也不会关注Docker。在我看来,Docker是一个附加技术,而不是必要内容。

在项目中,是否需要使用K8s,算是一个问题。从各个方面来看,很多中大型的项目都倾向于往这个方面去做,但我们必须清楚,使用K8s增加了项目的复杂度。如果构建的是一个独立的应用程序,那用K8s实在没有必要。而即便是一个大的系统,其实也没有必要从开头就加入K8s。

本主题中的内容大多来自我自己部署Dotnet Core到K8s集群的经验。如果有任何问题,可以在评论中告诉我。

K8s(Kubernetes)面向开发的组件

前边说了,这个主题我们仅关注部署应用程序相关的部分,而不讨论K8s的全部。

面向开发,面向部署,我们需要了解下面几个概念:

  • 节点(Node)

  • Pod

  • 部署(Deployment)

  • 服务(Service)

  • 入口(Ingress)

这几个概念,是整个内容的基础。

1. 节点(Node)

在K8s中,Node对应的是虚拟机或物理硬件,是K8s实际运行容器的地方。

一般来说,有两类节点:

  • 主节点(Master),用来运行所有的控制级(Control-plane)服务。主节点也可以运行应用程序,但一般来说,主节点只处理控制管理服务,不运行工作负载。

  • 其它节点,用来运行真正的应用程序。一个节点可以运行多个应用程序或应用程序容器。

一个典型的K8s集群会像下面图中的样子:

当然,在实际应用中,看K8s的规模。必要时,也可以做成单机,主节点运行控制服务的同时,也运行应用程序。

在集群中,节点越多,可以运行的应用或容器就越多,节点宕机时的容错能力也就越大。

2. Pod

K8s中最小的管理单元,不是一个个独立的容器,而是Pod。

要在K8s中运行应用程序,需要将其打包到一个容器(通常是Docker容器)中,并让K8s运行它。Pod是可以让K8s运行的最小单元。它包含一个或多个容器。当一个Pod被创建或销毁时,它里面的所有容器也会被创建或销毁。

在网上,很多的文章都介绍说:如果有一个依赖于数据库的应用,那应该把应用容器和数据库容器部署在同一个Pod中,以便同步创建或销毁。

以我的经验来说,这个说法很不准确,而且容易造成对K8s应用的误解。在K8s的实际应用中,只包含单个容器的Pod会更常用,也更好用。就好像“支付API”或“订单API”这样的,每个API都有不同的扩展需求、部署要求和迭代速度,因此单独设置Pod给它们是非常合理的。同样,数据库容器也应该部署在独立的Pod中,因为它与应用/服务/API会有不同的生命周期。

还有一个比较常用的是SideCar模式,就是在一个Pod下的主容器旁边部署“SIdeCar“容器,用来充当代理,为主应用程序进行身份证认处理,或服务发现,以及服务通讯,甚至能充当应用性能监控的接收器来用。

一个典型的节点下的Pod是下面的样子:

再重申一下:一个节点下面可以有多个Pod。一个Pod在K8s中会作为一个整体单元进行调度。一个Pod可能包含一个容器,也可能包含多个容器。容器用于部署应用或API。

3. 部署

在我的概念中,K8s主要做了两件事:

  • 管理容器的生存期

  • 管理容器之间的通讯

K8s的部署,主要完成的是第一件事,即管理容器的生存周期。所以,部署可以看做是定义K8s如何部署Pod以及如果管理Pod的一组规则。

比方,我们可能这样定义一个部署:

  1. Pod包含支付API应用Docker映像的一个实例;

  2. 我们要运行这个Pod的三个副本

  3. 保证每个容器至少有200Mb的可用内存,并限制它最多不超过400Mb;

  4. 当我们部署Pod新版本时,采用滚动更新策略

定义完后,K8s就会严格执行这个规则。如果应用崩溃了,K8s会删除Pod并安排一个新的Pod,以保证规则规定的副本数量。如果Pod需要更多内存,K8s会选择一个运行容器较少的节点上运行它,或者结束并重新部署它。当应用更新一个新版本时,K8s会创建一个新的部署,来替换旧版本,并将运行转到新的版本。

当然,上面这个例子做了一定的简化。不过,基本上K8s的基本工作就是这么做的。

这里的关键就是:部署定义了规则,K8s在这个部署的整个生命周期中维护并保持这个规则。

4. 服务

前面说过,部署可以用来创建跨多个节点(Node)的Pod的多个副本。这其实就是K8s提高性能及提高可用性的主要原理。

服务是应用对外的部分,供其它API去调用。而在K8s内部,服务可以看作是Pod在集群内的负载均衡器。当我们创建部署时,通常还会创建一个与该应用的Pod关联的服务。

在上面的例子中,当我们创建部署时,也会创建一个“Payment API”的服务,供其它API调用。

而当其它Pod需要与这个支付API的Pod通讯时,实际不会与支付API的一个Pod直接联系,而是将请求发给服务,然后由服务将请求传递给某一个Pod的实例。

这个过程参见下面的图:

服务与网络相关。因此,服务有多种不同的网络模式。这里不详细说了,只拿一个常用的模式举个例子:

K8s将服务分配到一个DNS记录,并通过这个记录将请求从一个Pod转发到另一个Pod。

假设我们有一个支付服务,而我们的购买服务需要调用这个服务。K8s不需要知道Pod的真实IP,我们只需要分配一个DNS记录给服务:

payment-api.xxx.local

通过这个域名,购买服务可以调用支付服务,而不需要知道支付服务对应的Pod的真正IP。

这个工作方式与Dotnet体系完全一样。通过这种方式,可以实现对资源的逻辑分组,这是题外话。

5. 入口

入口与服务很像,但有本质的不同。

服务本质上是K8s集群内部的东西,用来实现Pod之间的内部调用。而入口将HTTP/HTTPS从集群外部路由到内部的服务,这样,外部应用,例如前端、APP或小程序就可以通过这个入口,调用内部服务来处理请求。

同时,入口也可以当成提供外部负载均衡,即跨多个节点平衡对给定服务的请求。

除此之外,入口也可以提供其它一些特性,例如主机名或基于路径的路由。通常,我们可以为每个应用或API配置一个入口。

还有,入口设置也可以用来做应用的反向代理。例如通过一个Nginx实例来配置入口。这都是可以的,而且这样的方式,可以让API隐藏在反向代理之后,而不用直接暴露在外网。这个部分,在后面的文章,我会专门写。

总结一下

这篇文章是这个系列的一个引子。

当我们在K8s中部署一个Dotnet Core的应用时,我们需要配置Pod部署,添加服务来在K8s内部公开这些Pod,并添加一个入口来公开服务。

本系列的后续文章中,我会从开发的各个环节来解释如何使用这些组件来部署Dotnet Core应用到K8s。

敬请关注!!!

(未完待续)

喜欢就来个三连,让更多人因你而受益

部署Dotnet Core应用到Kubernetes(一)相关推荐

  1. k8s pod部署到不同node_部署Dotnet Core应用到Kubernetes(一) - 老王Plus

    最近闲了点,写个大活:部署Dotnet应用到K8s. 写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在. 这个主题,会是一个系列.在这个系列中, ...

  2. 部署Dotnet Core应用到Kubernetes(二)

    前一篇文章,概念性地介绍了K8s的一些基础组件,如Pod.部署和服务.这篇文章,我打算写写如何使用YAML清单定义和配置这些资源.   实际上,在K8s集群中创建对象有几种方式 - 命令,或声明.两种 ...

  3. 国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目

    部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...

  4. Linux系统上部署dotnet core

    Linux系统上部署dotnet core 主要步骤如下: 安装linux Linux下安装dotnet core环境 Linux下部署dotnet core系统 主要步骤如下: 因我公司需要,做一个 ...

  5. 从零开始在 Windows 上部署 .NET Core 到 Kubernetes

    本章节所有代码已上传至:https://github.com/Seanwong933/.NET-Core-on-Kubernetes 文末附有本人遇到过的 Docker 和 k8s 的故障排除. 本文 ...

  6. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

  7. 【干货特供】dotNet core 应用部署至 centos(超详解附截图)

    文章来源:公众号-智能化IT系统. 阅读目录 需要安装的插件以及支撑架构 安装dotnetSDK 安装jexus 安装supervisord 遇到问题汇总 注意事项.扩展延伸 需要安装的插件以及支撑架 ...

  8. dotNet Core 3.1 使用 Aspose (部署 Docker)

    在之前的文章<dotNET Core中使用Aspose(部署Docker)>中介绍了在 dotNet Core2.1 中使用 Aspose ,并部署到 Docker 中,现在 dotNET ...

  9. 边缘化搭建 DotNet Core 2.1 自动化发布和部署(下)

    写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...

最新文章

  1. NFX UNISTACK
  2. 干货分享:单片机编程学习攻略!
  3. 微服务(Microservices)和服务网格(Service Mesh)架构概念整理
  4. 数据结构(六)查找---多路查找树(2-3-4树)
  5. 05CRecordset类
  6. 学习云计算学哪种编程语言_您应该学习哪种编程语言?
  7. php在线支付系统,Thinkphp各大支付平台在线支付集成源码
  8. 今晚19:30见!小米12确认全系出厂预装MIUI 13:流畅度提升52%
  9. vue element form 自定义校验1(表单校验)
  10. 中国高校改名发展史:改了名,我们就是一流大学了
  11. Vue 2.0 + Axios + Vue Router 实现CNode社区
  12. 8个免费和最佳开源视频流服务器软件
  13. linux安装rmp格式文件,在CentOS Linux上使用yum、dnf和rpm安装RPM文件(Packages)
  14. 【C语言】状态机编程
  15. RGB转换成HSV(java实现)
  16. 数论--P8845 [传智杯 #4 初赛] 小卡和质数
  17. Linux中etc目录详解大全总汇详解
  18. 物联网技能大赛-Ubuntu-(3)
  19. python矩阵计算器心得_NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具...
  20. 专利代理机构代理专利流程

热门文章

  1. Visual Studio 2019 preview中体验C# 8.0新语法
  2. iOS-生成二维码图片【附中间带有小图标二维码】(QRCode)
  3. 【mysql必知必会】第十二章 汇总数据
  4. iOS UIViewContentMode 使用详解
  5. 【译】《Understanding ECMAScript6》- 第三章-Object
  6. HDU 3487 Play with Chain | Splay
  7. near far pointer
  8. 如何在Windows 10上设置默认Linux发行版
  9. 活水亭观书有感其一_如何将iPad置于“信息亭”模式,将其限制为单个应用程序...
  10. zookeeper和etcd有状态服务部署