KubeSphere --- DevOps

1. 概述

1.1 什么是DevOps

从之前的部署可以看出来,我们一些列操作都是机械化,重复的工作.所以想要使得项目流程全部自动化, DevOps 是用来代替人工部署的

DevOps 是一系列做法和工具,可以使 IT 和软件开发团队之间的流程实现自动化。其中,随着敏捷软件开发日趋流行,持续集成 (CI)持续交付 (CD) 已经成为该领域一个理想的解决方案。在 CI/CD 工作流中,每次集成都通过自动化构建来验证,包括编码、发布和测试,从而帮助开发者提前发现集成错误,团队也可以快速、安全、可靠地将内部软件交付到生产环境。

  1. 持续集成(Continuous Integration)
    1. Build: 代码构建
    2. Test: 代码测试
    3. Merge: 合并代码库阶段
  2. 持续交付(Continuous Delivery)
  3. 持续部署(Continuous Deployment)

1.2 流程图

  1. 在开发期间使用一些团队协作工具来发布一些需求,
  2. 由编发人员通过IDE工具进行编码
  3. 自动将代码保存到git仓库中
  4. 自动构建编译代码
  5. 自动分析代码质量
  6. 自动对代码进行单元测试
  7. 自动生成测试报告或项目的构建报告,得到一些代码制品,存储在仓库中
  8. 自动根据代码制品,制作成镜像,保存到镜像仓库
  9. 自动部署到k8s平台
  10. 自动监控应用的运行状态和日志,然后将bug或者新需求提交到团队协作工具,再次进行编码,然后再自动化构建,自动化分析.....

1.3 官方文档

https://kubesphere.io/zh/docs/v3.4/devops-user-guide/devops-overview/overview/

1.4 缓存机制

已经下载过的jar包,或golang依赖,下一次流水线启动时,不用再次下载

2. Java项目使用DevOps上云

2.1 项目地址

https://gitee.com/leifengyang/yygh-parent  # 医院挂号平台 + 后台管理 --后端
https://gitee.com/leifengyang/yygh-admin   # 后台管理系统 -- 前端
https://gitee.com/leifengyang/yygh-site    # 医院挂号平台 -- 前端

2.2 项目架构

2.3 目录结构

yygh-parent
|---common                                  //通用模块
|---hospital-manage                         //医院后台				[9999]   
|---model																		//数据模型
|---server-gateway													//网关    				[80]
|---service																	//微服务层
|-------service-cmn													//公共服务				[8202]
|-------service-hosp												//医院数据服务		[8201]
|-------service-order												//预约下单服务		[8206]
|-------service-oss													//对象存储服务		[8205]
|-------service-sms													//短信服务				[8204]
|-------service-statistics									//统计服务				[8208]
|-------service-task												//定时服务				[8207]
|-------service-user												//会员服务				[8203]


====================================================================

yygh-admin																	//医院管理后台		[9528]
yygh-site																		//挂号平台				[3000]

2.4 中间件部署

1. 中间件列表及访问路径

中间件 集群内地址 外部访问地址
Nacos his-nacos.his:8848 http://139.198.165.238:30349/nacos
MySQL his-mysql.his:3306 http://139.198.165.238:31840
Redis his-redis.his:6379 http://139.198.165.238:31968
Sentinel his-sentinel.his:8080 http://139.198.165.238:31523/
MongoDB mongodb.his:27017 http://139.198.165.238:32693
RabbitMQ rabbitm-yp1tx4-rabbitmq.his:5672 http://139.198.165.238:30375
ElasticSearch his-es.his:9200 http://139.198.165.238:31300

2. Sentinel 部署(微服务流量监控保护)

1. 点击服务

2. 创建有状态服务

3. 填写基本信息

4. 选择镜像

5. 同步主机时区

6. 无需挂载数据卷或配置文件,直接点击下一步

7. 点击创建即可

8. 配置外网访问

1. 创建服务

2.填写基本信息

3. 选择访问类型和指定工作负载

4. 填写容器内端口

5. 选择外网访问,并选择访问方式为:NodePort

9. 浏览器访问

账号:sentinel 密码:sentinel

http://139.198.165.238:31523/

3. MongoDB 部署

1. 选择应用,部署新应用

2. 部署 bitnami 公司上传的Pod

3. 修改应用名称,点击下一步

4. 以单节点运行,并取消账号密码验证,然后点击部署即可

5. 外网访问和上面一样

2.5 导入初始数据

1. MySQL

2.6 生产和开发配置隔离

在打包时的 Dockerfile 中以命令的形式激活了生产环境,会自动在配置中心查找开发环境的配置文件

1. 项目默认规则

  • 每个微服务项目,在生产环境时,会自动获取 微服务名-prod.yml 作为自己的核心配置文件
  • 每个微服务项目,在生产环境时,默认都是使用 8080 端口

2. nacos 中注册各微服务生产环境的配置信息

1. 浏览器打开nacos

注意替换为上面自己部署的nacos地址

http://139.198.165.238:30349/nacos

2. 新建每个微服务的生产环境配置

注意修改各数据存储服务的IP和端口

1. 修改运行端口

2. 修改 sentinel 和 redis 的集群内访问地址

3. 修改MySQL的集群内访问地址及账号密码

2.7 创建 DevOps 工程

1. 账号权限

必须使用企业空间管理员账号才能创建 DevOps 工程

2. 创建工程并邀请成员

1. 点击创建 DevOps 工程

2. 填写基本信息

3. 点击进入工程详情

4. 可以邀请一些开发人员到这个工程里进行操作,创建流水线

2.8 创建流水线

1. 创建流水线,填写基本信息

2. 直接创建

3. 点击进入流水线

4. 编辑流水线

5. 生成流水线模板

6. 保存

7. 点击编辑 流水线

2.9 编辑流水线

0. 关于 agent 的文档地址

https://kubesphere.io/zh/docs/v3.4/devops-user-guide/how-to-use/pipelines/choose-jenkins-agent/

1. 选择整体 Agent (代理)

1. 配置 maven 加速

3. maven默认下载依赖是外网,所以下载会很慢,需要配置 maven 加速

1. 登录 admin 账号

2. 在 集群管理--配置中心 找到 ks-devpos-agent 的配置

3. 修改 maven 的配置

找到 mirrors 添加加速配置

<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

2. 第一步: 拉取代码

1. 点击标签

2. 编辑拉取代码的基本信息

3. 编辑拉取代码的任务

1. 指定容器

在 base nodejs maven go 中选一个,由于当前步骤是拉取代码,只需要使用 git 的命令即可,所以参考上面 agent 的文档地址选哪个容器中有git,这里示例中选的maven, 测试的时候base有一些问题,导致执行失败

添加嵌套步骤,即想用当前选的base 来做什么事

选择通过 git 拉取代码

输入 git 仓库地址

一般代码都是存储在私有仓库中的,需要登录,所以点击新建凭证,用来登录git账号

填写 git 仓库地址,账号登录凭证,分支信息

可以在拉取完代码后,使用一些shell命令,再次点击嵌套步骤

选择 shell

执行 ls -al 列出当前文件夹中的所有文件名

点击确定,保存

运行一下,查看第一步的运行结果

查看日志

3. 第二步: 项目编译

0. 检查一下 hospital-manage/pom.xml 源码中可能有问题,照着下面的截图修改

1. 指定 maven 容器

2. 添加嵌套步骤

3. 选择 shell,填写 maven 编译命令

mvn clean package -Dmaven.test.skip=true

4. 运行前两步,查看是否可以运行成功

参数先随便输,后面会有正式的输入

查看日志

4. 第三步: 构建镜像

1. 修改基本信息

2. 指定镜像

3. 项目编译完成后,会在每个微服务的文件夹中,由一个 target 文件夹,其中有编译好的jar包,项目中已经提前编写了 Dockerfile 只需执行 docker build 即可

可以添加并行阶段,用来并行构建所有的微服务镜像

添加嵌套步骤, 选择shell 命令

docker build -t hostpital-manage:v1.0 -f hostpital-manage/Dockerfile ./hostpital-manage/

4. 并行阶段中,添加嵌套步骤, 选择shell 命令,手动配置或者直接编辑Jenkinsfile

可以点击编辑Jenkinsfile 直接修改 jenkinsfile

对于service 文件夹中的微服务的构建命令,则需要修改

docker build -t service-cmn:v1.0 -f service/service-cmn/Dockerfile ./service/service-cmn/

5. 第四步: 推送到镜像仓库

1. 修改基本信息

2. 因为镜像仓库都是私有仓库,所以需要添加 阿里云镜像仓库的 账号密码凭证

创建凭证

添加凭证

添加凭证的嵌套步骤,选择shell,要进行登录阿里云

编辑Jenkinsfile

stages {
    stage('推送镜像到阿里云') {
        steps {
            container('maven') {
                // 加载凭证
                withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                    // 1. 登录阿里云镜像仓库
                    sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER-VAR" --password-stdin'
                }
            }
        }
    }
}

2. 以 hospital-manage 微服务 为例将镜像重新打标签,并推送到阿里云镜像仓库

stages {
    stage('推送镜像到阿里云') {
        steps {
            container('maven') {
                // 加载凭证
                withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                    // 1. 登录阿里云镜像仓库
                    sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER-VAR" --password-stdin'
                    // 2. 将镜像重新打标签
                    // $BUILD_NUMBER 为流水线的运行次数
                    // docker tag hostpital-manage:v1.0 registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker tag hostpital-manage:v1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/hostpital-manage:SNAPSHOT-$BUILD_NUMBER'
                    // 3. 将镜像推送到阿里云镜像仓库
                    // docker push registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hostpital-manage:SNAPSHOT-$BUILD_NUMBER'
                }
            }
        }
    }
}


environment {
	// environment 定义的所有变量,可以在 Jenkinsfile 的任意位置使用 $变量名的 方式调用
    DOCKER_CREDENTIAL_ID = 'dockerhub-id'
    GITHUB_CREDENTIAL_ID = 'github-id'
    KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    // 推送镜像到阿里云镜像仓库地址的格式: 镜像仓库地址/命名空间/镜像名:版本号
    // registry.cn-hangzhou.aliyuncs.com/lfy_hello/kube-apiserver:v1.0
    REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'   // 镜像仓库地址
    DOCKERHUB_NAMESPACE = 'lfy_hello'   // 命名空间
    APP_NAME = 'kube-apiserver'  // 镜像名
}

3. 并行推送所有的微服务镜像到镜像仓库中

stages {
    stage('推送 hospital-manage 镜像到阿里云') {
        steps {
            container('maven') {
                // 加载凭证
                withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                    // 1. 登录阿里云镜像仓库
                    sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER-VAR" --password-stdin'
                    // 2. 将镜像重新打标签
                    // $BUILD_NUMBER 为流水线的运行次数
                    // docker tag hostpital-manage:v1.0 registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker tag hostpital-manage:v1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/hostpital-manage:SNAPSHOT-$BUILD_NUMBER'
                    // 3. 将镜像推送到阿里云镜像仓库
                    // docker push registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hostpital-manage:SNAPSHOT-$BUILD_NUMBER'
                }
            }
        }
    }
    
    stage('推送 server-gateway 镜像到阿里云') {
        steps {
            container('maven') {
                // 加载凭证
                withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                    // 1. 登录阿里云镜像仓库
                    sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER-VAR" --password-stdin'
                    // 2. 将镜像重新打标签
                    // $BUILD_NUMBER 为流水线的运行次数
                    // docker tag hostpital-manage:v1.0 registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker tag server-gateway:v1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER'
                    // 3. 将镜像推送到阿里云镜像仓库
                    // docker push registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER'
                }
            }
        }
    }
    
    stage('推送 server/server-cmn 镜像到阿里云') {
        steps {
            container('maven') {
                // 加载凭证
                withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                    // 1. 登录阿里云镜像仓库
                    sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER-VAR" --password-stdin'
                    // 2. 将镜像重新打标签
                    // $BUILD_NUMBER 为流水线的运行次数
                    // docker tag hostpital-manage:v1.0 registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker tag server-cmn:v1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/server-cmn:SNAPSHOT-$BUILD_NUMBER'
                    // 3. 将镜像推送到阿里云镜像仓库
                    // docker push registry.cn-hangzhou.aliyuncs.com/lfy_hello/hostpital-manage:SNAPSHOT-3
                    sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/server-cmn:SNAPSHOT-$BUILD_NUMBER'
                }
            }
        }
    }
    
    // ...... 等等 .......
}
posted @ 2024-03-07 16:53  河图s  阅读(29)  评论(0)    收藏  举报