asp网上书店的代码_使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群
在《容器化单页面应用中RESTful API的访问》以及《容器化单页面应用中Nginx反向代理与Kubernetes部署》两篇文章中,我介绍了一套容器化ASP.NET Core应用程序的方案,并对于Nginx反向代理的使用进行了介绍。在《使用Rancher在Microsoft Azure上搭建Kubernetes集群》一文中,我介绍了一种基于Rancher搭建Kubernetes容器集群的方案,大家会发现,使用Rancher来部署和管理Kubernetes容器集群非常方便。今天,我将结合这三篇文章的内容,将案例程序name-list封装成Helm Chart,然后部署到Kubernetes容器集群中。
要使用Helm来部署我们的案例程序,首先就是要安装Helm。Helm安装分两个步骤,先安装客户端,然后安装它的服务端部件Tiller。Tiller是运行在Kubernetes集群中的,有关Helm和Tiller的基础知识和基本概念,请参考官方文档,本文不会做过多介绍。
安装Helm客户端非常简单,官网上提供了多种安装方式。最简单的方式就是直接到Helm的Github repo,找到所需的版本下载后解压,然后将路径添加到系统的PATH环境变量,即可使用Helm客户端。之后,我们可以使用下面的命令验证客户端是否安装成功:
1 2 3 |
|
注意:在使用该命令之前,请先确保已经成功部署了Kubernetes,并且~/.kube/config文件中设置了正确的context。有关Kubernetes的部署,请参考《使用Rancher在Microsoft Azure上搭建Kubernetes集群》一文。
上面的命令用于检查Helm的版本,包括客户端版本和服务端Tiller的版本。由于我们还没有安装服务端,因此,提示“Error: could not find tiller”的错误信息。
使用下面的命令创建一个名为tiller的Service Account,然后将其赋予cluster-admin的角色,最后使用该Service Account安装Tiller:
|
待安装成功后,再次运行helm version,可以看到类似如下的信息,表示Helm以及Tiller安装成功。
|
Helm中有几个比较关键的概念,Helm Chart指的是一套应用程序部署的定义,比如一次Helm部署包含哪些Kubernetes的deployment以及service等等;Helm Release则表示一次应用程序的部署。在之前介绍name-list案例的文章中,我使用了docker-compose来组织各个所需的服务及其之间的依赖关系,并使用docker-compose命令行工具来实现整个应用程序的编译、容器化以及容器运行等任务。现在,我们仍然依赖这个docker-compose.yml文件来创建Helm Chart。
首先,到Kubernetes Kompose官方Github repo下载Kompose命令行工具,然后,在docker-compose.yml文件所在的目录中,运行:
1 |
|
此时,会在docker-compose.yml文件所在目录中,出现一个helm的子目录,然后,在该目录中,会包含Helm Chart相关的目录和文件。以name-list案例为例:
helm:包含了两个文件和一个子目录:templates
Chart.yaml:Helm Chart的定义文件,里面可以指定Helm Chart的名称、描述等
README.md:说明文件,可以无视
templates目录:该目录下包含了应用程序部署的deployment、service以及ingress的描述文件,也是Helm Chart的主要部分
此外,helm目录下还可以有values.yaml文件,用来定义一些用户可以修改的变量,例如,可以在values.yaml中,使用“serviceTcpPort: 8080”来指定服务的端口号为8080,然后,在template中使用{{ .Values.serviceTcpPort }}来表示需要从values.yaml中读取服务的端口号。在name-list案例中,没有用到values.yaml。
默认情况下,Kompose会将基本的template文件都创建好,然后,还需要根据应用程序的情况进行一些手工调整,比如,将Helm Release的名称作为每个生成的deployment和service的名称前缀就是一个不错的习惯,这就需要手工地对生成的template文件进行调整。比如,在name-list案例中,前端应用的service定义如下:
|
在高亮的几行,使用{{ .Release.Name }}来表示当前Helm Release的名称。因此,对于name-list的前端应用而言,在部署到Kubernetes之后,该前端服务的名称就是{{ .Release.Name }}-namelist-client,虽然在Kubernetes集群中,可以通过这个前缀来区分不同的Helm Release,但对于Nginx来说,它将无法找到这个前端服务,因为目前我们的Nginx配置如下:
|
可以看到,在Nginx配置中,前端服务的主机地址被写死成namelist-client了,而在我们的Helm Release中,应该是{{ .Release.Name }}-namelist-client。下面我们来解决这个问题。
解决Nginx中主机名称的问题,可以使用dockerize工具,它的官方Github repo是:https://github.com/jwilder/dockerize。dockerize可以在容器启动的时候,实现模板替换,将容器环境变量的值替换到指定模板文件中。比如,对于Nginx的配置而言,我们可以首先定义一个nginx.conf.tmpl的文件,在其中使用一些模板变量,然后使用dockerize,使其在容器启动时,使用环境变量来替换这些模板变量,于是,容器运行时所使用的nginx.conf文件就是dockerize最终生成的文件。
仍然以name-list为例,首先,定义一个nginx.conf.tmpl文件,内容如下:
|
其中{{ .Env.RELEASE_NAME }}表示使用RELEASE_NAME环境变量来替换当前位置的值。然后,修改Nginx所在容器的Dockerfile,内容如下:
|
这个Dockerfile的关键部分就是最后一行,它会调用dockerize命令,将之前编入容器的/etc/nginx/sites-available/default.tmpl文件替换并输出为/etc/nginx/sites-available/default文件。
再看看Nginx的deployment.yaml中,是如何设置这个RELEASE_NAME环境变量的:
|
由此可见,Helm Release的名称,也就是{{ .Release.Name }}的值,被作为环境变量RELEASE_NAME的值,注入到daxnet/namelist-nginx容器中。
在Chart.yaml所在目录,运行下面的命令,将name-list部署到Kubernetes集群,我们将这次部署命名为myapp:
1 |
|
运行结果如下:
使用kubectl get pods命令查看所有pod是否正常运行:
使用kubectl exec查看Nginx是否正确配置:
使用helm list命令,查看我们的Helm Releases:
在Microsoft Azure中,找到由Rancher创建的Kubernetes节点虚机,确保80端口已在安全组中打开,然后访问该虚拟机的IP地址,可以看到,我们的name-list案例已经成功运行在Kubernetes集群中:
本文主要介绍了使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群的方法,并对其中遇到的问题进行了概括性描述。事实上,本文所使用的name-list案例是一套集前端、后端以及Nginx于一体的完整案例,代码完全免费开源,地址是:https://github.com/daxnet/name-list。有需要的读者欢迎查阅。
原文链接:https://sunnycoding.cn/2019/10/02/deploying-aspnetcore-apps-to-kubernetes-with-helm/
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
asp网上书店的代码_使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群相关推荐
- 使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群
在<容器化单页面应用中RESTful API的访问>以及<容器化单页面应用中Nginx反向代理与Kubernetes部署>两篇文章中,我介绍了一套容器化ASP.NET Core ...
- Helm部署rancher 高可用集群
Helm部署rancher 高可用集群 Helm简介 Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. Hel ...
- Helm部署ElasticSearch Kibana 7 集群
一.简介 Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索.结构化检索和分析,并能将这三者结合起来.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便,轻松扩 ...
- kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区
在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础: 1. 已安装.配置kubernetes 2. 集群中有tomcat与mysql容器镜像 3. 有docker基础 具 ...
- 基于asp网上书店购物商城计算机毕业设计网站作品
asp access网上书店毕业设计网站成品, dreamvear制作, table css局,一共44个页面,包括前台后台和会员中心,前台顾客可以查看图书,把图书加入购物车,发表评论.管理员登录之后 ...
- asp网上书店系统_Asp.net Core启动流程讲解(一)
asp.net core默认项目包括 项目根目录级的Startup.cs.Program.cs.appsettings.json(appsettings.Development.json) launc ...
- asp.net mysql连接字符串_【转】ASP.NET数据库连接字符串总结
来源:http://blog.csdn.net/lutinghuan/article/details/5973897 ASP.NET数据库连接字符串总结 一.使用OleDbConnection对象连接 ...
- linux运行core控制台程序,VisualStudioCode创建的asp.net core控制台程序部署到linux
1.asp.net core控制台程序 static void Main(string[] args) {int times=10;while(times>=0) { Console.Write ...
- linux .net 控制台应用程序,VisualStudioCode创建的asp.net core控制台程序部署到linux
1.asp.net core控制台程序 static void Main(string[] args) {int times=10;while(times>=0) { Console.Write ...
最新文章
- Java自然语言处理
- 小白学python买什么书-书单狗 篇一:小白学Python,到底要看多少书?
- Android 仿微信小视频录制
- RMI原理及开发实例
- C# 系统应用之清除Cookies、IE临时文件、历史记录
- 在操作系统重启后恢复应用程序的工作状态
- [XJOI]noip44 T3还有这种操作
- VC++开发学习三(对话框之间的信息传递的方法总结)
- KDevelop下如何选择不同的源文件进行执行
- CCF201903-2 二十四点游戏(JAVA版)
- python_sklearn层次聚类学习
- matlab图形界面fig文件打开不能编辑
- ListView组件的应用
- matlab计算单模光纤耦合效率的积分,用于光纤阵列耦合的微透镜阵列的设计和耦合效率的分析...
- 【 js 基础 】 setTimeout(fn, 0) 的作用
- 机器学习基础——损失函数与风险函数
- Kaspersky Anti-Virus NDIS Filter导致的网络故障一例
- 如何为管理者设计 360 评估调查题目?
- win系统修改C盘下user/用户名
- idea npm start启动前端项目报错:ERROR Failed to compile with 1 errors : This dependency was not found:
热门文章
- 图像均值滤波简介及实现
- quartus仿真30:D触发器构成的可重复序列111探测器
- Linux 系统下 /etc/group 档案结构
- 数据传递-------@ModelAttribute
- 安装webpack命令环境
- HaspMap的新奇用法
- 如何在linux centos下安装git(转)
- 编程珠玑笔记-第12章习题
- [转载] python 判断字符串是否包含另一个字符串_强烈推荐:Python字符串(string)方法整理(一)...
- [转载] python中的Numpy库入门