kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载

1. 前言

前前后后学习kubernetes也有一个来月了,关于kubernetes的博客也写了有十多篇。但是技术如果无法落地到实际的应用场景终归是纸上谈兵,所以就有了这一出:通过结合kubernetesazure devops实现项目的CI/CD以及均衡负载

写完这篇后kubernetes的相关学习也暂时告一段落了,有种终于闯关成功了啊的感觉,当然这是题外话了。

注1:以下只是以Net Core项目为例,实际运用场景中,除了dockfile的编写有差别,剩下整个自动化部署链条中的技术也好,工具也好,都可以复用,与语言和语言框架本身无关。
注2:本文演示的也只是其中一种简便的方式,具体的自动化流程中,由于自由度非常高,所以实际的流程可能会更加复杂,这里就不做赘述了

以下场景需要用到的工具或者技术:

  • .Net Core

部署的应用本身

  • Github

作为代码仓库

  • kubernetes

    • docker

    • helm【kubernetes的包管理工具】

    • ingress【使用ingress绑定域名和https证书,实现域名访问】

  • Azure DevOps

作为CI/CD的工具

注:以下所有的相关部署代码,都在下面这个仓库

  • 仓库内容只是我自己用的一个小工具,当然具体是什么内容不重要,这篇只是演示部署相关的

https://github.com/lzw5399/TocGenerator


2. Net Core项目本身的准备

2.1 dockerfile

你需要一个dockerfile来构建一个docker image, 如果是.Net Core项目,vs提供了傻瓜式生成dockerfile的功能,可以免去初学时编写dockerfile的烦恼

  • 本示例dockerfile路径和内容

2.2 创建kubernetes用于helm的chart包

2.2.1 说明

这一部分需要有helm相关的知识,如果熟悉k8s但不熟悉helm,可以参照:

kubernetes系列(十六) - Helm安装和入门

2.2.2 chart文件目录和文件组成

自定义的chart包,位于以下路径

https://github.com/lzw5399/TocGenerator/tree/master/kubernetes

如上图可以看出是一个很经典的自定义chart包的文件目录,即:

Copy.
├── Chart.yaml           【chart的name和version等信息】
├── templates            【k8s的资源清单模板,可以引用values.yaml的变量】
|   ├── deployment.yaml
|   └── service.yaml
├── values.yaml          【定义变量,供template/下的yaml使用,实现动态替换yaml内容】

3. Azure Devops创建仓库的pipeline

3.1 前言

Azure DevOps是微软出品的DevOps平台,里面包含了Pipelines工具链,对个人免费,可以用于项目的CI/CD

https://dev.azure.com

3.2 使用azure devops准备操作

  • 如果之前使用过azure devops,这几步可以视情况跳过。

  1. 进入azure devops注册账号

  2. 之后按照引导新建一个organization

  3. 再新建一个project

  4. 进入project

3.3 创建service connections

这里要创建一个service connections,用于之后pipeline访问k8s的master服务器

  1. 点击project setting

  2. 这里点击service connections来创建一个连接,用于访问k8s的master服务器

  3. 然后填写具体的凭证,之后的pipeline上需要

3.4 新建pipeline流水线

新建pipeline流水线用于自定义部署流程

  1. 点击pipelines,然后点击create pipelines,新建一条流水线来部署我们的应用

  2. 选择代码仓库位置,选github

  3. 然后会跳到github进行授权,授权完成后会显示github的repo列表,选择具体的仓库

  4. 选择完仓库后,会自动按照你当前项目的语言,在github仓库的根目录生成一个默认的azure-pipelines.yml文件,

  5. 替换文件的内容,我们最终使用的yaml文件步骤大概如下

  • 第一步:构建docker镜像

  • 第二步:将自定义的chart包拷贝到master服务器上

  • 第三步:执行deploy.sh脚本,完成部署

Copy# 哪条分支会触发构建
trigger:
- masterresources:
- repo: self# 定义变量
variables:
- name: appNamevalue: tocgenerator- name: tagvalue: $(Build.BuildNumber)- name: imageNameWithoutTagvalue: $(dockerid)/$(appName)- name: imageNameWithTagvalue: $(imageNameWithoutTag):$(tag)- name: serverChartLocationvalue: /root/helm-chart-folder/tocstages:
- stage: Buildjobs:  - job: Buildpool:vmImage: 'ubuntu-latest'# 这下面是每个我们要具体执行的任务steps:# build docker images并且push到仓库- task: Docker@2displayName: docker build and pushinputs:containerRegistry: 'my_docker_hub'repository: '$(imageNameWithoutTag)'command: 'buildAndPush'Dockerfile: '**/Dockerfile'buildContext: '.'tags: $(tag)addPipelineData: false# 将kubernetes文件夹,即chart包拷贝到k8s的master服务器- task: CopyFilesOverSSH@0displayName: copy helm chart to serverinputs:# 这个endpoint就是我们刚刚创建的service connection的名字sshEndpoint: 'my_server'sourceFolder: 'kubernetes'contents: '**'targetFolder: $(serverChartLocation)readyTimeout: '20000'# 在k8s的master服务器上运行我们github仓库的根目录的deploy.sh,进行部署操作- task: SSH@0displayName: run deploy shell on serverinputs:# 这个endpoint就是我们刚刚创建的service connection的名字sshEndpoint: 'my_server'runOptions: 'script'scriptPath: 'deploy.sh'args: '$(tag) $(serverChartLocation)'readyTimeout: '20000'

3.5 创建部署shell脚本

部署脚本的位置

https://github.com/lzw5399/TocGenerator/blob/master/deploy.sh

几点说明

  1. echo纯粹是为了记录log使用的,下面的示例把echo部分删除了

  2. $1 and $2 代表外部传入的参数

  3. $1是image的tag,$2是k8s的master服务器上我们自定义的chart的目录

  4. 移除没有tag的悬挂docker image,纯粹为了节省服务器空间,为可选项

Copy#!/bin/bash# 出现错误退出脚本执行
set -o errexit# $1 and $2 代表外部传入的参数
# $1是image的tag,$2是k8s的master服务器上我们自定义的chart的目录
buildNumber=$1
serverChartLocation=$2
cd $serverChartLocation# 安装或者升级我们的helm release
# 即如果查询到了有release存在就upgrade,没有则install
if test -z "$(helm ls | grep toc-release)"; thenhelm install -f values.yaml --set env.buildnumber=$buildNumber --set image.tag=$buildNumber toc-release .
elsehelm upgrade -f values.yaml --set env.buildnumber=$buildNumber --set image.tag=$buildNumber toc-release .
fi# 移除没有tag的悬挂docker image(可选)
danglings=$(sudo docker images -f "dangling=true" -q)
if test -n "$danglings"; thensudo docker rmi $(sudo docker images -f "dangling=true" -q) >>/dev/null 2>&1if [[ $? != 0 ]]; thenexit $?fi
fiexit 0

4. 触发pipeline部署流水线

这里有两种办法,

  1. 点击我们刚刚创建的pipeline手动run一个

  2. 通过push代码到仓库的指定分支(我们设置的master)触发构建

显示构建成功之后就可以查看了!

5. 关于均衡负载

均衡负载是kubernetes自带的基础功能之一,这里只是做了一个试验可以更加直观地感受到而已

如下

  1. 定义一个静态的guid

  2. 在/version 路由下输出guid

则如果有2个实例,且均衡负载成功的话,每次刷新这个界面,会随机显示这两个guid

  • deployment的replicas实例数需要设置2以上

最后均衡负载试验的地址,也是本次实例项目的线上地址

https://toc.codepie.fun/version

  • 如下,会出现两个不同的guid

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

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

相关文章

ASP.NET Core 消息传递:MediatR

MediatR[1] 是参考中介者模式实现的一个 .NET 工具类库,支持在进程内以单播或多播的形式进行消息传递,通过使用 MediatR 可实现消息的发送和处理充分解耦。在介绍 MediatR 之前,先简单了解下中介者模式。中介者模式主要是指定义一个中介对象来…

[Spring5]IOC容器_Bean管理XML方式_注入其他类型属性

xml注入其他属性 bean: package com.atguigu.spring;/*** 演示使用set方法进行注入属性*/ public class Book {private String bname;private String bauthor;private String address;public Book(String address) {this.address address;}public String getBname() {return…

ERP平台的自动化测试技术实践

源宝导读:ERP是“业务密集”的大型复杂软件,而且对于业务逻辑与数据的精确度要求几乎是零容忍,其质量保障的挑战很大。本文将介绍ERP平台通过自动化测试保障质量的技术实践。一、自动化测试概念介绍测试金字塔原理1.1、测试的成本UI自动化依赖…

[Spring5]IOC容器_Bean管理XML方式_注入集合类型属性

xml注入集合属性 1.注入数组类型属性 2.注入List集合类型属性 3.注入Map集合类型属性 (1)创建类,定义数组,list,map,set类型属性,生成对应set方法 package com.atguigu.collectiontype;imp…

Logging with ElasticSearch, Kibana, ASP.NET Core and Docker

“好久不见,前两周经历了人生第一次"伪牛市",基金和股市大起大落,更加坚信“你永远赚不到超出你认知范围之外的钱,除非靠着运气”,老韭菜诚不欺我也。当能力与野心不匹配,只能多看书,收割那些不求…

[Spring5]IOC容器_Bean管理_工厂Bean

IOC操作Bean管理(FactoryBean) 1.Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean) 2.普通bean:在配置文件中定义bean类型就是返回类型 3.工厂bean:在配置文件定…

Redis 6.0 新特性 ACL 介绍

Redis 6.0 新特性 ACL 介绍Intro在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是没有用户的概念的,其实没有办法很好的控制权限,redis 6.0 开始支持用户,可以给每个用户分配不同的权…

[Spring5]IOC容器_Bean管理_bean的作用域和bean的生命周期

IOC操作Bean管理(bean作用域) 1.在Spring里面,设置创建bean实例是单实例还是多实例 2.在Spring里面,默认情况下,bean是单实例对象 package com.atguigu.spring.test;import com.atguigu.spring.collectiontype.Book…

手动造轮子——为Ocelot集成Nacos注册中心

前言近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题。我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证、授权、熔断、限流、注册发现、负载均衡等等。随…

程序员修神之路--简约而不简单的分布式通信基石

点击“蓝字”关注,领取架构书籍菜菜哥,请教一个问题呗面试又被卡住了?还是你了解我呀,tcp协议面向连接是怎么回事呢?这个说详细起来,那本好几百页的tcp协议的书籍你倒是可以看看分布式系统可以总结为是处于…

[Spring5]IOC容器_Bean管理注解方式_创建对象

IOC操心Bean管理(基于注解方式) 1.什么是注解 (1)注解是代码特殊标记,格式:注解名称(属性名称属性值,属性名称属性值…) (2)使用注解,注解作用在类上面,方…

一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗

一:背景1. 讲故事最近因为各方面原因换了一份工作,去了一家主营物联柜的公司,有意思的是物联柜上的终端是用 wpf 写的,代码也算是年久失修,感觉技术债还是蛮重的,前几天在调试一个bug的时候,看到…

.Net Core in Docker极简入门(上篇)

点击上方蓝字"小黑在哪里"关注我吧环境准备Docker基础概念Docker基础命令Docker命令实践构建Docker镜像Dockerfilebulid & run前言Docker 是一个开源的应用容器引擎,它十分火热,如今几乎成为了后端开发人员必须掌握的一项技能。即使你在生…

[Spring5]AOP底层原理

AOP底层原理 1.AOP底层使用动态代理 (1)有两种情况动态代理 第一种 有接口的情况,使用JDK动态代理 a.创建接口实现类代理对象,增强类的方法 第二种 没有接口的情况,使用CGLIB动态代理 a.创建子类的代理对象&#…

Hangfire定时触发作业,好像很简单?

【导读】本节我们继续稍微详细讲讲在我没有详细了解源码的前提下来探讨通过Hangfire定时触发作业有哪些需要注意的事项间隔时间内执行作业举个栗子,每隔10秒监控系统CPU,若CPU飙高(根据实际业务定义百分比)则在控制台打印输出&…

五分钟快速搭建Serverless免费邮件服务

1. 引言本文将带你快速基于 Azure Function 和 SendGrid 构建一个免费的Serverless(无服务器)的邮件发送服务,让你感受下Serverless的强大之处。该服务可以每月免费发送2,5000封,这是完全白嫖啊,感兴趣的,赶…

[Swagger2]SpringBoot集成Swagger

SpringBoot集成Swagger 引入依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</…

IdentityServer4 4.x版本 配置Scope的正确姿势

点击上方蓝字"小黑在哪里"关注我吧前言IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证的框架IdentityServer4官方文档&#xff1a;https://identityserver4.readthedocs.io/看这篇文章前默认你对IdentityServer4 已经有一…

[Swagger2]配置Swagger

配置Swaggr 1、Swagger实例Bean是Docket&#xff0c;所以通过配置Docket实例来配置Swaggger。 package com.xxxx.swagger2.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.doc…

.Net Core微服务入门全纪录(完结)——Ocelot与Swagger

点击上方蓝字"小黑在哪里"关注我吧前言上一篇【.Net Core微服务入门全纪录&#xff08;八&#xff09;——Docker Compose与容器网络】完成了docker-compose.yml文件的编写&#xff0c;最后使用docker compose的一个up指令即可在docker中运行整个复杂的环境。本篇简单…