Kubernetes持续部署方案

文章目录

GitLab

  • GitLab上创建三个测试项目用于构建,代码自行上传
    在这里插入图片描述
  • 生成api token,保存该token在这里插入图片描述
    在这里插入图片描述

Jenkins

  • 登陆harbor
[root@harbor internet-hospital]# docker login 192.168.1.40
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  • maven
    下载地址:https://maven.apache.org/download.cgi,下载后上传到服务器/opt目录,解压、改名为maven3.6
    在这里插入图片描述
    在Jenkins上配置
    在这里插入图片描述
    在这里插入图片描述

  • git

yum install -y git
# 查看版本
[root@harbor opt]# git --version
git version 1.8.3.1

Jenkins上配置
在这里插入图片描述
在这里插入图片描述

  • nodejs
wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz \
&& tar -xvf node-v10.16.3-linux-x64.tar.xz \
&& mv node-v10.16.3-linux-x64 node \
&& ln -s /opt/node/bin/npm /usr/bin/npm \
&& ln -s /opt/node/bin/node /usr/bin/node \
# 查看版本
[root@harbor ~]# node -v
v10.16.3
[root@harbor ~]# npm -v
6.9.0

Java构建脚本

#!/bin/bash
# 脚本功能:通过Jenkins在k8s集群部署Java服务
# 准备工作:Jenkins所在主机的kubectl已配置好k8s链接


# jar包路径
app_dir="./cn-scaffold-cs/target"
# jar包名称
app_name="cn-scaffold-cs-0.0.1.jar"
# 服务暴露端口
config_port="31009"

################################## 切换环境时改动 ##################################

# 项目名代号,归档配置文件用
project="scaffold"
# 部署环境(dev/test/prd)
env="dev"
# 配置文件类型(java/node/vue)
config_type="java"
# harbor的IP
harbor_ip="192.168.1.40"
# harbor的镜像仓库名称,需提前在harbor创建好
harbor_pro="yd"
# k8s上该项目的namespace,需提前在k8s创建好
namespace="dev-yd"
# harbor密钥名称,需提前在k8s创建好
secret="yd-secret"
# POD副本数
replicas="1"

################################## 以下内容不需改动 ################################## 

# 配置文件路径
conf_dir="/opt/config/${config_type}/${env}/${project}/${JOB_NAME}"
config_dir="${conf_dir}/config"
dockerfile_dir="${conf_dir}/dockerfile"
deployment_dir="${conf_dir}/deployment"
# Docker
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:v${BUILD_ID}"
# 配置文件名称
config_name="bootstrap_${JOB_NAME}_v${BUILD_ID}.yml"
dockerfile_name="dockerfile_${JOB_NAME}_v${BUILD_ID}"
deployment_name="deployment_${JOB_NAME}_v${BUILD_ID}.yaml"
# 检查目录函数
function dir_check()
{
if [ ! -d "$1" ];then mkdir -p $1; fi
}
################################## 生成config ################################## 
dir_check ${config_dir}
cat >${config_dir}/${config_name}<<EOF
spring:
  application:
    name: cn-scaffold-cs
server:
  port: 31009
eureka:
  client:
    serviceUrl:
      defaultZone: http://root:root@192.168.1.11:31008/eureka
  instance:
    instance-id: \${spring.cloud.client.ipAddress}:\${server.port}:\${spring.application.name}
    prefer-ip-address: true
    statusPageUrlPath: /doc.html
management:
  security:
    enabled: false
swagger:
  basePackage: com.cn
  contact: mcz
  description: 脚手组件架工程
  title: 脚手架组件
project:
  versionUrl: v1
security:
  basic:
    enabled: false
cn:
  enableGlobalException:  false
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  datasource:
    mapperLocations: classpath:com/cn/*/mapper/*.xml
    typeAliasPackage: com.cn.beans.*.entity.*
mysqldb:
  datasource:
    connection-init-sqls: set names utf8mb4;
    driverClassName: com.mysql.jdbc.Driver
    filters: stat
    initialSize: 10
    maxActive: 100
    maxIdle: 30
    maxOpenPreparedStatements: 20
    maxWait: 10000
    minEvictableIdleTimeMillis: 300000
    minIdle: 1
    password: 6yhn^YHN
    poolPreparedStatements: true
    testOnBorrow: false
    testOnReturn: false
    testWhileIdle: true
    timeBetweenEvictionRunsMillis: 10000
    url: jdbc:mysql://192.168.1.26:3306/scaffold-cs?dontTrackOpenResources=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
    username: root
    validationQuery: select 'x'
EOF
################################## 生成dockerfile ################################## 
dir_check ${dockerfile_dir}
cat >${dockerfile_dir}/${dockerfile_name}<<EOF
FROM openjdk:8u252-slim-buster
EXPOSE ${config_port}
WORKDIR /my-java
ADD . /my-java
CMD ["java","-Xms2048m","-Xmx4096m","-XX:PermSize=256m","-XX:MaxPermSize=512m","-XX:MaxNewSize=512m","-Dfile.encoding=UTF8","-Duser.timezone=GMT+08","-jar","${app_name}"]
EOF
################################## 生成deployment ################################## 
dir_check ${deployment_dir}
cat >${deployment_dir}/${deployment_name}<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ${JOB_NAME}
  namespace: ${namespace}
spec:
  replicas: ${replicas}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: ${JOB_NAME}-pod
  template:
    metadata:
      labels:
        app: ${JOB_NAME}-pod
    spec:
      restartPolicy: Always
      imagePullSecrets:
      - name: ${secret}
      containers:
      - name: ${JOB_NAME}-con
        image: ${harbor_ip}/${harbor_pro}/${docker_images}
        imagePullPolicy: Always
        ports:
        - name:
          containerPort: ${config_port}
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: ${JOB_NAME}-svc
  namespace: ${namespace}
  labels:
    name: ${JOB_NAME}-svc
spec:
  type: NodePort
  selector:
    app: ${JOB_NAME}-pod
  ports:
    - protocol: TCP
      port: ${config_port}
      targetPort: ${config_port}
      nodePort: ${config_port}
EOF

################################## 构建镜像 ################################## 
dir_check ${docker_space}
cp ${config_dir}/${config_name} ${docker_space}/bootstrap.yml
cp ${app_dir}/${app_name} ${docker_space}
cd ${docker_space};docker build -f ${dockerfile_dir}/${dockerfile_name} -t ${harbor_ip}/${harbor_pro}/${docker_images} .
docker push ${harbor_ip}/${harbor_pro}/${docker_images}
docker rmi ${harbor_ip}/${harbor_pro}/${docker_images}
rm -rf ${docker_space}/*

################################## 部署deployment ################################## 
kubectl apply -f ${deployment_dir}/${deployment_name} --record
kubectl rollout status deployment/${JOB_NAME} -n ${namespace}

Node脚本

#!/bin/bash
# 脚本功能:通过Jenkins在k8s集群部署Node服务
# 准备工作:Jenkins所在主机的kubectl已配置好k8s链接
# 自己制作的镜像:192.168.1.40/xzzyy/node:hospital_room


# 服务暴露端口
config_port="30180"

################################## 切换环境时改动 ##################################

# 项目名代号,归档配置文件用
project="internet-hospital"
# 部署环境(dev/test/prd)
env="dev"
# 配置文件类型(java/node/vue)
config_type="node"
# harbor的IP
harbor_ip="192.168.1.40"
# harbor的镜像仓库名称,需提前在harbor创建好
harbor_pro="xzzyy"
# k8s上该项目的namespace,需提前在k8s创建好
namespace="demo-space"
# harbor密钥名称,需提前在k8s创建好
secret="demo-secret"

################################## 以下内容不需改动 ################################## 

# 配置文件路径
conf_dir="/opt/config/${config_type}/${env}/${project}/${JOB_NAME}"
config_dir="${conf_dir}/config"
dockerfile_dir="${conf_dir}/dockerfile"
deployment_dir="${conf_dir}/deployment"
# Docker
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:v${BUILD_ID}"
# 配置文件名称
config_name="config_${JOB_NAME}_v${BUILD_ID}.js"
dockerfile_name="dockerfile_${JOB_NAME}_v${BUILD_ID}"
deployment_name="deployment_${JOB_NAME}_v${BUILD_ID}.yaml"
# 检查目录函数
function dir_check()
{
if [ ! -d "$1" ];then mkdir -p $1; fi
}
################################## 生成config ##################################
dir_check ${config_dir}
cat >${config_dir}/${config_name}<<EOF
const dbConfig = {
    connectionLimit: 5,
    host: "192.168.1.26",
    user: "root",
    port: "3306",
    password: "6yhn^YHN",
    database: "demo-x",
    timezone: "08:00"
};
// redis配置文件
const redisConfig = {
    port: 26379,
    host: "192.168.1.26"
};
// 微信配置文件
const wxConfig = {
    appid: "wxef50c70a177d514a", // 公众号id
    mchid: "1568794661", // 微信商户号
    partnerKey: "123123" //微信支付安全密钥
};

// kafka配置
const kafkaConfig = "192.168.1.26:9092";

// 公共平台地址
const  livingRoomConfig = {
    url: "http://192.168.1.26:31174"
};

// 消息中心地址
const massageConfig = {
    url: "http://192.168.1.26:31177"
};
const publicTopicObj = {};
exports.dbConfig = dbConfig;
exports.redisConfig = redisConfig;
exports.wxConfig = wxConfig;
exports.livingRoomConfig = livingRoomConfig;
exports.massageConfig = massageConfig;
exports.publicTopicObj = publicTopicObj;
exports.kafkaConfig = kafkaConfig;
EOF
################################## 生成dockerfile ################################## 
dir_check ${dockerfile_dir}
cat >${dockerfile_dir}/${dockerfile_name}<<EOF
FROM 192.168.1.40/xzzyy/node:hospital_room
EXPOSE 30180
WORKDIR /my-node
ADD node.tar.gz /my-node
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
CMD ["npm","start"]
EOF
################################## 生成deployment ################################## 
dir_check ${deployment_dir}
cat >${deployment_dir}/${deployment_name}<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ${JOB_NAME}-deployment
  namespace: ${namespace}
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: ${JOB_NAME}-pod
  template:
    metadata:
      labels:
        app: ${JOB_NAME}-pod
    spec:
      restartPolicy: Always
      imagePullSecrets:
      - name: ${secret}
      containers:
      - name: ${JOB_NAME}-con
        image: ${harbor_ip}/${harbor_pro}/${docker_images}
        ports:
        - name: ${JOB_NAME}-port
          containerPort: ${config_port}
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: ${JOB_NAME}-service
  namespace: ${namespace}
  labels:
    name: ${JOB_NAME}-service
spec:
  type: NodePort
  selector:
    app: ${JOB_NAME}-pod
  ports:
    - protocol: TCP
      port: ${config_port}
      targetPort: ${config_port}
      nodePort: ${config_port}
EOF
################################## 项目编译 ################################## 
rm -rf node.tar.gz
\cp ${config_dir}/${config_name} ./config/config.js
npm install
tar -zcf node.tar.gz *

################################## 构建镜像 ################################## 
dir_check ${docker_space}
cp ./node.tar.gz ${docker_space}
cd ${docker_space};docker build -f ${dockerfile_dir}/${dockerfile_name} -t ${harbor_ip}/${harbor_pro}/${docker_images} .
docker push ${harbor_ip}/${harbor_pro}/${docker_images}
docker rmi ${harbor_ip}/${harbor_pro}/${docker_images}
rm -rf ${docker_space}/*

################################## 部署deployment ################################## 
kubectl apply -f ${deployment_dir}/${deployment_name}

tomcat

#!/bin/bash
# 脚本功能:通过Jenkins在k8s集群部署Vue服务
# 准备工作:Jenkins所在主机的kubectl已配置好k8s链接


# 服务暴露端口
config_port="31010"

################################## 切换环境时改动 ##################################

# 项目名代号,归档配置文件用
project="scaffold"
# 部署环境(dev/test/prd)
env="dev"
# 配置文件类型(java/node/vue)
config_type="vue"
# harbor的IP
harbor_ip="192.168.1.40"
# harbor的镜像仓库名称,需提前在harbor创建好
harbor_pro="yd"
# k8s上该项目的namespace,需提前在k8s创建好
namespace="dev-yd"
# harbor密钥名称,需提前在k8s创建好
secret="yd-secret"
# POD副本数
replicas="1"

################################## 以下内容不需改动 ################################## 

# 配置文件路径
conf_dir="/opt/config/${config_type}/${env}/${project}/${JOB_NAME}"
config_dir="${conf_dir}/config"
dockerfile_dir="${conf_dir}/dockerfile"
deployment_dir="${conf_dir}/deployment"
# Docker
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:v${BUILD_ID}"
# 配置文件名称
config_name="index_${JOB_NAME}_v${BUILD_ID}.js"
dockerfile_name="dockerfile_${JOB_NAME}_v${BUILD_ID}"
deployment_name="deployment_${JOB_NAME}_v${BUILD_ID}.yaml"
# 检查目录函数
function dir_check()
{
if [ ! -d "$1" ];then mkdir -p $1; fi
}
################################## 生成config ##################################
dir_check ${config_dir}
cat >${config_dir}/${config_name}<<EOF
let configObj = {
iot: "http://192.168.1.11:30003",
iot_login: "http://192.168.1.11:30003"
};
const { iot, iot_login } = configObj;
export {
    iot,
    iot_login,
}
EOF
################################## 生成dockerfile ################################## 
dir_check ${dockerfile_dir}
cat >${dockerfile_dir}/${dockerfile_name}<<EOF
FROM tomcat:9.0.35-jdk8-openjdk-slim
EXPOSE 8080
WORKDIR /usr/local/tomcat/webapps/ROOT
ADD dist /usr/local/tomcat/webapps/ROOT
EOF
################################## 生成deployment ################################## 
dir_check ${deployment_dir}
cat >${deployment_dir}/${deployment_name}<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ${JOB_NAME}
  namespace: ${namespace}
spec:
  replicas: ${replicas}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: ${JOB_NAME}-pod
  template:
    metadata:
      labels:
        app: ${JOB_NAME}-pod
    spec:
      restartPolicy: Always
      imagePullSecrets:
      - name: ${secret}
      containers:
      - name: ${JOB_NAME}-con
        image: ${harbor_ip}/${harbor_pro}/${docker_images}
        imagePullPolicy: Always
        ports:
        - name:
          containerPort: ${config_port}
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: ${JOB_NAME}-svc
  namespace: ${namespace}
  labels:
    name: ${JOB_NAME}-svc
spec:
  type: NodePort
  selector:
    app: ${JOB_NAME}-pod
  ports:
    - protocol: TCP
      port: ${config_port}
      targetPort: 8080
      nodePort: ${config_port}
EOF
################################## 项目编译 ################################## 

\cp ${config_dir}/${config_name} ./src/config/index.js
npm install --unsafe-perm
npm run build


################################## 构建镜像 ################################## 
dir_check ${docker_space}
cp -r ./dist ${docker_space}
cd ${docker_space};docker build -f ${dockerfile_dir}/${dockerfile_name} -t ${harbor_ip}/${harbor_pro}/${docker_images} .
docker push ${harbor_ip}/${harbor_pro}/${docker_images}
docker rmi ${harbor_ip}/${harbor_pro}/${docker_images}
rm -rf ${docker_space}/*

################################## 部署deployment ################################## 
kubectl apply -f ${deployment_dir}/${deployment_name} --record
kubectl rollout status deployment/${JOB_NAME} -n ${namespace}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值