apk源码编译打包-带你玩转k8s-一键部署springboot项目

前言

本文中的一键部署似乎是将部署过程命令转换为shell脚本。 其实因为是发布到k8s集群上,所以下发的命令和需要的东西会有些不同。 本文的一键部署脚本是基于构建适合自己的快速开发框架——持续部署的一键发布脚本的设计与实现。 所以我建议你先阅读这篇文章。

制作基本图像的知识

基础镜像通常可以直接使用openjdk:8u212-jdk-alpine,如果直接使用的话,它的功能还不够,所以我们需要在它的基础上进行处理。 添加一些必要的安装包。 并做一些初始化工作。

安装tzdata-时区相关包ttf-dejavu和fontconfig时更改源地址,图像验证码需要库curl-simple安装一个curl工具tini-正确注册信号处理程序(如pid),如果没有使用,容器中所有服务默认pid为1ospd-netstat 网络诊断工具,用于初始化springboot运行目录,更改默认时区 arthas 阿里巴巴开源Java诊断工具,需要5中的tini配合其他--未考虑暂且还望各位大佬回复建议。

cat < /mldong/docker/8u212-jdk-alpine-mldong/Dockerfile
# 指定基础镜像
FROM openjdk:8u212-jdk-alpine
# 维护者信息
MAINTAINER mldong 
# 修改源地址和安装一些必要库
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 
&& apk --update  add --no-cache tzdata ttf-dejavu fontconfig curl tini ospd-netstat  && rm -rf /var/cache/apk/* 
&& mkdir -p /app && mkdir -p /app/config 
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
    && echo "Asia/Shanghai" > /etc/timezone
# 安装arthas-这里是从另一个镜像复制过来,小技巧
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
EOF
复制代码

建造

docker build -f /mldong/docker/8u212-jdk-alpine-mldong/Dockerfile -t registry-vpc.cn-zhangjiakou.aliyuncs.com/mldong/java/8u212-jdk-alpine-mldong:1.0 .
复制代码

登录

docker login -u _username -p password registry-vpc.cn-zhangjiakou.aliyuncs.com
复制代码

docker push registry-vpc.cn-zhangjiakou.aliyuncs.com/mldong/java/8u212-jdk-alpine-mldong:1.0
复制代码

关于服务镜像 制作镜像 使用 Dockerfile 文件定义 使用 openjdk:8u212-jdk-alpine 作为基础镜像 将 jar 包复制到容器 将配置文件复制到容器 定义外部访问端口 定义容器,启动后运行命令(可以不定义,可以通过k8s的yaml命令定义)关于镜像版本号

镜像版本号建议使用当前时间+git版本

关于模板模板变量

最重要的模板变量是镜像版本,但是为了制作通用模板,推荐的模板变量是:

参数说明 APP_NAME 应用名称 NAMESPACE 命名空间 PROFILES 环境定义(prod->生产、测试​​->测试) IMAGE_URL 镜像地址 IMAGE_TAG 镜像版本 PORT 外部端口

模板引擎

这可能不叫模板引擎apk源码编译打包,毕竟只是简单的替换上面的变量,这里有两个选择。

选项 1:使用 sed

使用说明:

sed 's#模板变量1#值1#g;s#模板变量2#值2#g' 模板文件 > 生成的新文件
复制代码

例子:

文件内容如下:

cat < test.tpl
apiVersion: v1
kind: Namespace
metadata:
  name: {{APP_NAME}}-nodeport
  namespace: {{NAMESPACE}}-{{PROFILES}}
  
EOF
复制代码

生成模板

sed -e 's#{{APP_NAME}}#mldong-admin#g;s#{{NAMESPACE}}#mldong#g;s#{{PROFILES}}#test#g' test.tpl > test.yaml
复制代码

解决方案 2:使用 envsubst

​一般我们需要获取一个或多个环境来替换系统中的各个变量。 在这些情况下,我们只需要使用 sed 来简单地替换它们即可。 在这些场景下,sed可以满足我们的需求,而如果我们需要改变的变量很多,envsubst就会派上用场。

使用说明:

envsubst  生成的新文件
复制代码

例子:

文件内容如下:

cat < test2.tpl
apiVersion: v1
kind: Namespace
metadata:
  name: ${APP_NAME}-nodeport
  namespace: ${NAMESPACE}-${PROFILES}
  
EOF
复制代码

先定义环境变量

export APP_NAME=mldong-admin
export NAMESPACE=mldong
export PROFILES=test
复制代码

然后执行envsubst命令生成模板

envsubst  test2.yaml
复制代码

本文使用 sed 形式。

开始编码目录结构

├── /java_projects  管理端接口
   ├── mldong-admin
   	├── config
   		└── application-test.yml
   	├── app.jar	jar包
   	├── k8s.tpl	k8s发布模板
   	├── Dockerfile	镜像定义文件
   	└── buildAndPublish.sh	重新构建项目并发布项目到k8s集群
   └── source
   	├── back
           ├── mldong			源码根目录
               ├──	mldong-admin
                   └── pom.xml
               ├──	mldong-common
                   └── pom.xml
               ├── mldong-generator
                   └── pom.xml
               ├── mldong-mapper
               └── pom.xml
复制代码

文件解释

/java_projects/mldong-admin/config/application-test.yml

测试环境配置(为了简单起见,这里暂时不考虑在模板中添加mysql,使用朋友A上的数据库)

# jdbc 配置
jdbc.driver-class-name: com.mysql.cj.jdbc.Driver
jdbc.url: jdbc:mysql://172.26.22.105:3306/mldong?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username: u_mldong
jdbc.password: D5fopH@B7Q
jdbc.max-idle: 10000
jdbc.max-wait: 10000
jdbc.min-idle: 5
复制代码

/java_projects/mldong-admin/app.jar

这个jar包是源码编译后复制生成的。 打包镜像时,需要与Dockerfile文件在同一目录下。

/java_projects/mldong-admin/Dockerfile

图像定义文件

# 使用上述制作的基础镜像
FROM registry-vpc.cn-zhangjiakou.aliyuncs.com/mldong/java/8u212-jdk-alpine-mldong:1.0
# 维护者信息
MAINTAINER mldong 
# 创建应用目录
# RUN mkdir -p /app && mkdir -p /app/config 
# 进入工作目录
WORKDIR /app
# 复制jar
COPY app.jar .
# 配置配置文件
COPY config/* .
# EXPOSE 映射端口
EXPOSE 8080
# ENTRYPOINT 处理pid=1的问题
ENTRYPOINT ["/sbin/tini", "--"]
# CMD 运行以下命令(如果yaml文件定义了command会被覆盖)
CMD ["/bin/sh","-c","set -e && java -jar app.jar --spring.profiles.active=dev --server.port=8080"]
复制代码

/java_projects/mldong-admin/k8s.tpl

k8s服务部署模板

apiVersion: v1
kind: Namespace
metadata:
  name: {{NAMESPACE}}
---
apiVersion: v1
kind: Service
metadata:
  name: {{APP_NAME}}-nodeport
  namespace: {{NAMESPACE}}
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
  selector:
    app: {{APP_NAME}}
---
apiVersion: v1
kind: Service
metadata:
  name: {{APP_NAME}}
  namespace: {{NAMESPACE}}
spec:
  type: ClusterIP
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: {{APP_NAME}}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{APP_NAME}}
  namespace: {{NAMESPACE}}
spec:
  selector:
    matchLabels:
      app: {{APP_NAME}}
  replicas: 1
  template:
    metadata:
      labels:
        app: {{APP_NAME}}
    spec:
      containers:
        - name: {{APP_NAME}}
          image: {{IMAGE_URL}}:{{IMAGE_TAG}}
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              name: port
              protocol: TCP
          command: ["/bin/sh"]
          args: ["-c", "set -e && java -jar app.jar --spring.profiles.active={{PROFILES}} --server.port=8080"]
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
  name: {{APP_NAME}}-ingress
  namespace: {{NAMESPACE}}
spec:
  rules:
    - host: {{HOST}}
      http:
        paths:
          - backend:
              serviceName: {{APP_NAME}}
              servicePort: 8080
            path: /
复制代码

/java_projects/mldong-admin/buildAndPublish.sh

过程:

编译、打包、创建镜像、推送到私服、使用模板生成yaml发布并发布

#!/bin/bash
# 源码存放根目录
source_dir=/java_projects/source/back
# 父工程目录
parent_dir=$source_dir/mldong
# 需要打包的项目名称
project_name=mldong-admin
# 项目部署目录
project_dir=/java_projects/$project_name
# git仓库地址(使用ssh方式的,需要去配置部署公钥)
git_url=git@gitee.com:mldong/mldong.git
# 镜像仓库地址
registry_url=registry-vpc.cn-zhangjiakou.aliyuncs.com
# 镜像仓库空间
registry_ns=mldong/java
# 镜像仓库用户名
registry_username=username
# 镜像仓库密码
registry_password=password
# 生成的镜像地址
image_url=$registry_url/$registry_ns/$project_name
# 服务绑定的域名
host=c.mldong.com
# 环境定义
profiles=test
if [ -d "$source_dir" ]; then
  echo "源码存放根目录${source_dir}已存在"
else
  echo "源码存放根目录不存在,创建${source_dir}"
  cp -p $source_dir
fi
if [ -d "$parent_dir" ]; then
  echo "源码已存在,git pull"
  cd $parent_dir
  git pull
else
  echo "源码不存在,git clone"
  git clone $git_url $parent_dir
fi
git_version=$(git rev-parse HEAD)
echo "当前版本号:${git_version}"
image_tag=`date +"%Y%m%d%H%M"_``git describe --tags --always`
cd $parent_dir
mvn clean package -B
# 这里需要判断打包是否成功
if [ $? -ne 0 ]; then
  echo "打包失败"
else
  # 复制jar包
  cp -r -f $parent_dir/$project_name/target/$project_name.jar $project_dir/app.jar
  # 进入项目目录
  cd $project_dir
  # 构建镜像
  docker build -t $registry_url/$registry_ns/$project_name:$image_tag .
  # 登录私服
  docker login -u $registry_username -p ${registry_password} $registry_url
  # 推送到私服
  docker push $registry_url/$registry_ns/$project_name:$image_tag
  sed -e "s#{{APP_NAME}}#$project_name#g;s#{{NAMESPACE}}#$project_name-$profiles#g;s#{{PROFILES}}#$profiles#g;s#{{IMAGE_URL}}#$image_url#g;s#{{IMAGE_TAG}}#$image_tag#g;s#{{HOST}}#$host#g" k8s.tpl > k8s.yaml
  # 删除本地镜像
  docker rmi $registry_url/$registry_ns/$project_name:$image_tag
  if [ $? -ne 0 ]; then
      echo "构建镜像推送到私服失败"
  else
    cat k8s.yaml 
    kubectl apply -f k8s.yaml
  fi
fi
复制代码

验证结果

概括

本文以前段时间的开源快速开发框架为例,将之前的一键部署脚本改为​​k8s。 看来就之前的脚本来说,增加了打包镜像、推送私服、制作模板、发布的过程。 也就是再减少几个命令。 事实上,实际部署中可能会有一点差异,比如模板的内容可能会多一点apk源码编译打包,或者脚本可能会转换成jenikns pipeline。 但基本原理是相似的,过程也略有不同。

原文链接:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 apk源码编译打包-带你玩转k8s-一键部署springboot项目 https://www.wkzy.net/game/181335.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务