K8s部署篇
kubesphere登录地址:http://192.168.56.100:30880/loginadmin&Admin123456一、k8s部署mysql集群由于电脑空间有限,这里只详细部署mysql集群作为参考docker run -p 3307:3306 --name mysql-master-v /mydata/mysql/master/log:/var/log/mysql-v /m
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 要点
- 每一个mysql/redis 必须都是一个有状态的服务
- 每一个mysql/redis挂在自己配置文件(cm)和pvc
- 以后的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¶m=**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: '17512080612@163.com'
}
}
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 其内部包含了一 条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
- 示例
#基于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
#标明著作人的名称和邮箱
MAINTAINERxxxxxx@qq.com
#测试一下网络环境
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
更多推荐
所有评论(0)