K8s部署篇

kubesphere登录地址:http://192.168.56.100:30880/login
admin&Admin123456

一、k8s部署mysql集群

由于电脑空间有限,这里只详细部署mysql集群作为参考
在这里插入图片描述

docker run -p 3307:3306 --name mysql-master  -v /mydata/mysql/master/log:/var/log/mysql  -v /mydata/mysql/master/data:/var/lib/mysql  -v /mydata/mysql/master/conf:/etc/mysql  -e MYSQL_ROOT_PASSWORD=root  -d mysql:5.7

1.1 第一步:新建mysql密钥root的登录密码

MYSQL_ROOT_PASSWORD 123456
在这里插入图片描述

1.2 第二步:新建mysql的配置

在这里插入图片描述
配置内容:
master中的 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

slaver 中的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

1.3 第三步:新建pvc

在这里插入图片描述

1.4 第四步:创建部署,部署完成后会自动创建service

在这里插入图片描述
两个挂载位置:
一个是挂载数据:/var/lib/mysql
一个是挂载配置文件:/etc/mysql
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
我们随便找一个终端进去就可以平通我们安装的mysql服务
在这里插入图片描述

1.5 配置主从同步

第一步:进入mstart终端 授权一个账号

mysql -uroot -p  # 密码123456
### 1)、授权 root 可以远程访问( 主从无关,为了方便我们远程连接 mysql) 
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; flush privileges; 
### 2)、添加用来同步的用户 
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
## 3、查看 master 状态
show master status\G;
show master status;

第二步:进入slaver终端开启同步

mysql -uroot -p  # 密码123456
### 1)、授权 root 可以远程访问( 主从无关,为了方便我们远程连接 mysql) 
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; flush privileges;
### 2)、设置主库连接master_host='mysql-master-xvtr.gulimall',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3307
### 这些内容都要与主库进行对应master_log_pos=0 这是开始位置可以填0 它会自动同步开始位置
###//关闭线程
STOP SLAVE IO_THREAD; 
### 设置同步信息 如果  ERROR 3021 (HY000)这个错误,需要先关闭io线程,执行完后再开启
change master to master_host='mysql-master-xvtr.gulimall',master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=0,master_port=3306;
### //开启io线程
start SLAVE IO_THREAD;
### 3)、启动从库同步
start slave;
### 4)、查看从库状态
### 主要看:一定要保证这两个状态都是yes才正确
			Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
###	如果这两个数据为次状态表示可以进行同步
show slave status\G;

参数说明:这两个参数是从一下位置拿到的。
master_host=‘mysql-master-xvtr.gulimall’
master_port=3306;
master_log_file=‘mysql-bin.000003’ # 备份文件也要与主库的对应。主库是通过这个命令看到的
show master status;
在这里插入图片描述
在这里插入图片描述

1.6 要点

  1. 每一个mysql/redis 必须都是一个有状态的服务
  2. 每一个mysql/redis挂在自己配置文件(cm)和pvc
  3. 以后的ip都用域名即可搭建出集群

二、k8s部署Redis

第一步:创建配置
redis.conf
appendonly yes
在这里插入图片描述

第二步:创建pvc
第三步:部署容器,这儿需要注意,由于redis的启动比较特殊所以在

docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port}  \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d redis:5.0.7 redis-server /etc/redis/redis.conf; \

在这里插入图片描述
在这里插入图片描述

三、k8s部署ElasticSearch

第一步:新建配置,这次我们可以通过键值对建立不同的参数

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \ -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \ -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -d elasticsearch:7.4.2

在这里插入图片描述
yml 中的配置也可以配置到环境变量中。
在这里插入图片描述
第二步:新建pvc
第三步:部署

安装kibala可视化工具,应为它是个管理软件所以是无状态的服务。

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 \ -d kibana:7.4.2 http://192.168.56.10:9200 一定改为自己虚拟机的地址

elasticsearch 服务的域名(kubesphere内部的):elasticsearch-master-v2vp.gulimall
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
访问:http://192.168.56.10:31449

四、k8s部署RabbitMQ

电脑内存不够:安装不了了。
有状态服务

docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='atguigu' rabbitmq:management

五、k8s部署Nacos

有状态服务

docker run --env MODE=standalone --name nacos \ -v /mydata/nacos/conf:/home/nacos/conf -v /mydata/nacos/data:/home/nacos/data-d -p 8848:8848 nacos/nacos-server:1.1.4

在这里插入图片描述
在这里插入图片描述

六、k8s部署Zipkin

他的数据是保存到elasticsearch 的,所以它本身时无状态的。

docker run -d -p 9411:9411 openzipkin/zipkin 
或者
docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200

ES_HOSTS 后面的信息应该配置为我们已经安装了elasticsearch的dns地址加端口
ES_HOSTS=192.168.56.10:9200

七、k8s部署Sentinel

可以制作一个镜像并启动它,暴露访问 
docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard:1.6.3

八、★ k8s部署应用的流程

如何把我们自己的微服务部署到k8s上
在这里插入图片描述

8.1 生产环境配置文件的抽取

第一步:复制一份配置用文件用于生产环境,启动时加上参数:spring.profiles.active=prod 去激活配置,默认是不激活的。
application-prod.properties
在这里插入图片描述
第二步:修改application-prod.properties 文件,通过域名(好处是能够实现负载均衡)来访问其他服务,如nacos:详见8.4

最佳配置:线上和本地分别设置2个文件application.properties 和 bootstrap.properties
在这里插入图片描述
第三步:把微服务中所有的线上配置的端口号改成:8080
由于我们部署到kubesphere以后,每个微服务都放在pod的container容器中,每个容器相当于一个单独的linux系统,所以每个容器都会有独立的端口,相当于在docker内部每个微服务的端口都是一样的。只要我们在服务中暴露的端口不一样就可以了。

server.port=8080
spring.application.name=renren-fast
spring.cloud.nacos.discovery.server-addr=nacos-service.gulimall:8848
spring.cloud.nacos.config.server-addr=nacos-service.gulimall:8848
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.namespace=f111d0df-ec91-44ed-b37d-caa81610c2a2

最终的效果如下:
在这里插入图片描述

8.2 把项目打包制作成镜像,并上传到仓库

仓库有两种:
1.直接上传到dockerhub,让dockerhub作为仓库
2.kubernetes中搭建私有仓库
3.最佳方案:使用阿里云的镜像仓库,详情看 九

打包docker镜像,并上传

## 将项目生成docker镜像,名称为docker.io/leifengyang/cart:v1.0 
## 这一步会把我们的项目打包成docker镜像并保存到本地临时镜像中,就是docker images 看到的内容
## .  表示跟Dockerfile 同目录下的资源的打包
docker build -f Dockerfile -t  docker.io/maruis/admin:v1.0 . 
## 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"]
	
## 登录dockerhub.  
docker login -u 用户名 -p 密码
## 上传镜像
docker push docker.io/maruis/admin:v1.0

参数说明:
-f 文件;-t tag 后面更的时镜像的名字和版本
在这里插入图片描述

把 .jar 文件和 Dockerfile 文件拷贝到linux服务器中。
拷贝完车呢个后执行上面的命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

每个微服务都需要准备3个文件:
1、为每一个项目准备一个Dockerfile; Docker按照这个Dockerfile将项目制作成镜像
在项目根目录生成一个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"]

在这里插入图片描述
在这里插入图片描述

2、为每一个项目生成k8s的部署描述文件
两个yaml文件里面有
apiVersion: apps/v1 kind: Deployment
apiVersion: v1 kind: Service

apiVersion: apps/v1                   # api版本声明:1、extensions/v1beta1 是用于kubernetes版本在1.6之前 2、apps/v1beta1 是用于1.6-1.9版本之间 3、apps/v1 是1.9版本以后使用。目前使用的Kubernetes版本: v1.17.4。
kind: Deployment                      # 指定创建资源的类型
metadata:                             # 资源的元数据/属性
  name: nginx-deployment              # 资源名称,在同一个namespace中唯一
  namespace: liuli-space              # 指定namespace
spec:                                 # 资源规格定义
  revisionHistoryLimit: 10            # 保存最近的10个历史版本
  replicas: 2                         # 指定pod副本数量
  strategy:                           # 滚动升级策略
    type: RollingUpdate               # 滚动更新。策略:重建(recreate):停止旧版本部署新版本;滚动更新(rolling-update):一个接一个地以滚动更新方式发布新版本;蓝绿(blue/green):新版本与旧版本一起存在,然后切换流量;金丝雀(canary):将新版本面向一部分用户发布,然后继续全量发布
    rollingUpdate:
      maxSurge: 1                     # 一次可以添加多少个Pod
      maxUnavailable: 0               # 滚动更新期间最大多少个Pod不可用
  selector:                           # 定义标签选择器
    matchLabels:                      # 标签匹配
      app: nginx-server               # 这里选择需要管理的pod的标签名
  template:                           # pod模版定义
    metadata:                         # 资源的元数据/属性
      labels:                         # 定义pod标签
        app: nginx-server             # pod标签名(自定义)
    spec:                             # 指定该资源的内容
      restartPolicy: Always           # 容器重启策略。只要退出就重启(Always),失败退出(exit code不等于0)时重启(OnFailure),只要退出就不再重启(Never)
      imagePullSecrets:               # 私有仓库镜像密钥
      - name: liuli-secret            # 密钥名称
      containers:                     # 定义一个容器
      - name: nginx-container         # 容器名称
        image: 192.168.1.40/liuli/nginx:v1.18    # 镜像名称
        imagePullPolicy: IfNotPresent # 镜像拉取策略。 不管镜像是否存在都会进行一次拉取。(Always),只有镜像不存在时,才会进行镜像拉取。(IfNotPresent),只使用本地镜像,从不拉取(Never)
        ports:                        # 端口定义
        - name: nginx-port            # 端口名称
          containerPort: 80           # 容器对外暴露的端口
          protocol: TCP               # 端口通讯协议
        resources:                    # 容器资源管理
          requests:                   # 容器的请求资源
            memory: "2Gi"             # 请求内存资源:2G
            cpu: "1"                  # 请求CPU资源:1v
          limits:                     # 容器的限制资源
            memory: "4Gi"             # 容器的限制内存:4G
            cpu: "2"                  # 容器的限制CPU:2v
        volumeMounts:				  # 挂载数据卷
        - name: config-volume         # 挂载的数据卷名称
          mountPath: /config          # 挂载到的目录
        startupProbe:                 # 启动探针,根据规则检测容器内程序启动情况,启动探针结束后,其他探针才会开始工作。
          httpGet:                    # HTTP探测。向指定路径发送http请求,返回值为200-400之间则为测试通过。
            path: /index.html         # HTTP的探测路径。
            port: 80                  # HTTP请求的端口。
          initialDelaySeconds: 5      # 在执行第一次探测前应该等待5秒。
          failureThreshold: 10        # 最少连续探测失败多少次才被认定为失败,即重试探测次数。默认是3。最小值是1。
          periodSeconds: 5            # 探测失败后,进行下一次探测等待的时间。
        readinessProbe:               # 就绪探针。用于判断容器是否启动完成(ready状态)
          httpGet:                    # HTTP探测。向指定路径发送http请求,返回值为200-400之间则为测试通过。
            path: /index.html         # HTTP的探测路径。
            port: 80                  # HTTP请求的端口。
          failureThreshold: 3         # 最少连续探测失败多少次才被认定为失败,即重试探测次数。默认是3。最小值是1。
          periodSeconds: 5            # 探测失败后,进行下一次探测等待的时间。
        livenessProbe:                # 存活探针。用于判断容器是否存活(running状态),则kubelet杀掉该容器,并根据容器的重启策略做相应的处理。
          httpGet:                    # HTTP探测。向指定路径发送http请求,返回值为200-400之间则为测试通过。
            path: /index.html         # HTTP的探测路径。
            port: 80                  # HTTP请求的端口。
          failureThreshold: 1         # 最少连续探测失败多少次才被认定为失败,即重试探测次数。默认是3。最小值是1。
          periodSeconds: 10           # 探测失败后,进行下一次探测等待的时间。
        lifecycle:                    # Pod 生命周期控制,有postStart、PreStop两个函数
          preStop:                    # 在容器被终止前执行的任务
            exec:                     # 在容器内执行命令
              command: ["/bin/bash", "-c", "sleep 40"] # 沉睡40秒命令
      volumes:						  # 创建数据卷
      - name: config-volume           # 数据卷名称
        configMap:                    # 从confimap读取数据
          name: nginx-configmap       # configmap名称
          items:                      # 项目
          - key: nginx-conf           # configmap中的键
            path: nginx.conf          # 挂载到指定路径
---
apiVersion: v1                        # api版本声明
kind: Service                         # 指定创建资源的类型
metadata:                             # 资源的元数据/属性
  name: nginx-service                 # service名称
  namespace: liuli-space              # service的命名空间
  labels:                             # 定义标签
    name: nginx-service               # service的标签名称
spec:                                 # 资源规格定义
  type: NodePort                      # 类型是NodePort。Service有四种type: ClusterIP(默认)、NodePort、LoadBalancer、ExternalName. 其中NodePort和LoadBalancer两类型的Services可以对外提供服务。
  selector:                           # 定义标签选择器
    app: nginx-server                 # 这里选择需要管理的pod的标签名
  ports:                              # 端口定义
    - protocol: TCP                   # 端口通讯协议
      port: 8081                      # 集群内部通讯端口(自定义)
      targetPort: 80                  # 容器对外暴露的端口,即containerPort
      nodePort: 32334                 # 所有的节点都会开放此端口,此端口供外部调用
---
apiVersion: extensions/v1beta1        # api版本声明
kind: Ingress                         # 指定创建资源的类型
metadata:                             # 资源的元数据/属性
  name: nginx-ingress                 # ingress名称
  namespace: liuli-space              # ingress的命名空间
spec:                                 # 资源规格定义
  rules:                              # 路由规则
  - host: liuli.com                   # 域名,填写IP无效
    http:                             # 类型,目前只支持http/tls
      paths:                          # 路由路径
      - backend:                      # 代理的后端配置
          serviceName: nginx-service  # Service的名称
          servicePort: 8081           # Service的端口,非nodePort端口

3、Jenkins编写好Jenkinsfile
通过流水线把前面的两个文件串起来,构建流水线流程。

//写流水线的脚本(声明式、脚本式)
pipeline{
    
    
    //全部的CICD流程都需要在这里定义

    //任何一个代理可用就可以执行
   // agent none  //以后所有stage都必须指定自己的
    agent any




    //定义一些环境信息
    environment {
    
    
      hello = "123456"
      world = "456789"
      WS = "${WORKSPACE}"
      IMAGE_VERSION = "v1.0"

//引用Jenkins配置的全局秘钥信息
      ALIYUN_SECRTE=credentials("aliyun-docker-repo")
    }

    //定义流水线的加工流程
    stages {
    
    
        //流水线的所有阶段
        stage('环境检查'){
    
    
            steps {
    
    
               sh 'printenv'
               echo "正在检测基本信息"
               sh 'java -version'
               sh 'git --version'
               sh 'docker version'
               sh 'pwd && ls -alh'
               sh "echo $hello"
               //未来,凡是需要取变量值的时候,都用双引号
               sh 'echo ${world}'
            }
        }
        //1、编译 "abc"
        stage('maven编译'){
    
    
            //jenkins不配置任何环境的情况下, 仅适用docker 兼容所有场景
            agent {
    
    
                docker {
    
    
                    image 'maven:3-alpine'
                    args '-v /var/jenkins_home/appconfig/maven/.m2:/root/.m2'
//                     args  '-v /a/settings.xml:/app/settings.xml'
                    //docker run -v /a/settings.xml:/app/settings.xml
                 }
            }
            steps {
    
    
               //git下载来的代码目录下
               sh 'pwd && ls -alh'
               sh 'mvn -v'
               //打包,jar.。默认是从maven中央仓库下载。 jenkins目录+容器目录;-s指定容器内位置
               //只要jenkins迁移,不会对我们产生任何影响
               sh "echo 默认的工作目录:${WS}"
//                sh 'cd ${WS}'
               //workdir
               //每一行指令都是基于当前环境信息。和上下指令无关
               sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml"  -Dmaven.test.skip=true '
               //jar包推送给maven repo ,nexus
               //如何让他适用阿里云镜像源

            }
        }

        //2、测试,每一个 stage的开始,都会重置到默认的WORKSPACE位置
        stage('测试'){
    
    
            steps {
    
    
                sh 'pwd && ls -alh'
                echo "测试..."
            }
        }

        //3、打包
        stage('生成镜像'){
    
    
            steps {
    
    
                echo "打包..."
                //检查Jenkins的docker命令是否能运行
                sh 'docker version'
                sh 'pwd && ls -alh'
                sh 'docker build -t java-devops-demo .'

                //镜像就可以进行保存


            }
        }



         stage('推送镜像'){
    
    
         //没有起容器代理,默认就是jenkins环境
             //step里面卡点这么写
//              input message: '需要推送远程镜像吗?', ok: '需要', parameters: [text(defaultValue: 'v1.0', description: '生产环境需要部署的版本', name: 'APP_VER')]

             //step外面这么写
             input {
    
    
                 message "需要推送远程镜像吗?"
                 ok "需要"
                 parameters {
    
    
                     string(name: 'APP_VER', defaultValue: 'v1.0', description: '生产环境需要部署的版本')
                     choice choices: ['bj-01', 'sh-02', 'wuhan-01'], description: '部署的大区', name: 'DEPLOY_WHERE'
                 }
             }


             steps {
    
    
                //false就直接结束

                echo "$APP_VER"


                //脚本方式进行判断,和具体逻辑
                // 远程触发,自动分析是哪个分支,如果是master就部署生产,dev就集成测试等
                // gulimall
                //    mall-order
                //    mall-user
                //    xx 100个微服务
                //  哪一个微服务代码提交了部署哪一个微服务,不用手工干预,只需要一个jenkinsfile
                //Generic Webhook Trigger 远程触发jenkins,jenkins获取当前提交的分支,和所有分支
                // gitee会告诉我们这次 add了哪些,modify了哪些,delete了哪些,
                // add了哪些,modify了哪些,delete了哪些, 自己判断这些修改的文件在哪个模块下
                //对这个模块进行持续集成

                //Generic Webhook Trigger + script脚本 + 其他已讲过的内容 + 其他自己看看官网 = 搞定
                //别人提交一个issue,jenkins触发 自动把issue做成 fix分支,让程序员自己去修改
                //所有东西都是模板
                script {
    
    
                   //groovy
                   def  where = "${DEPLOY_WHERE}"

                   if (where == "bj-01"){
    
    
                    sh "echo 我帮你部署到 bj-01 区了"
                   }else if(where == "sh-02"){
    
    
                   sh "echo 我帮你部署到 sh-02 区了"
                   }else{
    
    
                        sh "echo 没人要的,我帮你部署到 wuhan-01 区了"
//                    sh "docker push registry.cn-hangzhou.aliyuncs.com/lfy/java-devops-demo:${APP_VER}"
                        withCredentials([usernamePassword(credentialsId: 'aliyun-docker-repo', passwordVariable: 'ali_pwd', usernameVariable: 'ali_user')]) {
    
    
                            // some block
                             sh "docker login -u ${ali_user} -p ${ali_pwd}   registry.cn-hangzhou.aliyuncs.com"
//                              sh "docker tag java-devops-demo registry.cn-hangzhou.aliyuncs.com/lfy/java-devops-demo:${APP_VER}"
                        }
                   }
                }

//                 sh "docker push registry.cn-hangzhou.aliyuncs.com/lfy/java-devops-demo:${APP_VER}"

             }
         }

        //4、部署
        stage('部署'){
    
    
            steps {
    
    
                echo "部署..."
                sh 'docker rm -f java-devops-demo-dev'
                sh 'docker run -d -p 8888:8080 --name java-devops-demo-dev java-devops-demo'
            }

            //后置执行
//             post {
    
    
//               failure {
    
    
//                 // One or more steps need to be included within each condition's block.
//                 echo "炸了.. ."
//               }
//
//               success {
//                 echo "成了..."
//               }
//             }
        }

        //5、推送报告
        stage("发送报告"){
            steps {
                //短信通知,购买api接口即可
//                 sh 'curl -i -k -X POST 'https://gyytz.market.alicloudapi.com/sms/smsSend?mobile=mobile&param=**code**%3A12345%2C**minute**%3A5&smsSignId=2e65b1bb3d054466b82f0c9d125465e2&templateId=908e94ccf08b4476ba6c876d13f084ad'  -H 'Authorization:APPCODE dddddddd''
                //REST API 所有都行
//                 sh 'curl '
                echo '准备发送报告'
                emailext body: '''<!DOCTYPE html>
                <html>
                <head>
                <meta charset="UTF-8">
                <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
                </head>

                <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
                    offset="0">
                    <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
                <h3>本邮件由系统自动发出,请勿回复!</h3>
                        <tr>
                           <br/>
                            各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br>
                            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>
                        </tr>
                        <tr>
                            <td><br />
                            <b><font color="#0B610B">构建信息</font></b>
                            <hr size="2" width="100%" align="center" /></td>
                        </tr>
                        <tr>
                            <td>
                                <ul>
                                    <li>项目名称 : ${PROJECT_NAME}</li>
                                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>
                                    <li>触发原因: ${CAUSE}</li>
                                    <li>构建状态: ${BUILD_STATUS}</li>
                                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
                                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                                </ul>


                <h4><font color="#0B610B">最近提交</font></h4>
                <ul>
                <hr size="2" width="100%" />
                ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
                </ul>
                详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>

                            </td>
                        </tr>
                    </table>
                </body>
                </html>''', subject: '${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志', to: '[email protected]'
            }
        }

        stage('部署到生产环境吗?'){
    
    
            steps {
    
    
                // 手动输入版本【参数化构建】,推荐生成器

//                 input {
    
    
//                     message "需要部署到生产环境吗?"
//                     ok "是的,赶紧部署"
// //                     submitter "alice,bob"
//                     parameters {
    
    
//                         //手动传入的参数
//                         string(name: 'APP_VERSION', defaultValue: 'v1.0', description: '请指定生产版本号')
//                     }
//                 }
                sh "echo 发布版本咯......"
                // 版本的保存。代码的保存。镜像的保存。存到远程仓库

            }
        }

    }



//后置处理过程
        post {
    
    
          failure {
    
    
            echo "这个阶段 完蛋了.... $currentBuild.result"
          }
          success {
    
    
            echo "这个阶段 成了.... $currentBuild.result"
          }
        }


}

8.3 自动化部署DevOps,CICD

1)部署pod
2)对外暴露端口service

8.4 把配置文件中的ip地址改为,k8s内部域名访问,举例:nacos

首先,需要在kubesphere中队nacos暴露集群内部访问的service
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还可以再生成一个service,用于外网访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试发现:
ping nacos-7iqo.gulimall 部署时自动生成
ping nacos-service.gulimall 自定义的内部访问地址
ping nacos-service-out.gulimall 这个ping不同
前两个可以ping通,所以我们的微服务中的地址就应该写,前两个哪个都行。

所以:application-prod.properties 内容

spring.application.name=gulimall-product
spring.cloud.nacos.discovery.server-addr=nacos-service.gulimall:8848
spring.cloud.nacos.config.server-addr=nacos-service.gulimall:8848
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.namespace=a94e749a-2bbe-4595-95cf-250440bb5813

在这里插入图片描述

九、docker深入

9.1 Dockerfile

在这里插入图片描述
在 Docker 中创建镜像最常用的方式,就是使用 Dockerfile。Dockerfile 是一个 Docker 镜像 的描述文件,我们可以理解成火箭发射的 A、B、C、D…的步骤。Dockerfile 其内部包含了一 条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

  1. 示例
#基于centos镜像
FROMcentos
#维护人的信息
MAINTAINERMyCentOS<534096094@qq.com>
#安装httpd软件包
RUNyum-yupdate
RUNyum-yinstallhttpd #开启80端口
EXPOSE80
#复制网站首页文件至镜像中web站点下
ADDindex.html/var/www/html/index.html
#复制该脚本至镜像中,并修改其权限
ADDrun.sh/run.sh
RUNchmod775/run.sh
#当启动容器时执行的脚本文件
CMD["/run.sh"]

在这里插入图片描述
官方文档:https://docs.docker.com/engine/reference/builder/#from
复杂一点的示例

#在centos上安装nginx
FROMcentos
#标明著作人的名称和邮箱
[email protected]
#测试一下网络环境
RUNping-c1www.baidu.com
#安装nginx必要的一些软件
RUNyum-yinstallgccmakepcre-develzlib-develtarzlib
#把nginx安装包复制到/usr/src/目录下,如果是压缩包还会自动解压,是网络路径会自动下载
ADDnginx-1.15.8.tar.gz/usr/src/
#切换到/usr/src/nginx-1.15.8编译并且安装nginx
RUNcd/usr/src/nginx-1.15.8\
	&&mkdir/usr/local/nginx\
	&&./configure--prefix=/usr/local/nginx&&make&&makeinstall\
	&&ln-s/usr/local/nginx/sbin/nginx/usr/local/sbin/\
	&&nginx
#删除安装nginx安装目录
RUNrm-rf/usr/src/nginx-nginx-1.15.8
#对外暴露80端口
EXPOSE80
#启动nginx
CMD["nginx","-g","daemonoff;"]

2.、常用指令
在这里插入图片描述

9.2 镜像操作

1、创建项目 dockerfile
2、上传项目到服务器。
3、进入项目,构建镜像到本地仓库;
(1) docker build -t nginx:GA-1.0 -f ./Dockerfile . 别忘了最后的小数点。
(2) docker images 查看镜像
(3) docker exec -it 容器 id /bin/bash;进入容器,修改容器
## 这种方式无法把挂载的内容打包成镜像,只会打包原有的东西。如果想把挂载文件也上传p399 需要编写dockerfile去打包。
(4) docker commit -a “leifengyang” -m “nginxxx” 容器 id mynginx:GA-2.0 1 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 2
OPTIONS 说明:
1) -a :提交的镜像作者;
2) -c :使用 Dockerfile 指令来创建镜像;
3) -m :提交时的说明文字;
4) -p :在 commit 时,将容器暂停。
(5) docker login : 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官 方仓库 Docker Hub 1 docker login -u 用户名 -p 密码
(6) docker logout : 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官 方仓库 Docker Hub
4、推送镜像到 docker hub
(1) 标记镜像,docker tag local-image:tagname username/new-repo:tagname
(2) 上传镜像,docker push username/new-repo:tagname
5、保存镜像,加载镜像
(1) 可以保存镜像为 tar,使用 u 盘等设备复制到任意 docker 主机,再次加载镜像
(2) 保存:docker save spring-boot-docker -o /home/spring-boot-docker.tar
(3) 加载:docker load -i spring-boot-docker.tar

6、阿里云操作
(1) 登录阿里云,密码就是开通镜像仓库时 的密码 每一个微服务都有一个镜像仓
docker login --username=qwertyuiopasdf_aa registry.cn-hangzhou.aliyuncs.com
(2) 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/atguigumall/gulimall-nginx:v1.0
(3)推送镜像
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/atguigumall/gulimall-nginx:v1 docker push registry.cn-hangzhou.aliyuncs.com/atguigumall/gulimall-nginx:v1

猜你喜欢

转载自blog.csdn.net/fen_dou_shao_nian/article/details/119695887