antecedentes
- Para el entorno de producción, generalmente utilizamos herramientas de CI && CD para completar toda la compilación y la implementación, por lo que este artículo no es adecuado para el entorno de producción;
- Para el entorno de aprendizaje y desarrollo, modificamos con frecuencia el código y queremos ver el efecto rápidamente Este artículo está dirigido a este escenario;
breve introducción
- Si está desarrollando una aplicación SpringBoot y la aplicación se implementa en el entorno K8S, puede consultar este artículo para implementar rápidamente la aplicación en el entorno K8S;
- La versión de SpringBoot en el artículo es 2.3.0.RELEASE. A partir de esta versión, SpringBoot recomienda oficialmente una nueva solución de construcción de imágenes acoplables. Si es una versión anterior, modifique la parte de construcción de imágenes en el artículo usted mismo;
Informacion ambiental
Hay dos entornos para este combate real: entorno de desarrollo y operación, la información del entorno de desarrollo es la siguiente:
- Sistema operativo: versión de escritorio Ubuntu 20.04 LTS (también verificado: MacBook pro de 13 pulgadas, macOS Catalina 10.15.4)
- CPU: 2,30 GHz × 4, memoria: 32 G, disco duro: 1T NVMe
- JDK: 1.8.0_231
- MAVEN: 3.6.3
- SpringBoot: 2.3.0.RELEASE
- Docker: 19.03.10
- Herramientas de desarrollo: IDEA 2020.1.1 (Ultimate Edition)
La información del entorno operativo es la siguiente:
- Sistema operativo: CentOS Linux versión 7.8.2003
- Gobernadores: 1,15
Además, instale sshpass en el entorno de desarrollo;
Código fuente del proyecto SpringBoot
- Se usó un proyecto SpringBoot ordinario en este combate real. El código fuente se puede descargar en GitHub. La dirección y la información del enlace se muestran en la siguiente tabla (https://github.com/zq2599/blog_demos):
nombre | enlace | Observaciones |
---|---|---|
Página de inicio del proyecto | https://github.com/zq2599/blog_demos | La página de inicio del proyecto en GitHub |
dirección del almacén de git (https) | https://github.com/zq2599/blog_demos.git | La dirección del almacén del código fuente del proyecto, protocolo https |
dirección del almacén de git (ssh) | [email protected]: zq2599 / blog_demos.git | La dirección del almacén del código fuente del proyecto, protocolo ssh |
- Hay varias carpetas en este proyecto git. La aplicación de este capítulo se encuentra en la carpeta probeemo , como se muestra en el cuadro rojo a continuación:
Contenido necesario
- Todo el proyecto es un proyecto SpringBoot normal. Además del pom.xml común y el código fuente, hay tres archivos más:
- El archivo Dockerfile se utiliza para crear la imagen de la ventana acoplable. Si su versión de SpringBoot es 2.3.0.RELEASE o superior, se recomienda utilizar el método de creación de imágenes recomendado oficialmente por SpringBoot. Este archivo Dockerfile se puede utilizar como referencia;
- Está relacionado con el archivo probedemo.yaml y su proyecto específico. Modifíquelo usted mismo para asegurarse de que se pueda utilizar para implementar la implementación y el servicio;
- auto_deploy.sh es la clave para una implementación rápida, que se explicará en detalle a continuación;
auto_deploy.sh detallado
El rol de auto_deploy.sh es el siguiente:
- Invoque el comando maven para editar el proyecto de compilación;
- Convierta el archivo jar integrado en una imagen acoplable;
- Exporte la imagen de la ventana acoplable como un archivo tar;
- Cargue el archivo tar en el servidor K8S;
- Envíe el archivo probedemo.yaml al servidor K8S;
- Ejecute comandos de forma remota a través de sshpass para importar la imagen de la ventana acoplable al almacén de la ventana acoplable local del servidor K8S;
- Ejecute comandos de forma remota a través de sshpass para implementar la implementación y el servicio;
- El contenido completo de auto_deploy.sh es el siguiente:
#!/bin/bash
# 判断是否安装了sshpass
if ! [ -x "$(command -v sshpass)" ]; then
echo '请安装sshpass后再使用此脚本!'
exit 1
fi
# 镜像名
IMAGE_NAME='bolingcavalry/probedemo'
# TAG名
TAG_NAME='0.0.1'
# 配置了deployment和service的yaml文件名
DEPLOY_SERVICE_YAML='probedemo.yaml'
# K8S环境的IP地址
K8S_IP_ADDRESS='192.168.50.135'
# K8S环境的SSH账号
K8S_SSH_ACCOUNT='root'
# 8S环境的SSH密码
K8S_SSH_PSWD='888888'
# K8S上存放tar和yaml文件的位置
K8S_FILE_PATH='~/deploy_temp'
# 当前名目录
CURRENT_DIR=`pwd`
echo '开始自动构建和部署,当前目录是:'${CURRENT_DIR}
# 执行maven命令构建项目
mvn clean package -U -DskipTests
echo "构建镜像文件:"${IMAGE_NAME}/${TAG_NAME}
docker build -t ${IMAGE_NAME}/${TAG_NAME} .
echo "将镜像导出为tar文件:"${IMAGE_NAME}/${TAG_NAME}
docker save ${IMAGE_NAME}/${TAG_NAME} > ${CURRENT_DIR}/image.tar
echo "在K8S服务器创建存放文件的目录:"${K8S_FILE_PATH}
sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "mkdir -p ${K8S_FILE_PATH}"
echo "将yaml文件发送到K8S服务器:"${IMAGE_NAME}/${TAG_NAME}
sshpass -p ${K8S_SSH_PSWD} scp ${CURRENT_DIR}/${DEPLOY_SERVICE_YAML} ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS}:${K8S_FILE_PATH}/
echo "将镜像tar文件发送到K8S服务器:"${IMAGE_NAME}/${TAG_NAME}
sshpass -p ${K8S_SSH_PSWD} scp ${CURRENT_DIR}/image.tar ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS}:${K8S_FILE_PATH}/
echo "如果K8S环境之前已经部署过,就先清理:"${IMAGE_NAME}/${TAG_NAME}
sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "kubectl delete -f ${K8S_FILE_PATH}/${DEPLOY_SERVICE_YAML}"
echo "等待10秒"
sleep 10
echo "清理之前加载到本地仓库的镜像:"${IMAGE_NAME}/${TAG_NAME}
sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "docker rmi ${IMAGE_NAME}/${TAG_NAME}"
echo "从tar文件加载镜像:"${IMAGE_NAME}/${TAG_NAME}
sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "docker load < ${K8S_FILE_PATH}/image.tar"
echo "部署:"${IMAGE_NAME}/${TAG_NAME}
sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "kubectl apply -f ${K8S_FILE_PATH}/${DEPLOY_SERVICE_YAML}"
echo "删除tar文件:"${CURRENT_DIR}/image.tar
rm -rf ${CURRENT_DIR}/image.tar
echo "删镜像:"${IMAGE_NAME}/${TAG_NAME}
docker rmi ${IMAGE_NAME}/${TAG_NAME}
experimentar
- Modifique los valores de las variables en auto_deploy.sh de acuerdo con su situación real, como la dirección del entorno K8S, la contraseña de la cuenta, etc.
- En la etapa de desarrollo, modifique el código java para completar;
- Ejecute el script auto_deploy.sh;
- El indicador de la consola es el siguiente:
- La implementación se ha completado y la función se puede verificar;
Precauciones
El método para actualizar la imagen en este combate real es exportarla localmente como tar y luego transferirla al entorno K8S para importarla. Esto no es adecuado cuando hay varias máquinas en el entorno K8S. Se recomienda usar un repositorio espejo privado, enviar la imagen espejo al almacén y luego K8S Tire del espejo en el almacén de espejos;
En este punto, el combate real de la implementación rápida de aplicaciones SpringBoot en K8S está completo. Este es un método de implementación remota comúnmente utilizado en mi proceso de desarrollo. Espero poder brindarles alguna referencia;
Bienvenido a mi GitHub
- Dirección: https://github.com/zq2599/blog_demos
- Contenido: Clasificación y resumen de artículos originales y código fuente de apoyo, que involucre Java, Docker, K8S, DevOPS, etc.