k8s 上部署应用

@[TOC]k8s 上部署

一.k8s部署MYSQL

0.k8s 有状态服务部署

可以使用 kubesphere,快速搭建 MySQL 环境。

  • 有状态服务抽取配置为 ConfigMap
  • 有状态服务必须使用 pvc 持久化数据
  • 服务集群内访问使用 DNS 提供的稳定域名

k8s 上部署应用_第1张图片

1.k8s部署MYSQL, project-regular登录

启动 56.10 ,56.100、56.101、56.102
k8s控制台,http://192.168.56.100:30880/ 用户名:project-regular, 密码 Qwer23456

1.0 创建的mysql-master的准备

1). 创建mysql-master配置

k8s 上部署应用_第2张图片
mysql-master-cnf mysql-master的配置
k8s 上部署应用_第3张图片
k8s 上部署应用_第4张图片
键:my.cnf
值是

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

k8s 上部署应用_第5张图片

2). 创建mysql-master存储劵pvc

k8s 上部署应用_第6张图片
gulimall-mysql-master-pvck8s 上部署应用_第7张图片 k8s 上部署应用_第8张图片
k8s 上部署应用_第9张图片

1.1 创建mysql的master服务

1).创建mysql的master服务

创建mysql有状态服务
k8s 上部署应用_第10张图片
k8s 上部署应用_第11张图片
名称:mysql-master
别名:mysql主节点
下一步 k8s 上部署应用_第12张图片
mysql:5.7

k8s 上部署应用_第13张图片
添加容器
k8s 上部署应用_第14张图片

高级设置
k8s 上部署应用_第15张图片
环境变量
MYSQL_ROOT_PASSWORDk8s 上部署应用_第16张图片
下一步

添加存储劵、配置文件
挂载配置文件或密钥,需要自己创建。

添加挂载配置文件k8s 上部署应用_第17张图片
/etc/mysql
my.cnf
k8s 上部署应用_第18张图片
添加存储劵k8s 上部署应用_第19张图片
/var/lib/mysql
k8s 上部署应用_第20张图片
下一步
k8s 上部署应用_第21张图片
创建
k8s 上部署应用_第22张图片
创建mysql-master服务成功
k8s 上部署应用_第23张图片

2).进入容器组、测试

j进入服务的容器组,就好像进入mysql的容器,如exec进入一样
k8s 上部署应用_第24张图片

1.2、 创建mysql-salve服务的准备

1).创建mysql-salve配置

gulimall项目,配置中心,配置,创建

名称:mysql-slaver-cnf
别名:mysql的slaver的配置
下一步

点击 添加数据
key:my.cnf
值:

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

点击对号
在这里插入图片描述
创建

创建成功的展示
k8s 上部署应用_第25张图片

2).创建mysql-salve存储劵pvc

gulimall项目,存储劵,创建,
名称:gulimall-mysql-slaver-pvc
别名:mysql-slaver-pvc
下一步

下一步
创建

创建成功的展示
k8s 上部署应用_第26张图片

1.3、创建mysql的slaver服务

1).创建mysql的slaver服务

gulimall项目,应用负载,服务,创建

有状态服务

名称:mysql-slaver
别名:mysql的slaver
下一步

容器组副本数量;1
容器组分散部署
k8s 上部署应用_第27张图片

添加容器镜像
mysql:5.7 ,回车
点击 使用默认端口

高级设置
k8s 上部署应用_第28张图片

环境变量
选择环境变量
点击 引用配置文件或密钥

MYSQL_ROOT_PASSWORD
k8s 上部署应用_第29张图片
点击对号
在这里插入图片描述
下一步

添加存储劵
点击 添加存储劵
选择mysql-slaver-pvc
/var/lib/mysql
k8s 上部署应用_第30张图片
点击对号
在这里插入图片描述

挂载配置文件或密钥
点击 添加挂载配置
选择mysql-slaver-cnf
/etc/mysql
点击对号
k8s 上部署应用_第31张图片

选择特定的键值和路径
my.cnf
在这里插入图片描述
点击对号
下一步

创建

创建成功的展示
k8s 上部署应用_第32张图片

2).进入容器组、测试

点击mysql-slaver服务,进入 mysql-slaver 服务
k8s 上部署应用_第33张图片
自动分配 mysql-slaver.gulimall

1.4 配置mysql主从复制

1).配置mysql-master

为 master 授权用户来他的同步数据

进入mysql-master服务,进入容器组
点击终端,进入终端
k8s 上部署应用_第34张图片
在这里插入图片描述

连接上mysql-master,密码为123456

mysql -uroot -p123456

k8s 上部署应用_第35张图片

执行,命令,为 master 授权用户来他的同步数据

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

查看 master 状态
show master status;

结果:mysql-bin.000003
mysql-bin.000031
k8s 上部署应用_第36张图片
exit 退出

2).配置mysql-slaver

配置 slaver 同步 master 数据
进入mysql-slaver服务,点击容器组,进入终端
k8s 上部署应用_第37张图片
k8s 上部署应用_第38张图片

连接上mysql-slaver,密码为123456

mysql -uroot -p123456;

设置主库连接

change master to master_host='mysql-master.gulimall',master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=0,master_port=3306;

change master to master_host='mysql-master.gulimall',master_user='backup',master_password='123456',master_log_file='mysql-bin.000031',master_log_pos=0,master_port=3306;

其中mysql-master.gulimall,是mysql-master的域名,mysql-bin.000003是mysql-master的位置,3306是mysql-master的端口号
在这里插入图片描述
启动从库同步
start slave;
查看从库状态
show slave status\G;
k8s 上部署应用_第39张图片

3).测试主从复制
a.主库 创建数据库

在主库,即mysql-master,创建数据库,看从库,即mysql-slaver是否同步。
进入mysql-master终端,,连接mysql

mysql -uroot -p123456;

msater 创建数据库

CREATE DATABASE gulimall_oms DEFAULT CHARACTER set utf8mb4;

查看数据库
show databases;
k8s 上部署应用_第40张图片

c.从库 查看数据库

从库 查看是否有数据库,主从复制是否实现

进入mysql-slaver服务,进入容器组,进入终端

连接mysql-slaver

mysql -uroot -p123456;

查看数据库
show databases;

结果:从库有gulimall_oms数据库,说明主从复制成功
k8s 上部署应用_第41张图片

1.5 k8s部署mysql集群

k8s部署mysql集群,省略
与上面的操作一样,
创建多对 [ master 、slaver结构,主从复制。。 ]

还可以 ,读写分离,目前不知道怎么做??

k8s部署mysql集群 的条件
在这里插入图片描述

1.6 自定义mysql镜像

自定义进行,此镜像已经主从复制。
拉取镜像

二.k8s部署Redis

1.redis配置

1).创建redis配置

gulimall项目,配置中心,配置,创建

redis-conf
下一步

redis-conf
appendonly yes
k8s 上部署应用_第42张图片
点击 创建

2).创建redis存储劵pvc

gulimall项目,存储卷,创建

gulimall-redis-pvc
下一步

k8s 上部署应用_第43张图片
下一步

创建

2.创建redis服务

gulimall项目,应用负载,服务,创建
有状态服务

redis
下一步

在这里插入图片描述

添加镜像
redis:5.0.7
使用默认端口

高级不用设置,使用默认

选择 启动命令
运行命令: redis-server
参数: /etc/redis/redis.conf
k8s 上部署应用_第44张图片
点击对号
下一步

添加存储劵
选择redis存储劵
/data
k8s 上部署应用_第45张图片点击对号

添加配置文件
选择redis的conf
/etc/redis
k8s 上部署应用_第46张图片
选择特定的键与路径
redis.conf
在这里插入图片描述
点击对号
下一步

创建

3.测试

redis域名:
redis.gulimall

点击redis服务,容器组,容器,进入控制台
在这里插入图片描述

执行命令,进入redis客户端
redis-cli

set aa bb
get aa

4.部署redis集群

创建6个redis,6个redis配置文件、6个redis的PVC,就行啦

三、k8s 部署Elasticsearch&kibana

es安装 百度云地址 链接:https://pan.baidu.com/s/1wyQCKVoDpiJd-Hyh-g7f4w 提取码:1111

1.部署Elasticsearch

1.1 创建Elasticsearch配置

1).创建Elasticsearch配置

guliamll项目,配置中心,配置,创建

elasticsearch-conf
下一步

添加数据

第一组数据 http.host 0.0.0.0 点击对号

配置单节点
第一组数据 discovery.type single-node 点击对号

环境变量设置
第一组数据 ES_JAVA_OPTS -Xms64m -Xmx512m 点击对号

创建

2).创建Elasticsearch的存储劵 PVC

创建 存储劵
elasticsearch-pvc
下一步

下一步

创建

1.2 创建Elasticsearch服务

服务,创建,有状态服务
elasticsearch
下一步

k8s 上部署应用_第47张图片
添加容器镜像
elasticsearch:7.4.2
使用默认端口
k8s 上部署应用_第48张图片
高级环境
k8s 上部署应用_第49张图片

环境变量
选择环境变量,
引用配置文件或密钥
第一组: ES_JAVA_OPTS
第二组: discovery.type
第三组: http.host

k8s 上部署应用_第50张图片
点击对号
下一步

添加配置

暂时未配置

添加存储劵pvc
选择elasticsearch-pvc
/usr/share/elasticsearch/data
k8s 上部署应用_第51张图片
点击对号
下一步

创建

集群内部进行访问,使用DNS ,为 :
elasticsearch的域名 elasticsearch.gulimall

2.部署kibana

2.1 创建kibana服务

服务,创建,无状态服务

kibana
下一步

添加容器镜像
kibana:7.4.2
使用默认端口

环境变量
选择环境变量
点击 添加环境变量
ELASTICSEARCH_HOSTS http://elasticsearch.gulimall:9200
其中elasticsearch.gulimall 为elasticsearch的域名
k8s 上部署应用_第52张图片
点击对号
下一步

下一步

外网访问
k8s 上部署应用_第53张图片
创建

2.2 查看kibana对外暴露的端口号

服务,进入kibana服务
可别看到kibana对外暴露的端口号:31183
在这里插入图片描述

四、部署RabbitMQ

1.创建RabbitMQ存储劵 pvc

rabbitmq-pvc
下一步

创建

2.创建RabbitMQ服务

服务,创建
有状态服务

rabbitmq-management
下一步

添加容器镜像
rabbitmq:management
使用默认端口
k8s 上部署应用_第54张图片
高级设置:最大占用 1G内存
k8s 上部署应用_第55张图片
点击ok,下一步

添加存储劵pvc
/var/lib/rabbitmq
k8s 上部署应用_第56张图片
点击对号,下一步

创建

3. 暴露的服务

点击服务,找到RabbitMQ服务,进入它

暴露服务为: rabbitmq-management.gulimall
在这里插入图片描述

五、k8s部署nacos

1、创建nacos存储劵 pvc

存储劵,创建
nacos-pvc nacos存储劵pvc
下一步

在这里插入图片描述
下一步
创建

2、创建nacos状态服务

创建单节点nacos服务

gulimall项目,应用负载,服务,创建,有状态服务

服务名称:nacos
下一步

添加容器镜像
nacos/nacos-server:1.1.4
使用默认端口
k8s 上部署应用_第57张图片
环境变量
选择环境变量
点击 添加配置文件
MODE standalone
k8s 上部署应用_第58张图片
点击对号,下一步

添加存储劵
选择nacos-pvc
/home/nacos/data
k8s 上部署应用_第59张图片
点击对号,下一步
创建

3、创建nacos无状态服务

删除原有的服务,但不删除器配置
k8s 上部署应用_第60张图片

创建无状态服务
服务,创建,指定工作负载

服务名称:nacos
下一步

指定工作负载
k8s 上部署应用_第61张图片
k8s 上部署应用_第62张图片
下一步

外网访问
k8s 上部署应用_第63张图片
创建

4. 查看结果

结果,查看服务
在这里插入图片描述

点击 nacos,进入服务内部,查看暴露服务端口号 31453
在这里插入图片描述

访问成功http://192.168.56.100:31453/nacos
用户名、密码 为nacos
k8s 上部署应用_第64张图片

5. nacos进行域名访问?

创建服务,指定工作负载。与zipkin、sentinel一样
k8s 上部署应用_第65张图片
名称:nacos-service
下一步

指定工作负载
k8s 上部署应用_第66张图片
访问类型
在这里插入图片描述
端口
k8s 上部署应用_第67张图片
下一步,创建

进入nacos-service服务,查看域名:

nacos-service.gulimall
在这里插入图片描述

六、k8s 部署 zipkin

1.创建zipkin服务

服务,创建
无状态服务

服务名称:zipkin
下一步

添加容器镜像
openzipkin/zipkin
点击 使用默认端口
k8s 上部署应用_第68张图片
添加环境变量

把zipkin存储给es

STORAGE_TYPE elasticsearch

ES_HOSTS elasticsearch.gulimall:9200

k8s 上部署应用_第69张图片
点击对号,下一步
下一步

外网访问
k8s 上部署应用_第70张图片

创建

2.测试访问

点击服务,查看对外暴露的端口: 31668
在这里插入图片描述

http://192.168.56.100:31668/
k8s 上部署应用_第71张图片

3.进行域名访问?

服务,指定工作负载。与nacos、sentinel一样
创建zipkin-service服务 ,
k8s 上部署应用_第72张图片
访问类型
在这里插入图片描述
端口
在这里插入图片描述
下一步,创建

进入zipkin-service ,查看域名
zipkin-service.gulimall
在这里插入图片描述

4.使用其他服务的终端,测试域名

ok
k8s 上部署应用_第73张图片

七、k8s 部署 sentinel

1.创建 sentinel服务

创建无状态服务

服务,创建,创建无状态服务

sentinel
下一步

添加容器镜像
bladex/sentinel-dashboard:1.6.3
使用默认端口 在这里插入图片描述
点击对号,下一步,下一步

外网访问
k8s 上部署应用_第74张图片
创建

2.结果、测试

进入sentinel服务
集群端口8333,对外暴露端口 31508

访问
http://192.168.56.100:31508/k8s 上部署应用_第75张图片

用户名、密码 为sentinel

k8s 上部署应用_第76张图片

3.sentinel域名访问?

服务,点击 指定工作负载 。与nacos、zipkin一样
k8s 上部署应用_第77张图片
sentinel-service
k8s 上部署应用_第78张图片
访问类型
在这里插入图片描述
端口
k8s 上部署应用_第79张图片
创建

进入sentinel-service服务,查看域名

sentinel-service.gulimall
在这里插入图片描述

八、k8s部署应用的流程

1.知识了解

1).知识了解

k8s 上部署应用_第80张图片

制作项目镜像、打包上传仓库、Dockerfile、编写Deploy文件、部署到k8s集群、k8s的yaml
编写Service文件、暴露到k8s集群、k8s的yaml、
集群内访问测试、外部访问测试

2)、具体怎么操作?

devops自动部署,使用流水线 拉取项目代码
流水线要求:项目里必须有Jenkinsfile文件

自动的把每一个微服务打包成一个docker镜像,上传到dockerhub
k8s自己从dockerhub拉取镜像,拉取镜像后,启动k8s的服务,即service。service是对pod的封装。
拉取镜像后,启动一个容器,容器用pod封装。
假设都是购物车服务,检索、商品订单服务,

订单服务,按它镜像启动一个容器,把这个容器封装成一个pod,订单服务还可以部署到多台机器上。让他有3个副本,让三台机器每台一个。
所有的pod可以封装为一个service。但pod、service也需要部署。

部署两种方式
法一:可视化界面 --------> 创建服务
法二:devops自动化部署

devops自动化部署
编写每一个项目怎么部署。
把可视化配置文件,放到项目中。

把代码拉取后,自动的安装配置文件的指定,把代码部署成一个deployment,即一个部署。把这个部署封装成service,对外通过服务。

然后是,编写deploy文件,部署到k8s集群,k8s的yaml
编写service文件,暴露到k8s集群,k8s的yaml
k8s 上部署应用_第81张图片
第一步:

  • 编写一个资源类型为deployment的文件,它可以为我们生成很多pod,还可以指定副本,给每一个服务器放一个副本。

第二部:

  • 为了外部可以访问,编写一个service文件。把所有pod暴露出来。暴露成某个端口,如31787。
  • 别的微服务,来调用任何一个节点的31787这个端口,就可以调用pod的服务。

编写2个文件,用自动化代码,把这块进行部署。

部署好后,
集群内访问测试、外部访问测试

3)、分三步

1.为每个项目准备一个DockerFile。

  • docker按照DockerFile把项目制作成镜像。

2 .为每个项目生成k8s的部署描述文件

  • 把此项目自动的部署到k8s集群。相对于替换了手动的可视化创建。

3、Jenkins编写好Jenkinsfile

  • 换行

2.生存环境配置抽取

谷粒商城项目,每个项目创建都是以下操作

把每一微服务的配置文件,进行抽取
为项目创建application-pod.properties文件,把application.properties复制粘贴到application-pod.properties

每个端口号都为8080,打包进行后,容器内为8080,向外暴露端口号不同即可

1).修改nacos路径

域名访问
因为nacos是无服务状态。有服务状态不用这样操作。。
怎么获得域名?查看nacos关于域名的设置。创建nacos-service服务,工作负载。使用它的域名。

spring.cloud.nacos.discovery.server-addr=nacos-service.gulimall:8848

2).修改redis路径

redis是有服务状态,直接用域名进行访问
redis.gulimall

spring.redis.host=redis.gulimall

3).修改sentinel路径

sentinel是无状态服务,不能直接用域名进行访问,怎么办?
创建再次创建sentinel-service,工作负载。再使用它的域名进行访问。见sentinel部署。
查看sentinel-service服务,域名为:
sentinel-service.gulimall

spring.cloud.sentinel.transport.dashboard=sentinel-service.gulimall:8333

4).修改zipkin路径

zipkin服务是无状态服务,不能直接用域名进行访问,怎么办?
创建zipkin-service,工作负载。再使用它的域名进行访问。见zipkin部署。

查看zipkin-service服务,域名为:
zipkin-service.gulimall

spring.zipkin.base-url=zipkin-service.gulimall:9411/

5).修改mysql路径

使用mysql-master,mysql-master是有状态服务,它的域名:
mysql-master.gulimall

spring.datasource.url=jdbc:mysql://mysql-master.gulimall:3306/gulimall_oms

mysql密码123456,mysql版本5.7,驱动为com.mysql.jdbc.Driver

6).修改rabbitmq路径

使用rabbitmq,mysql-master是有状态服务,它的域名:
rabbitmq-management.gulimall

spring.rabbitmq.host=rabbitmq-management.gulimall

3. 创建Dockerfile文件

为每个项目,创建Dockerfile文件

FROM java:8
EXPOSE 8080

VOLUME /tmp
ADD target/*.jar  /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=prod"]

4. 创建 微服务k8s部署描述文件

参考devops-sample.yaml

sentinel-service服务的工作负载,点击进入,更多操作,编辑配置文件
复制内容到,项目的yaml中。
所有项目的deploy都有deploy.yaml文件
如gulimall-auth-server-deploy.yaml

name:是项目名称
namespace:是项目的名称空间,都为gulimall
app: 是项目名称,使用app全部改过来。(使用ctrl + r,替换)

前半部分为deployment,后半部分为service

都 修改name,app名称,为项目名称
service修改:

  • nodePort,从2001开始
kind: Deployment
apiVersion: apps/v1
metadata:
  name: gulimall-auth-server
  namespace: gulimall
  labels:
    app: gulimall-auth-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gulimall-auth-server
  template:
    metadata:
      labels:
        app: gulimall-auth-server
    spec:
      containers:
        - name: gulimall-auth-server
          image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME
          ports:
            - containerPort: 8080
              protocol: TCP
          resources:
            limits:
              cpu: 1000m
              memory: 500Mi
            requests:
              cpu: 10m
              memory: 10Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600


---
kind: Service
apiVersion: v1
metadata:
  name: gulimall-auth-server
  namespace: gulimall
  labels:
    app: gulimall-auth-server
spec:
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 20001
  selector:
    app: gulimall-auth-server
  type: NodePort
  sessionAffinity: None

九、创建流水线

Jenkinsfile参考Jenkinsfile-online

1.创建Jenkinsfile文件

在gulimall项目,创建Jenkinsfile文件

2.创建流水线

2.1、创建 空流水线

gulimall-cicd
下一步,创建

2.2 拉取git代码

1).代理

k8s 上部署应用_第82张图片

2).添加步骤

点击左边步骤,修改步骤名称:拉取代码
选择git拉取代码
k8s 上部署应用_第83张图片

3).添加git、创建git凭证

k8s 上部署应用_第84张图片
k8s 上部署应用_第85张图片

k8s 上部署应用_第86张图片

4).运行

k8s 上部署应用_第87张图片
k8s 上部署应用_第88张图片

2.3、参数化构建&环境变量

1).添加版本参数
  parameters {
    string(name:'PROJECT_VERSION',defaultValue: 'v0.0Beta',description:'')
  }

运行
k8s 上部署应用_第89张图片

2).获取参数

编辑流水线
在这里插入图片描述
添加步骤
k8s 上部署应用_第90张图片
点击shell
k8s 上部署应用_第91张图片
echo $PROJECT_VERSION
k8s 上部署应用_第92张图片
确定,保存
k8s 上部署应用_第93张图片
运行
k8s 上部署应用_第94张图片
查看日志
k8s 上部署应用_第95张图片

3).添加项目参数

点击 编辑Jenkinsfile

string(name: ‘PROJECT_NAME’, defaultValue: ‘’, description: ‘’)
k8s 上部署应用_第96张图片
确定

a.编辑配置,添加项目

k8s 上部署应用_第97张图片
添加参数,
选项参数 k8s 上部署应用_第98张图片

PROJECT_NAME

gulimall-auth-server
gulimall-cart
gulimall-coupon
gulimall-gateway
gulimall-member
gulimall-order
gulimall-product
gulimall-search
gulimall-seckill
gulimall-ware
gulinal-third-party
renren-fast
renren-generator

k8s 上部署应用_第99张图片

b.运行

编辑Jenkinsfile,日志打印项目名称

sh ‘echo 正在构建 $PROJECT_NAME 版本号: $PROJECT_VERSION’

k8s 上部署应用_第100张图片

运行
k8s 上部署应用_第101张图片
查看运行日志,结果版本、项目名称 已经输出
k8s 上部署应用_第102张图片

4).环境变量

编辑Jenkinsfile文件

  environment {
    DOCKER_CREDENTIAL_ID = 'dockerhub-id'
    GITEE_CREDENTIAL_ID = 'gitee-id'
    KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    REGISTRY = 'docker.io'
    DOCKERHUB_NAMESPACE = 'lzl123456'
    GITEE_ACCOUNT = 'yummi'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
  }
  
sh 'echo  正在构建 $PROJECT_NAME 版本号: $PROJECT_VERSION  将会提交给 $REGISTRY 镜像仓库'

其中:

  • DOCKER_CREDENTIAL_ID是dockerhub-id凭证
  • GITEE_CREDENTIAL_ID是gitee-id的凭证
  • DOCKERHUB_NAMESPACE是自己的docker账号,查看自己docker账号,我的是 l123456
  • GITEE_ACCOUNT 自己的gitee的用户名
  • SONAR_CREDENTIAL_ID 是sonar-qube凭证

k8s 上部署应用_第103张图片
k8s 上部署应用_第104张图片

运行
k8s 上部署应用_第105张图片
查看结果

k8s 上部署应用_第106张图片

2.4、sonar质量代码分析

代码测试不做了,直接做sonar质量代码分析

1).创建mvn-settings.xml文件

在gulimall下创建mvn-settings.xml文件

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

把它提交到码云仓库,码云地址yummi https://gitee.com/yummi/gulimail.git

2).修改Jenkinsfile配置
    stage('sonar代码质量分析') {
      steps {
        container ('maven') {
          withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
            withSonarQubeEnv('sonar') {
             sh "echo 当前目录 `pwd` "
             sh "mvn sonar:sonar -gs `pwd`/mvn-settings.xml -Dsonar.branch=$BRANCH_NAME -Dsonar.login=$SONAR_TOKEN"
            }
          }
          timeout(time: 1, unit: 'HOURS') {
            waitForQualityGate abortPipeline: true
          }
        }
      }
    }

k8s 上部署应用_第107张图片

3).运行, 失败

k8s 上部署应用_第108张图片

k8s 上部署应用_第109张图片

a.问题

No such property: BRANCH_NAME for class: groovy.lang.Binding
没有BRANCH_NAME分支名称,怎么解决?

b.问题解决

环境变量添加分支名称
BRANCH_NAME=‘master’
k8s 上部署应用_第110张图片

4).运行,再次失败

[ERROR] Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist

码云没有renren-generator 项目
k8s 上部署应用_第111张图片

++ pwd
+ mvn sonar:sonar -gs /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/mvn-settings.xml -Dsonar.branch=master -Dsonar.login=****
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist @ 
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project com.gulimall:gulimall:0.0.1-SNAPSHOT (/home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml) has 1 error
[ERROR]     Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
script returned exit code 1

[ERROR] Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist @

a.码云没有renren-generator 项目
b.把renren-generator 项目提交到码云
5).运行,错误
a.问题

[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar (default-cli) on project gulimall: Please provide compiled classes of your project with sonar.java.binaries property -> [Help 1]
没有sonar.java.binaries property配置
k8s 上部署应用_第112张图片

b.解决

gulimall的pom.xml加入以下配置

    <properties>
        <sonar.jacoco.reportPaths>${PWD}/./target/jacoco.exec</sonar.jacoco.reportPaths>
        <sonar.groovy.binaries>target/classes</sonar.groovy.binaries>
    </properties>

<build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.2</version>
                <configuration>
                    <append>true</append>
                </configuration>
                <executions>
                    <execution>
                        <id>agent-for-ut</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>agent-for-it</id>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>3.6.0.1398</version>
            </plugin>
        </plugins>
    </build>

[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar (default-cli) on project gulimall: Please provide compiled classes of your project with sonar.java.binaries property -> [Help 1]

c.添加编译的配置

点击 编辑Jenkinsfile,添加编译的配置
在这里插入图片描述
container(‘maven’) {
sh ‘mvn clean install -Dmaven.test.skip=true’
}
k8s 上部署应用_第113张图片

6).运行错误

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project common: Compilation failure: Compilation failure:
[ERROR] /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/common/src/main/java/com/atguigu/common/xss/HTMLFilter.java:[76,32] diamond operator is not supported in -source 1.5
[ERROR] (use -source 7 or higher to enable diamond operator)
[ERROR] /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/common/src/main/java/com/atguigu/common/utils/Query.java:[40,33] diamond operator is not supported in -source 1.5

a.原因

不支持1.5的jdk
k8s 上部署应用_第114张图片

b.解决

mv-settings.xml添加jdk配置,配置为jdk1.8

    <profiles>
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles>

编辑Jemkinsfile,使用mvn-settings.xml

        container('maven') {
          sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml'
        }
7).运行,ok

k8s 上部署应用_第115张图片
k8s 上部署应用_第116张图片

a.查看错误

k8s 上部署应用_第117张图片
点击 容易出错,跳转到,使用master的ip,
http://192.168.56.100:30687/project/issues?id=com.gulimall:gulimall:master&resolved=false&types=CODE_SMELL
http://192.168.56.100:30687/project/issues?id=com.gulimall:gulimall:master&resolved=false&types=CODE_SMELL

查看bug、易出错的代码
k8s 上部署应用_第118张图片

十、构建&推送镜像

1.编辑Jenkinsfile

    stage ('构建 & 推送镜像') {
        steps {
            container ('maven') {
                sh 'mvn -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml clean package'
                sh 'cd $PROJECT_NAME  && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
                withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
                    sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
                    sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
                }
            }
        }
    }

1.0.推送镜像 失败

k8s 上部署应用_第119张图片
原因:denied: requested access to the resource is denied
推送镜像第四步失败,也就是推送到dockerhub失败

原因1:网络失败

网络失败,或者master,即master连接失败

原因2: 连接不上dockerhub

修改环境变量,看看dockerhub是否正确。
查看https://hub.docker.com/,获得dockerhub用户名是l123456

修改环境变量的dockerhub就可以

DOCKERHUB_NAMESPACE = 'lzl123456'

1.1.构建&推送镜像 成功

k8s 上部署应用_第120张图片

a.查看推送的镜像

https://hub.docker.com/
k8s 上部署应用_第121张图片

1.2 推送最新镜像

1).编辑Jenkinfile

把APP_NAME全部换成PROJECT_NAME
k8s 上部署应用_第122张图片

sh 'docker tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '
sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '

1.3 部署到k8s集群

把项目部署到k8s集群

k8s 上部署应用_第123张图片

    stage('部署到k8s集群') {
      steps {
        input(id: 'deploy-to-dev-$PROJECT_NAME', message: '是否把 $PROJECT_NAME 部署到集群中 ?')
        kubernetesDeploy(configs: '$PROJECT_NAME/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
      }
    }

1.4、发布版本

k8s 上部署应用_第124张图片

    stage('发布版本'){
      when{
        expression{
          return params.PROJECT_VERSION =~ /v.*/
        }
      }
      steps {
          container ('maven') {
            input(id: 'release-image-with-tag', message: '发布当前版本镜像吗 ?')
              withCredentials([usernamePassword(credentialsId: "$GITEE_CREDENTIAL_ID", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
                sh 'git config --global user.email "[email protected]" '
                sh 'git config --global user.name "litianyu" '
                sh 'git tag -a $PROJECT_VERSION -m "$PROJECT_VERSION" '
                sh 'git push http://$GIT_USERNAME:[email protected]/$GITEE_ACCOUNT/gulimail.git --tags --ipv4'
              }
            sh 'docker tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
            sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
      }
      }
    }

邮箱改为自己的。如 [email protected]
用户名改为自己的。如 litianyu
码云地址改为自己的。如gulimail.git
github.com改为gitee.com
GITHUB_ACCOUNT改为GITEE_ACCOUNT
GITHUB_CREDENTIAL_ID改为GITEE_CREDENTIAL_ID
TAG_NAME 改为PROJECT_VERSION
TAG_NAME改为 PROJECT_NAME

a.修改配置文件
修改所有项目的yaml文件的$APP_NAME:$TAG_NAME  为  $PROJECT_NAME:$PROJECT_VERSION

k8s 上部署应用_第125张图片

1.5、最终Jenkinsfile

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('拉取代码') {
      steps {
        git(credentialsId: 'gitee-id', url: 'https://gitee.com/yummi/gulimail.git', branch: 'master', changelog: true, poll: false)
        sh 'echo  正在构建 $PROJECT_NAME 版本号: $PROJECT_VERSION  将会提交给 $REGISTRY 镜像仓库'
        sh 'echo 正在完整编译项目。。。。。。。。。'
        container('maven') {
          sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml'
        }
      }
    }
    stage('sonar代码质量分析') {
      steps {
        container('maven') {
          withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
            withSonarQubeEnv('sonar') {
              sh 'echo 当前目录 `pwd` '
              sh "mvn sonar:sonar -gs `pwd`/mvn-settings.xml -Dsonar.branch=$BRANCH_NAME -Dsonar.login=$SONAR_TOKEN"
            }

          }

          timeout(time: 1, unit: 'HOURS') {
            waitForQualityGate true
          }

        }

      }
    }
    stage('构建 & 推送镜像') {
      steps {
        container('maven') {
          sh 'mvn -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml clean package'
          sh 'cd $PROJECT_NAME && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
          withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '
            sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '
          }

        }
      }
    }
    
    stage('部署到k8s集群') {
      steps {
        input(id: 'deploy-to-dev-$PROJECT_NAME', message: '是否把 $PROJECT_NAME 部署到集群中 ?')
        kubernetesDeploy(configs: '$PROJECT_NAME/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
      }
    }
    
    stage('发布版本'){
      when{
        expression{
          return params.PROJECT_VERSION =~ /v.*/
        }
      }
      steps {
          container ('maven') {
            input(id: 'release-image-with-tag', message: '发布当前版本镜像吗 ?')
              withCredentials([usernamePassword(credentialsId: "$GITEE_CREDENTIAL_ID", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
                sh 'git config --global user.email "[email protected]" '
                sh 'git config --global user.name "litianyu" '
                sh 'git tag -a $PROJECT_VERSION -m "$PROJECT_VERSION" '
                sh 'git push http://$GIT_USERNAME:[email protected]/$GITEE_ACCOUNT/gulimail.git --tags --ipv4'
              }
            sh 'docker tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
            sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
      }
      }
    }
    
  }
  
  
  environment {
    DOCKER_CREDENTIAL_ID = 'dockerhub-id'
    GITEE_CREDENTIAL_ID = 'gitee-id'
    KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    REGISTRY = 'docker.io'
    DOCKERHUB_NAMESPACE = 'lzl123456'
    GITEE_ACCOUNT = 'yummi'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
    BRANCH_NAME = 'master'
  }
  parameters {
    string(name: 'PROJECT_VERSION', defaultValue: 'v0.0Beta', description: '')
    string(name: 'PROJECT_NAME', defaultValue: '', description: '')
  }
}

1.6、修改每个项目的deploy.yaml文件


renren-generator-deploy.yaml
在这里插入图片描述

2.移植数据库

2.1 创建mysql服务

gulimall项目,服务,创建
k8s 上部署应用_第126张图片
mysql-node-port
下一步

指定工作负载
k8s 上部署应用_第127张图片
k8s 上部署应用_第128张图片
下一步
端口号 32160
在这里插入图片描述

1).Navicat连接数据库

k8s 上部署应用_第129张图片

2).导入数据库
a.创建数据库

k8s 上部署应用_第130张图片

b.导入数据库

k8s 上部署应用_第131张图片
打开指定数据库,运行SQL文件,选择上面文件
k8s 上部署应用_第132张图片

十一、使用Jenkinsfile创建流水线

0.docker 启动节点失败

启动k8s-node1,k8s-node2
启动失败
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

执行命令

systemctl daemon-reload  
systemctl start docker.service

1.创建流水线

devops,流水线,创建

gulimall-jenkinsfile-cicd
谷粒商城自动微服务部署,参数化构建

选择代码仓库
在这里插入图片描述
使用gulimall的Jenkinsfile创建流水线
https://gitee.com/yummi/gulimail.git
k8s 上部署应用_第133张图片
点击对号,下一步
k8s 上部署应用_第134张图片
创建

2.运行

2.1 运行失败

1).失败1,自动填充数据

k8s 上部署应用_第135张图片
原因:没有项目名
解决:使用自动填充参数的方式,运行
k8s 上部署应用_第136张图片
使用自动填充参数的方式,运行
k8s 上部署应用_第137张图片

2).失败2,deploy下的文件无法无法识别

再次执行
k8s 上部署应用_第138张图片
问题:deploy下的文件无法无法识别。项目名无法动态取出来
解决:把参数使用""包括。修改Jekinsfile文件
在这里插入图片描述

3).失败3,找不到端口号

再次执行
k8s 上部署应用_第139张图片
问题:端口号指定在30000-32767之间
解决:修改每个项目的deploy.yaml文件
从31000开始设置。。
k8s 上部署应用_第140张图片

4).失败4,空指针

再次执行
k8s 上部署应用_第141张图片
问题:空指针??
发布到k8s第二步失败,空指针。
可能找不到deploy.yaml文件

解决:不知道。。。
可能找不到deploy.yaml文件,那就手动指定。。虽然笨,但是结果成功就行。。。

构建哪个项目,jenkinsfile修改为哪个项目的deploy.yaml文件

修改Jenkinsfile为指定的文件路径,运行成功。。 k8s 上部署应用_第142张图片

5)、运行成功

运行ok
k8s 上部署应用_第143张图片

2.2、运行成功

k8s 上部署应用_第144张图片

1).查看部署结果

gulimall项目,服务。端口号为31003
k8s 上部署应用_第145张图片
进入它的服务,看到容器正在创建
k8s 上部署应用_第146张图片

进入它的服务,容器组,查看启动日志
k8s 上部署应用_第147张图片

2).问题,创建容器时 内存溢出

创建容器时,OOM,内存不足,自动杀掉容器任务,
k8s 上部署应用_第148张图片

原因:容器内存 不足
每个项目的deploy.yaml文件,限制了内存
在这里插入图片描述

解决:扩大内存Dockerfile文件,
k8s 上部署应用_第149张图片

ENTRYPOINT ["java","-jar","-Xms128m","-Xmx300m","/app.jar","--spring.profiles.active=prod"]

修改完,再次运行,部署网关1.0

2.3、再次运行,成功

k8s 上部署应用_第150张图片

你可能感兴趣的:(谷粒商城,k8s部署,java)