ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(三

在上文ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(二)中,我介绍了如何使用Azure DevOps为ASP.NET Core应用程序案例:tasklist搭建持续集成环境。在持续集成的过程中,Azure DevOps的Build Pipeline会下载tasklist的源代码,使用Docker容器环境进行项目构建,将构建的容器镜像推送到Docker Hub,并将源代码库中的yml文件复制到构建生成目录(Build Artifacts),以备持续部署时使用。今天,我打算介绍一下基于Azure Kubernetes Service和Azure DevOps的部署过程,本章节结束后,你可以看到我们的tasklist已在Kubernetes集群中运行。

强烈建议在阅读本文前,先对上两篇文章做一个大致的了解,然后阅读tasklist源码库,因为tasklist源码库展示的是一个完整的案例。

好吧,既然介绍Kubernetes部署,就离不开这两个概念:Kubernetes与Azure Kubernetes Service。Kubernetes(k8s)是Google开源的容器编排集群系统,可以让一个或一组容器运行在集群环境,从而使基于容器的应用程序获得可伸缩与高可用的特性。Kubernetes使用Go语言实现,它有一个实验性的版本,叫Minikube。Minikube是一个只包含一个节点的Kubernetes集群,可以在Windows、Linux等多平台中部署Minikube,部署过程也相对简单,因此,如果是用于学习或者一些简单的实验,可以选择Minikube。在Kubernetes集群运行起来后,就可以使用Kubectl命令行客户端对集群进行管理。

如果是自己部署生产级别的Kubernetes集群的话,配置过程会相对比较复杂,此外,由于Kubernetes是Google的项目,有很多配置部署的脚本以及二进制文件都是使用Google的CDN进行分发,国内是无法访问这些资源的,所以,我还是建议大家使用托管的Kubernetes服务,比如Azure的Azure Kubernetes Service(AKS),这样可以省去繁杂的配置过程,而且还可以根据自己的需要来决定Kubernetes集群的体量,非常方便。

Azure Container Service为容器化的应用程序的运行提供了容器集群环境,它支持三种不同的容器编排器(container orchestrator):Docker Swarm、基于DC/OS的Marathon服务,以及大家熟知的Kubernetes,也就是今天我打算介绍的Azure Kubernetes Service。大家如果有兴趣的话,也不妨了解一下Docker Swarm和DC/OS Marathon。

据我所知,目前Azure中国区版没有官方的AKS服务,网上也有一些资料,帮助读者在Azure中国区版中部署Kubernetes集群,但是过程也相对比较繁杂。在这里,我会使用Azure国际版进行介绍。

首先,登录Azure国际版,点击Create a resource按钮,在新建资源的列表中输入Kubernetes进行搜索,在搜索结果中点击Kubernetes Service选项:

640?wx_fmt=png

在Create Kubernetes Cluster页面中,进入Basics标签页,然后填写以下信息:

  • Subscription:选择你的Azure订阅

  • Resource Group:为Kubernetes集群选择一个Azure的资源组(Resource Group),之后为Kubernetes创建的所有资源都会被划入该资源组中,便于管理。你也可以点击Create new按钮新建一个资源组

  • Kubernetes cluster name:新创建的Kubernetes集群的名称

  • Region:创建资源所属的Region

  • Kubernetes version:Kubernetes的版本,选择默认的即可

  • DNS name prefix:所创建集群的DNS名称前缀

  • Node size:集群中每个节点的虚拟机配置,可以根据自己的实际情况进行选择,当然,配置越高费用也越高。这里我只选择Standard B2s,一个月40美金的样子

  • Node count:集群中的节点个数,为了演示,我选择2个节点,于是,Node size * Node count,费用大概一个月80美金的样子

为了演示tasklist项目的K8S部署,我选择了如下的配置:

640?wx_fmt=png

在这个页面中还可以选择针对认证、网络、监控等方面的高级设置,我就不一一介绍了,官方网站的文档中都有详细说明。现在直接点击Review + create按钮,在Azure完成了对配置信息的校验之后,就可以点击Create按钮创建集群了。

640?wx_fmt=png

创建成功后,就可以在Azure的站点中找到刚刚创建好的Kubernetes集群了。在集群的管理页面上,点击View Kubernetes dashboard链接,此时会打开一个边窗,列出连接Kubernetes集群的操作步骤。接下来,按照步骤一步步地安装kubectl命令行,并通过Azure的命令行打开Kubernetes的仪表盘。

640?wx_fmt=png

  1. 首先确保已经安装Azure命令行工具(Azure CLI)2.0.27或以上版本,有关Azure CLI的安装,可以参考:https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli?view=azure-cli-latest

  2. 使用以下命令安装kubectl命令行工具:

  3. Kubectl工具安装完成之后,可以将kubectl的路径添加到PATH环境变量中,方便今后使用。然后,执行下面的命令,以下载集群的登录连接凭证:

    1

    az aks get-credentials --resource-group <resource_group> --name <k8s_cluster_name>

    此处<resource_group>表示在创建Kubernetes集群时指定的资源组名称,<k8s_cluster_name>则是创建集群时指定的Kubernetes集群名称

  4. 执行以下命令,即可打开Kubernetes集群的仪表盘(Dashboard),其中参数如上所述:

    1

    az aks browse --resource-group<resource_group> --name <k8s_cluster_name>

在完成上述步骤之后,可以看到Dashboard被正常打开:

640?wx_fmt=png
目前除了kubernetes服务之外,没有部署任何其它的组件。除了使用Dashboard,我们也可以使用kubectl命令行工具,比如,通过以下命令查看已经部署的服务:

640?wx_fmt=png

接下来,让我们一起看看如何将由Azure DevOps构建好的tasklist应用程序容器部署到这个Kubernetes集群中。

在前一篇文章中,我们已经将构建生成的容器镜像推送到Docker Hub中,并将用于部署的yml文件复制到了构建输出目录。简便起见,我已经将yml文件保存到了代码库中,在tasklist的代码库中,目前有三个yml文件:docker-compose.pki.yml,docker-compose.yml以及k8s.deployment.yml。前两个文件都是用于构建或者运行容器的(docker-compose.pki.yml文件是我私人使用的,这里可以忽略),只有k8s.deployment.yml才是真正用来实现部署的。接下来,我们将使用这个k8s.deployment.yml,将tasklist容器部署到Kubernetes集群中。

Compose?Kompose?

在Kubernetes上部署容器应用,需要使用YAML格式的配置文件,然后使用kubectl apply命令实现部署。通过阅读官方网站的文档,你会发现其实编写这些YAML文件还是有一定工作量的。对于tasklist案例,我使用Google官方的Kompose命令行工具,它可以很方便地将Docker Compose文件转为Kubernetes的部署文件。官方的解释就是:Kubernetes + Compose = Kompose。不过可惜的是,Kompose的网站在国内是打不开的,不过可以通过Kompose的代码库来了解这个工具。tasklist所使用的k8s.deployment.yml文件,正是通过Kompose生成的,不过我也基于自己的需要进行了一些简单的定制。

在Azure Pipeline中创建部署任务

打开Azure DevOps管理界面,选择我们在上一讲中创建的tasklist-demo项目,然后,在Pipelines下选择Releases,然后点击New pipeline按钮,新建一个Release Pipeline。

640?wx_fmt=png

然后,在Select a template页面,选择Deploy to a Kubernetes cluster模板,点击Apply按钮使用该模板:

640?wx_fmt=png

在Stage的配置中,填入Stage的名称:

640?wx_fmt=png

回到All pipelines的配置界面,首先为我们的部署任务起个名字,然后,点击Add an artifact选项,将之前持续集成的输出结果文件,也就是用于k8s部署的YAML文件作为Release Pipeline的输入,添加到Artifacts中。在Add an artifact界面中,我们选择Build类型,表示要使用构建的输出结果,然后,Source选择Build Pipeline的名称,也就是tasklist-demo,其它选项可以默认。当然,你也可以根据自己项目的需求对这些默认的设置进行更改,不过,在此也就不多介绍了。一切设置好之后,点击Add按钮,将Artifact加入Release Pipeline。

640?wx_fmt=png

之后,点击创建好的K8S Deployment stage,在Agent job列表中,选择kubectl apply,表示我们需要更改一个Kubernetes的集群,然后,在右边的Deploy to Kubernetes界面中,进行如下设置:

  1. Display name:当前任务的名称,随便起一个有意义的名字就行了

  2. Kubernetes service connection:选择所需部署的k8s集群的连接信息。目前我们没有可用的连接,所以需要创建一个。点击New按钮即可创建:

  3. 回到Deploy to Kubernetes页面,此时Kubernetes service connection会自动选中刚刚所创建的Kubernetes连接

  4. 勾选Use Configuration file复选框,在Configuration file文本框右边点击省略号按钮:640?wx_fmt=png

  5. 在Select a file or folder对话框中,选择k8s.deployment.yml。还记得上面我们选择Build作为Artifact的类型吗?这个k8s.deployment.yml就是从那边复制过来的:640?wx_fmt=png

  6. 对于其它的配置选项,我们暂且使用默认值,然后点击Save按钮,保存我们的Release Pipeline设置

触发部署事件

在成功创建了Azure Kubernetes集群,并在Azure DevOps Pipeline中创建了Release Pipeline之后,就可以尝试将我们的tasklist应用部署到AKS了。回到Pipelines\Releases界面,选择刚刚新建的Pipeline,然后点击Release下拉菜单,选择Create a release选项:

640?wx_fmt=png

在Create a new release页面中,指定所需部署的编译版本,然后填入一些描述信息后,点击Create按钮,即可手工触发部署。

640?wx_fmt=png

成功部署之后,会在Release Pipeline的K8S Deployment stage上显示出状态:

640?wx_fmt=png

点击Logs按钮,可以查看详细的部署信息。事实上,通过编辑K8S Deployment stage的设置,还可以选择部署执行的触发条件,比如,是仅通过手工触发,还是在每次release之后触发,还可以设置触发时间以及通过Pull Request创建触发等,限于文章篇幅,这里就不多介绍了。对这部分有需求的读者请根据自己的实际情况自行设置。

640?wx_fmt=png

现在回到命令行,通过kubectl get po命令,可以看到,我们的容器已经正常运行:

640?wx_fmt=png

通过kubectl get svc命令,可以看到我们已经部署在Kubernetes集群中的服务:

640?wx_fmt=png

在上面的服务列表中可以看到,tasklist-web服务的类型是LoadBalancer,也就是这个服务会有一个公网可访问的IP地址。这个IP地址就是104.211.50.78。现在打开浏览器,直接访问这个IP地址,可以看到,我们的tasklist已经成功运行在Azure Kubernetes集群中:

640?wx_fmt=png

还可以使用下面的命令对tasklist的ASP.NET Core应用程序(也就是后端)进行伸缩:

640?wx_fmt=png

然后看看执行后有多少个Pods在运行:

640?wx_fmt=png

本文是有关ASP.NET Core应用程序容器化以及Azure DevOps持续集成、持续部署和Azure Kubernetes Service部署相关内容介绍的最后一篇文章。在这个系列中,我们首先介绍了ASP.NET Core应用程序容器化所需注意的要点,然后介绍了基于容器开发与部署的CI/CD流程,之后包含了有关在Azure DevOps中创建持续集成和持续部署任务的内容,然后是在Azure Kubernetes集群中部署我们的应用程序。相关内容还是比较多的,因此,也无法在这个系列文章中一一介绍完。对于这方面技术感兴趣的读者,我仍然推荐阅读tasklist的源代码库,因为它是一个完整的案例,它涵盖了一个ASP.NET Core应用程序容器化之路的各个方面。在今后的文章中,我还会对DevOps以及代码库分支策略等内容进行介绍,欢迎广大读者阅读讨论。

原文地址:http://sunnycoding.cn/2018/10/26/dockerize-aspnetcore-cicd-with-azure-devops-and-kubernetes-part3/

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg

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

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

相关文章

ASP.NET Core开源Web应用程序框架ABP

"作为面向服务架构(SOA)的一个变体,微服务是一种将应用程序分解成松散耦合服务的新型架构风格. 通过细粒度的服务和轻量级的协议,微服务提供了更多的模块化,使应用程序更容易理解,开发,测试,并且更容易抵抗架构侵蚀. 它使小型团队能够开发,部署和扩展各自的服务,实现开发的…

CodeForces 1517G Starry Night Camping(网络流最小割)

CodeForces 1517G Starry Night Camping problem 洛谷链接 solution 这个平行四边形的脑洞我™真的长见识了 本题最离谱的要求就是&#xff1a;平行四边形的一条边平行于 xxx 轴。 而往往这种离谱要求就是正解的途径。(((φ(◎ロ◎;)φ))) 首先不观察也能知道&#xff0c…

Acwing 307. 连通图

Acwing 307. 连通图 题意&#xff1a; 求 N 个节点的无向连通图有多少个&#xff0c;节点有标号&#xff0c;编号为 1∼N。 例如下列图示&#xff0c;三个节点的无向连通图共 4 个。 题解: 用py写 代码&#xff1a; def c(n, m):n int(n)m int(m)ret 1for i in range(…

Acwing 309. 装饰围栏

Acwing 309. 装饰围栏 题意&#xff1a; 有n个模板&#xff0c;长度分别是1到N&#xff0c;现在按照高低交错的方式排列模板&#xff0c;能到的很多种排列的方案。 每个方案都可以写作一个长度为N的序列&#xff0c;序列中的个元素是木板的长度&#xff0c;把这些序列按照字典…

CodeForces 901D Weighting a Tree(结论)

problem 洛谷链接 注意&#xff1a;保证 C[v]C[v]C[v] 的奇偶性与顶点 vvv 的度的奇偶性相同。 solution 先考虑树的情况。这是个经典问题了&#xff0c;从叶子往上推&#xff0c;对于一个点还差的边权就有这个点和其父亲的边来补足。最后判断根是否满足条件即可。 那么怎…

CF938E Max History

CF938E Max History 题意&#xff1a; 我们定义f(a)为&#xff1a; 1、开始时&#xff0c;f(a)0,M1。 2、对于每个2<i<n,如果a[M]<a[i],那么f(a)f(a)a[M],Mi。 现在对于一个给定的数组a&#xff0c;求其所有排列的f(a)之和&#xff0c;答案对1e97取模。 题解&am…

最大限度地降低多线程 C# 代码的复杂性

分支或多线程编程是编程时最难最对的事情之一。这是由于它们的并行性质所致&#xff0c;即要求采用与使用单线程的线性编程完全不同的思维模式。对于这个问题&#xff0c;恰当类比就是抛接杂耍表演者&#xff0c;必须在空中抛接多个球&#xff0c;而不要让它们相互干扰。这是一…

CodeForces 1491G Switch and Flip(结论)

problem 洛谷链接 solution 弱化版&#xff1a;如果不考虑翻面&#xff0c;那就是转化为若干个环的问题了。 这里我们尝试用同样的思路解决。 首先明确几个硬币一次交换后的等价情况&#xff0c;如图&#xff08;灰色表示反面&#xff09; &#xff08;u→vu\rightarrow …

ASP.NET Core 借助 K8S 玩转容器编排

Production-Grade Container Orchestration - Automated container deployment, scaling, and management. 生产级别的容器编排系统——自动化的容器部署、扩展和管理。1. 引言由于最近在学习微服务&#xff0c;所以就基于之前docker的基础上把玩一下k8s&#xff08;Kubernetes…

CF1009E Intercity Travelling

CF1009E Intercity Travelling 题意&#xff1a; 有一段路程&#xff0c;路程可以看作是从0到n的一条直线 如果从起点出发或者从休息点出发&#xff0c;连续驾驶k千米&#xff0c;则需要消耗的体能为a1…ak 每个整点都有可能拥有一个休息点&#xff0c;每个休息点存在或者不存…

CodeForces 1396E Distance Matching(构造+树的重心+dfs+set)

problem 洛谷链接 solution 这种要求值和恰好为 kkk 的题目&#xff0c;一般要先明确值和的取值范围。 所以我们先来确定一下值和的最小值和最大值。 将一条路径拆成若干条边&#xff0c;单独计算每条边对路径的贡献。 假设一条边将树划分成 S,TS,TS,T 集合。因为 nnn 为…

程序员修神之路--

写在开始一般来说有两种策略用来在并发线程中进行通信&#xff1a;共享数据和消息传递。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争。处理各种锁的问题是让人十分头痛的一件事。传统多数流行的语言并发是基于多线程之间的共享内存&#xff0c;使用同步方…

Lawn of the Dead

Lawn of the Dead 题意&#xff1a; 有一个N * M的方格&#xff0c;我们从(1,1)出发&#xff0c;只能向右走或者向下走&#xff0c;存在一些障碍&#xff0c;问有多少格子是我们所能到达的 2<n,m,k<1e5 题解&#xff1a; 所有的点减去不能到达的点的个数&#xff0c;…

CodeForces 1622F Quadratic Set(结论+异或哈希+散列表)

problem 洛谷链接 solution 最后子集大小一定 ≥n−3\ge n-3≥n−3&#xff0c;下面考虑证明这个结论。 假设 n2kn2kn2k。 ∏i1n(i!)∏i1k(2i−1)!(2i)!∏i1k(((2i−1)!)22i)∏i1k((2i−1)!)2⋅∏i1k2i∏i1k((2i−1)!)2⋅2k⋅k!\prod_{i1}^n(i!)\prod_{i1}^{k}(2i-1)!(2i)!\…

.Netcore 2.0 Ocelot Api网关教程(8)- 缓存

Ocelot中使用 CacheManager 来支持缓存&#xff0c;官方文档中强烈建议使用该包作为缓存工具。以下介绍通过使用CacheManager来实现Ocelot缓存。1、通过Nuget添加 Ocelot.Cache.CacheManager 包在OcelotGetway项目中添加引用&#xff1a;2、修改 Startup 中的 ConfigureService…

Acwing 271. 杨老师的照相排列

Acwing 271. 杨老师的照相排列 题意&#xff1a; 有n个数分别是从1到n&#xff0c;现在排成k排&#xff0c;每排分别有Ci个数&#xff0c;要求每排每列的都是从小到大&#xff0c;问有多少种方案 题解&#xff1a; 因为每行每列都是单调的&#xff0c;因此我们可以从小到大…

CodeForces1477D Nezzar and Hidden Permutations(构造+调整+菊花图)

problem 洛谷链接 题意&#xff1a;给定 mmm 条形如 (u,v)(u,v)(u,v) 的限制&#xff0c;要求 au,ava_u,a_vau​,av​ 的相对大小关系与 bu,bvb_u,b_vbu​,bv​ 相同。 且尽可能减少 aibia_ib_iai​bi​ 的数量&#xff0c;输出 a,ba,ba,b 两个排列。 solution 我们考虑将…

Acwing 273. 分级

Acwing 273. 分级 题意&#xff1a; 给定一个长度为N的序列A&#xff0c;现在构造一个长度为N的序列B&#xff0c;满足&#xff0c;B是非严格单增。最小化S∑i1N∣Ai−Bi∣\sum_{i1}^{N}|A_i-B_i|∑i1N​∣Ai​−Bi​∣ 题解&#xff1a; 引理&#xff1a; 一定存在一组最优…

.NET Core 给使用.NET的公司所带来的机遇

今晚在余晟的微信公众号看到了一篇文章《从.NET/C#开发的“后继无人”说起》。 这篇文章以从.NET/C#开发的“后继无人” 引出了推广极客时间的课程 刘超的《趣谈Linux操作系统》&#xff0c;通篇看下来这明显是刘超的《趣谈Linux操作系统》的软文。软文地址&#xff1a;https:/…

AoCoder 1983 [AGC001E] BBQ Hard(组合数+dp)

problem 洛谷链接 solution ∑i1n∑ji1n(aibiajbjaiaj)∑i1n∑j1n(aibiajbjaiaj)−∑i1n(2(aibi)2ai)2\sum_{i1}^{n}\sum_{ji1}^n\binom{a_ib_ia_jb_j}{a_ia_j}\frac{\sum_{i1}^{n}\sum_{j1}^n\binom{a_ib_ia_jb_j}{a_ia_j}-\sum_{i1}^{n}\binom{2(a_ib_i)}{2a_i}}{2} i1∑n​…