前言


公司设计的RDMS挺好用的,我也照猫画虎简单的设计一个DevOps系统,与大家分享,不足之处欢迎拍砖,以免误人子弟

前置条件

gitlab

gitlab-runner

k8s

1. gitlab创建群组

创建群组的好处是,对项目进行分组,群组内的资源可以共享,这里创建了一个tibos的群组

2. 在群组创建一个项目

这里创建一个空白项目,项目名为Gourd.Test,将项目克隆到本地,然后在该目录下创建一个.net core3.1的webapi项目,并推送到gitlab

3.编写dockerfile

  1. FROM registry.cn-hangzhou.aliyuncs.com/wmowm/dotnet.core.aspnet:3.1 AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. LABEL applabel=tibos
  5. FROM registry.cn-hangzhou.aliyuncs.com/wmowm/dotnet.core.sdk:3.1 AS build
  6. WORKDIR ../Gourd.Test
  7. COPY . .
  8. WORKDIR "/Gourd.Test"
  9. RUN dotnet publish "Gourd.Test.csproj" -c Release -o /app
  10. FROM base AS final
  11. WORKDIR /app
  12. COPY --from=build /app .
  13. RUN rm -rf appsettings.Development.json
  14. RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  15. && echo 'Asia/Shanghai' >/etc/timezone
  16. ENTRYPOINT ["dotnet", "Gourd.Test.dll","-b","0.0.0.0"]

这里给镜像加了一个标签(LABEL applabel=tibos),方便清理

4.编写 gitlab-ci.yml

  1. variables:
  2. PROJECT_NAME: gourd.test
  3. WEBAPI_DOCKERFILE_PATH: ./Gourd.Test/dockerfile
  4. stages:
  5. - build
  6. - deploy
  7. build:
  8. stage: build
  9. script:
  10. - echo "登录私有仓库"
  11. - docker login --username=${DOCKER_REPOSTORY_USERNAME} -p ${DOCKER_REPOSTORY_PASSPORD} ${DOCKER_REPOSTORY_ADDRESSURL}
  12. - imageversion=$CI_PIPELINE_ID
  13. - echo "开始构建镜像:${PROJECT_NAME}.${imageversion}"
  14. - docker build -t ${PROJECT_NAME}.${imageversion} .
  15. - echo "打标签:${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}"
  16. - docker tag ${PROJECT_NAME}.${imageversion} ${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}
  17. - echo "推送到中央仓库"
  18. - docker push ${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}
  19. - echo "清理未使用的镜像"
  20. - docker image prune -a -f --filter="label=applabel=tibos"
  21. - docker rmi $(docker images | grep "none" | awk '{print $3}')
  22. only:
  23. - main

白话文翻译ci配置

定义了两个变量,项目名称与dockerfile相对地址,然后执行构建步骤,构建脚本如下

  1. 登录docker私有仓库,这里是bp的阿里云的docker仓库,后文会讲如何bp
  2. 定义镜像版本号,这里直接取gitlab-ci内置的流水线编号作为版本号,gitlab-ci内置了很多环境变量,可以查阅文档
  3. 构建镜像
  4. 镜像打标签
  5. 推送到阿里云docker仓库
  6. 清理未使用且包含tibos标签的镜像

5.敏感信息,使用ci的变量进行保护

6.bp阿里云镜像仓库

先创建一个名称空间,然后根据自己的项目名称创建对应的仓库即可,也可以把外网的一些镜像打个标签,推送到自己的镜像仓库,这样从自己的镜像仓库拉取,速度会快很多

在镜像版本里查看自己推送的镜像,这些都是gitlab-ci 构建成功,推送过来的

7.注册runner

我这里是创建的团队runner,这样团队项目可以共享该runner,注册好后编辑runner,勾选运行未标记的作业,怎么注册gitlab-runner网上有很详细的教程,这里就不多赘述了

gitlab-runner job如下,可以看到.net core 构建还是挺快的

  • 做到这里ci部分就完成了,当我们提交代码的时候,会自动触发gitlab-ci,然后docker构建,并推送到镜像仓库,接下来是cd 部分

8.开启gitlab webhooks功能,将事件消息推送给指定的服务

这里写一个服务,用来接收gitlb webhooks 通过post发送的http请求,下面有它的发送记录,方便我们查找问题,我们根据请求详情,通过vs辅助功能把json一键转换成实体,作为vo,并把数据持久化到数据库,它的状态变化为 created->pending->running->success,可以根据自己的业务进行定制

9.发布到k8s

发布到k8s有两种途径,1.通过k8s代理,直接调用k8s api, 2.通过shell直接执行k8s命令, 这个根据自己的业务来定制,我这里采用了shell的方式,因为简单方便

  • k8s api如下

10. netcore 使用supversior托管后,无法执行shell的问题

去官网转了一圈,没找到有用信息,大概意思是子进程下无法获取宿主全部环境,仅仅是拷贝几个环境到子流程环境,所以导致shell无法执行........ 换成pm2来托管程序,可以正常执行shell

能执行shell那就好办了,基本上可以通过shell完成所有k8s功能, 比如 发布,回滚,扩容,修改配置,查询容器日志.......

11. 设置部署环境

我们可以根据项目分支或者tag来对应不同的环境,如develop,test,pre,prod..... 比如pre环境只能发布master分支的构建记录

12. 通过网页显示容器日志

通过k8s api 或者shell 都可以查询日志, linux服务端日志一般采用ANSI编码,部分内容展示会出现乱码,这里我们用ansi_up.js这个库,可以解决该问题

设计一个简单的devops系统的更多相关文章

  1. Linux内核设计第三周——构造一个简单的Linux系统

    Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...

  2. Linux下一个简单的日志系统的设计及其C代码实现

    1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...

  3. python制作一个简单的中奖系统

    注释: 展示图下的代码,我是用pycharm写的,是python解释器中的一种,本课没不同解释器的要求,可根据自己喜欢的解释器编写. 步骤: 本期给大家带来的是,一个简单的中奖系统,首先打开自己电脑上 ...

  4. 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...

  5. 第三节 构造一个简单的Linux系统MenuOS——20135203齐岳

    第三节 构造一个简单的Linux系统MenuOS By 20135203齐岳 Linux内核源代码 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相 ...

  6. Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...

  7. 一个简单的CS系统打包过程图文版

    一个简单的CS系统打包过程图文版 1.     打包内容 1.1.  此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...

  8. 设计一个简单的,低耗的能够区分红酒和白酒的感知器(sensor)

    学习using weka in your javacode 主要学习两个部分的代码:1.过滤数据集 2 使用J48决策树进行分类.下面的例子没有对数据集进行分割,完全使用训练集作为测试集,所以不符合数 ...

  9. Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)

    Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...

随机推荐

  1. PyTorch 中的乘法:mul()、multiply()、matmul()、mm()、mv()、dot()

    torch.mul() 函数功能:逐个对 input 和 other 中对应的元素相乘. 本操作支持广播,因此 input 和 other 均可以是张量或者数字. 举例如下: >>> ...

  2. C# Debug和Trace:输出调试信息

    在 C# 语言中允许在程序运行时输出程序的调试信息,类似于使用 Console.WriteLine 的方式向控制台输出信息.所谓调试信息是程序员在程序运行时需要获取的程序运行的过程,以便程序员更好地解 ...

  3. ssh执行命令或者脚本里最好先加上 source /etc/profile

    记: 写一次shell脚本,发现总提示 找不到JAVA_HOME .明明已经配了环境变量,并且java -version也已经能输出信息,但就是提示. 后来在 脚本中加入第一句代码 source /e ...

  4. Qt:QCustomPlot使用教程(二)——基本绘图

    0.说明 本节翻译总结自:Qt Plotting Widget QCustomPlot - Basic Plotting 本节内容是使用QCustomPlot进行基本绘图. 本节教程都使用custom ...

  5. 【NumPy】 之常见运算(np.around、np.floor、np.ceil、np.where)(转)

    原博客链接:https://blog.csdn.net/tz_zs/article/details/80775256 np.around: 四舍五入取整 n = np.array([-0.746, 4 ...

  6. 前端好用API之getBoundingClientRect

    前情 在前端开发需求中,经常需要获取元素的尺寸位置相关的属性,以往的做法是调用不同api获取相关属性的. getBoundingClientRect介绍 getBoundingClientRect() ...

  7. JZ-040-数组中只出现一次的数字

    数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目链接: 数组中只出现一次的数字 代码 /** * 标题:数组中只出现 ...

  8. LeetCode-017-电话号码的字母组合

    电话号码的字母组合 题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示 ...

  9. css3渐变色字体

    \3cspan id="mce_marker" data-mce-type="bookmark">\3c/span>\3cspan id=" ...

  10. thinkphp 用户登录记录日记

    1.设计数据库表名,字段 2,建立模型 <?php namespace app\login\model; use think\Model; class LoginLon extends Mode ...