バックグラウンド
- 本番環境では、通常、CI && CDツールを使用してビルドとデプロイ全体を完了しているため、この記事は本番環境には適していません。
- 学習および開発環境では、コードを頻繁に変更し、効果をすばやく確認したいと考えています。この記事は、このシナリオを対象としています。
簡単な紹介
- SpringBootアプリケーションを開発していて、アプリケーションがK8S環境にデプロイされている場合は、この記事を参照して、アプリケーションをK8S環境にすばやくデプロイできます。
- 記事のSpringBootのバージョンは2.3.0.RELEASEです。このバージョンから、SpringBootは新しいdocker画像構築ソリューションを正式に推奨しています。以前のバージョンの場合は、記事の画像構築部分を自分で変更してください。
環境情報
この実際の戦闘には2つの環境があります。開発環境と運用環境です。開発環境の情報は次のとおりです。
- オペレーティングシステム:Ubuntu 20.04 LTSデスクトップバージョン(検証済み:MacBook pro 13インチ、macOS Catalina 10.15.4)
- CPU:2.30GHz×4、メモリ:32G、ハードディスク:1T NVMe
- JDK:1.8.0_231
- MAVEN:3.6.3
- SpringBoot:2.3.0.RELEASE
- ドッカー:19.03.10
- 開発ツール:IDEA 2020.1.1(Ultimate Edition)
動作環境情報は以下のとおりです。
- オペレーティングシステム:CentOS Linuxリリース7.8.2003
- 知事:1.15
さらに、開発環境にsshpassをインストールしてください。
SpringBootプロジェクトのソースコード
- この実際の戦闘では、通常のSpringBootプロジェクトが使用されました。ソースコードはGitHubからダウンロードできます。アドレスとリンクの情報を次の表(https://github.com/zq2599/blog_demos)に示します。
名前 | リンク | 備考 |
---|---|---|
プロジェクトホームページ | https://github.com/zq2599/blog_demos | GitHub上のプロジェクトのホームページ |
gitウェアハウスアドレス(https) | https://github.com/zq2599/blog_demos.git | プロジェクトのソースコードの倉庫アドレス、httpsプロトコル |
gitウェアハウスアドレス(ssh) | [email protected]:zq2599 / blog_demos.git | プロジェクトのソースコードの倉庫アドレス、sshプロトコル |
- このgitプロジェクトには複数のフォルダがあります。この章のアプリケーションは、以下の赤いボックスに示すように、probeemoフォルダの下にあります。
必要な内容
- プロジェクト全体は通常のSpringBootプロジェクトです。一般的なpom.xmlとソースコードに加えて、さらに3つのファイルがあります。
- Dockerfileファイルは、Dockerイメージをビルドするために使用されます。SpringBootのバージョンが2.3.0.RELEASE以降の場合は、SpringBootが公式に推奨するイメージのビルド方法を使用することをお勧めします。このDockerfileは参照用に使用できます。
- これは、probeemo.yamlファイルと特定のプロジェクトに関連しています。自分で変更して、デプロイメントとサービスのデプロイに使用できることを確認してください。
- auto_deploy.shは迅速な展開の鍵です。これについては次に詳しく説明します。
auto_deploy.sh詳細
auto_deploy.shの役割は次のとおりです。
- mavenコマンドを呼び出して、ビルドプロジェクトを編集します。
- ビルドしたjarファイルをDockerイメージにします。
- Dockerイメージをtarファイルとしてエクスポートします。
- tarファイルをK8Sサーバーにアップロードします。
- probedemo.yamlファイルをK8Sサーバーに送信します。
- sshpassを介してリモートでコマンドを実行し、K8SサーバーのローカルDockerウェアハウスにDockerイメージをインポートします。
- sshpassを介してリモートでコマンドを実行し、展開とサービスを展開します。
- auto_deploy.shの完全な内容は次のとおりです。
#!/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}
実験
- K8S環境アドレス、アカウントパスワードなどの実際の状況に応じて、auto_deploy.shの変数の値を変更してください。
- 開発段階で、Javaコードを変更して完了します。
- スクリプトauto_deploy.sh;を実行します。
- コンソールプロンプトは次のとおりです。
- 展開が完了し、機能を確認できます。
予防
この実際の戦闘でイメージを更新する方法は、ローカルでイメージをtarとしてエクスポートしてから、K8S環境に転送してインポートします。これは、K8S環境に複数のマシンがある場合は適していません。プライベートミラーリポジトリを使用し、ミラーイメージをウェアハウスにプッシュしてから、K8Sを使用することをお勧めしますミラー倉庫でミラーを引く。
この時点で、K8SへのSpringBootアプリケーションの迅速な展開の実際の戦いは完了しました。これは、私の開発プロセスで一般的に使用されているリモート展開方法です。参考にしてください。
GitHubへようこそ
- アドレス:https : //github.com/zq2599/blog_demos
- 内容:元の記事の分類と要約、およびJava、Docker、K8S、DevOPSなどを含むサポートソースコード