云原生实战K8s+Docker+DevOps+Jenkins
应用部署实战
ruo-yi-cloud
1、项目
https://gitee.com/y_project/RuoYi-Cloud
2、架构
下载项目
本地环境nacos启动
单机模式mysql启动nacos,nacos conf/application.properties
配置文件添加如下配置,并运行目录下的sql文件
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTime=3000&autoReconnect=true
db.user.0=root
db.password.0=123456
- 1
- 2
- 3
- 4
- 5
导入ruoyi数据库
生成了一个ry-config数据
更改nacos配置,使其连接到新创建的数据库
db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTime=3000&autoReconnect=true
再创建ry-cloud数据库导入数据表
启动前段项目
cd ruoyi-ui/
npm install --registry=https://registry.npm.taobao.org
npm run dev
- 1
- 2
- 3
ruo-yi-cloud上云
1、迁移数据库
三个表
2、nacos上云
将nacos部署为有状态应用,这样才能有固定的域名访问,将来服务奔溃后重新拉起分配的IP改变但是域名没有改变,这就是有状态应用和无状态应用的区别
创建有状态服务
先不挂载外部配置文件,分析nacos的集群配置
服务创建完毕,开两台副本发现命名规则
ping分配的服务地址DNS,返回真实ping地址,发现命名规则
ping mall-naos.mall
64 bytes from mall-naos-v1-0.mall-naos.mall.svc.cluster.local (192.168.169.158): icmp_seq=2 ttl=64 time=0.029 ms
- 1
- 2
那么这两台pod的地址久分别为,为集群分配的固定域名访问
mall-naos-v1-0.mall-naos.mall.svc.cluster.local
mall-naos-v1-1.mall-naos.mall.svc.cluster.local
- 1
- 2
进入容器查看配置文件都在/home/nacos/conf
下
两个核心配置文件 application.properties cluster.conf
集群配置文件挂载,配置文件子路径挂载,不要被容器内的这两个配置文件覆盖
重新创建nacos有状态应用
将两个配置文件都以特定的建和路径挂载,以免被覆盖
注意修改数据库地址为集群内的mysql
Java微服务上云
云上环境Dockerfile配置
FROM openjdk:8-jdk
LABEL maintainer=zhuazhu
#docker run -e PARAMS="--server.port 9090"
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.discovery.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY target/*.jar /app.jar
EXPOSE 8080
#
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
规则:
1、容器默认以8080端口启动
2、时间为CST
3、环境变量 PARAMS 可以动态指定配置文件中任意的值(指定了配置文件 应用名-prod.yml
)
4、nacos集群内地址为 his-nacos.his:8848
5、微服务默认启动加载 nacos中 服务名-激活的环境.yml 文件,所以线上的配置可以全部写在nacos中。
准备好nacos的命名空间prod并将dev空间的配置文件克隆至prod空间
微服务上云流程分析
将各个微服务模块打包
整体上传至服务器
镜像推送
挨个执行镜像构建打包
cd ruoyi-auth/
docker build -t ruoyi-auth:v1 -f dockerfile .
- 1
- 2
打包完成后再阿里云的容器镜像服务中个人实例创建一个命名空间仓库
# 改成自己登录阿里云的账号,登录阿里云镜像仓库
docker login [email protected] registry.cn-hangzhou.aliyuncs.com
#把本地镜像,改名,成符合阿里云名字规范的镜像。
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/镜像名:[镜像版本号]
# 试例
# docker tag 461955fe1e57 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/镜像名:[镜像版本号]
# 试例
# docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
docker tag 9e5e5f4a8b88 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2
docker tag ece0d4dad3e0 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-system:v2
docker tag 04aeddb539ca registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-job:v2
docker tag 8ceee5721625 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-gateway:v2
docker tag ca68bd4945fd registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-file:v2
docker tag a425688539cc registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-auth:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-system:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-job:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-gateway:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-file:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-auth:v2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
服务创建
创建无状态服务
同步主机时区
启动后查看服务启动日志,有报错
NacosException: Nacos cluster is running with 1.X mode
- 1
错误为当前是nacos的1.x
集群模式,需要改成2模式
将nacos改为单节点模式不以集群运行,修改启动配置添加启动时环境变量
报错,数据库连接错误,排查数据库忽略大小写
gateway报错,9848,因为本地文件配置了sentinel,所以更改配置文件,将这段放置线上,用线上覆盖本地
因为nacos做流量保护的配置没改到,放到线上就可覆盖
前段上云&测试
更改根目录下vue.config.js
中网关地址为已上线的gateway地址
npm run build:prod
- 1
打包完成生产dist文件,前段所有文件在其中,将其放入nginx静态目录即可
修改nginx中负载均衡的网关地址
localhost只处理本机请求改为_
任意请求
打包上传
创建无状态服务,TCP80,外网访问NodePort
nacos的存活探针
重启服务器时,mysql后于nacos启动,导致nacos启动失败,微服务注册不了,启动失败
启动20秒后检查设置的请求,超时时间3s
DevOps
DevOps基础
1、DevOps简介
DevOps 是一系列做法和工具,可以使 IT 和软件开发团队之间的流程实现自动化。其中,随着敏捷软件开发日趋流行,持续集成 (CI) 和持续交付 (CD) 已经成为该领域一个理想的解决方案。在 CI/CD 工作流中,每次集成都通过自动化构建来验证,包括编码、发布和测试,从而帮助开发者提前发现集成错误,团队也可以快速、安全、可靠地将内部软件交付到生产环境。
尚医通上云
1、项目架构
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]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
2、中间件
中间件 | 集群内地址 | 外部访问地址 |
---|---|---|
Nacos | his-nacos.his | . |
. | ||
. | ||
. | ||
. | ||
. | ||
. |
中间件部署
1、sentinel
有状态服务,镜像地址
leifengyang/sentinel:1.8.2
2、mongeodb
应用负载-应用-部署新应用-来自应用模版
从之前设置的bitnami仓库中拉取镜像,只关闭账号密码访问,其他不变
3、mysql
数据库数据初始化,导入数据
生产环境配置抽离
将本地配置文件复制一份至nacos的prod空间,为所有应用修改好配置
创建DevOps工程
创建DevOps工程,而后创建流水线,只输入名称创建完成,而后编辑流水线,生成一个流水线模版,不做改动保存此模版,再以后在此模版基础上做改动
可视化Pipeline
编辑流水线
1、拉取代码
maven代理,git 拉取,ls -al
2、项目编译
设置集群拉取时的maven镜像仓库
admin登录kubesphere,集群管理-配置中心-配置-ksdevops-agent
-修改配置-添加mirror标签
编辑流水线,添加步骤,maven容器
shell mvn clean package -Dmaven.test.skip=true
3、构建镜像
docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage/
测试单个打包成功
并发构建
此时编辑dockerfile更快捷
4、推送镜像
嵌套步骤中添加凭证,将凭证中的账号密码输出到环境变量中
stage('推送镜像') {
steps {
container('maven') {
//加载凭证中的爱里云镜像仓库账号密码
withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
5、部署到dev环境
可以添加审核步骤,@项目中的其他人来确认审核,这里不做审核
根据配置文件yml来部署镜像
- 给每一个微服务准备一个 deploy.yaml(k8s的部署配置文件)
- 执行以下步骤
- 传入 deploy.yaml 的位置就能部署
○ kubectl apply -f xxxx
在k8s集群中,默认在非master节点中是无法执行apply配置文件部署的,需要获取到授权信息
由于每一个镜像都得登录阿里云镜像下载镜像,设置凭证名为aliyun-docker-hub
,所以提前创建好此凭证
项目空间下-配置中-密钥-创建密钥
6、系统邮件功能
admin账号-平台设置-通知管理-邮件