SpringBootアプリケーションとMySQLをkubernetesクラスタに配備
環境準備
k 8 sクラスタとローカルウェアハウスが必要です.まだ構築されていない場合は、上記の2つの記事Kubernetesクラスタ構築の詳細ガイドを参照して、kubernetesのローカルミラーウェアハウスを作成することをお勧めします.
MySQLの配備
まず、MySQLを保存するために永続ボリュームと永続ボリューム宣言を作成する必要があります.そうしないと、MySQLの再起動データが失われます.
1)永続ボリュームおよび永続ボリューム宣言の作成
以下のyaml宣言をmysql-pvとして保存する.yamlを実行し、applyコマンドを実行します.
2)MySQL 5.6の配備
ここでMySQL 5を選びました.6のバージョンは、他のバージョンに変更することもできます.
以下のyaml宣言をmysql-deploymentとして保存します.yamlを実行し、applyコマンドを実行します.
MySQLを作成すると同時にServiceを作成し、Serviceはクラスタ内のコンテナ通信にサービス発見機能を提供します.
導入結果の表示:
SpringBootアプリケーションの導入
1)プロジェクトルートディレクトリにDockerfileを作成する
2)プロファイルのdatasourceの変更を覚えている
urlの2番目のmysqlは、以前にMySQLのサービス名を作成したものです.他の変数は環境変数として読み込まれます.
3)リソース定義ファイルyamlの作成
プロジェクトルートディレクトリの下にdeployフォルダを作成し、spring-boot-deploymentを以下のように作成します.yamlファイルをdeployフォルダの下に置きます.
4)ソール命令スクリプト
手動でコマンドを叩く悩みを避けるために、梭を直接次のbashスクリプトに統合し、auto-deployと命名した.sh、deployフォルダの下に投げ込みます.このシナリオでは、次のようなことが実現されています. mavenパッケージ dockerミラー を打つミラーをローカルウェアハウス にプッシュ Deploymentリソーステンプレートファイルを更新するミラーtag 更新ファイルに従って配置
5)スクリプトによる導入
デプロイメント効果を表示し、node 2ノードにスケジューリングされていることを確認します.
node 2のipを表示するには:
現在のspringbootプロジェクトに対応するサービスはNodePortタイプであるため、クラスタの外部からNodeIpおよびNodePortを介してアクセスできます.
プロジェクトのソースコードはGitHub spring-boot-k 8 s-appにアップロードされています.興味があれば教えてください.
k 8 sクラスタとローカルウェアハウスが必要です.まだ構築されていない場合は、上記の2つの記事Kubernetesクラスタ構築の詳細ガイドを参照して、kubernetesのローカルミラーウェアハウスを作成することをお勧めします.
MySQLの配備
まず、MySQLを保存するために永続ボリュームと永続ボリューム宣言を作成する必要があります.そうしないと、MySQLの再起動データが失われます.
1)永続ボリュームおよび永続ボリューム宣言の作成
以下のyaml宣言をmysql-pvとして保存する.yamlを実行し、applyコマンドを実行します.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: mysql520
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
kubectl apply -f mysql-pv.yaml
2)MySQL 5.6の配備
ここでMySQL 5を選びました.6のバージョンは、他のバージョンに変更することもできます.
以下のyaml宣言をmysql-deploymentとして保存します.yamlを実行し、applyコマンドを実行します.
MySQLを作成すると同時にServiceを作成し、Serviceはクラスタ内のコンテナ通信にサービス発見機能を提供します.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: mysql520
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
kubectl apply -f mysql-deployment.yaml
導入結果の表示:
[root@k8s-master spring-boot-k8s-app]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-7446cc569d-nglnb 1/1 Running 4 40m
SpringBootアプリケーションの導入
1)プロジェクトルートディレクトリにDockerfileを作成する
FROM openjdk:8-jdk
WORKDIR /opt/
COPY target/spring-boot-k8s-app.jar /opt/
EXPOSE 8080
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-Xms400m","-Xmx400m","-jar","/opt/spring-boot-k8s-app.jar", "--spring.profiles.active=prod"]
2)プロファイルのdatasourceの変更を覚えている
urlの2番目のmysqlは、以前にMySQLのサービス名を作成したものです.他の変数は環境変数として読み込まれます.
spring:
datasource:
url: jdbc:mysql://mysql:3306/demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&autoReconnect=true
username: ${
MYSQL_USERNAME}
password: ${
MYSQL_PASSWORD}
initialization-mode: always
3)リソース定義ファイルyamlの作成
プロジェクトルートディレクトリの下にdeployフォルダを作成し、spring-boot-deploymentを以下のように作成します.yamlファイルをdeployフォルダの下に置きます.
kind: Service
apiVersion: v1
metadata:
name: spring-boot-k8s-app-service
spec:
type: NodePort
selector:
app: spring-boot-k8s-app
ports:
- protocol: TCP
port: 8080
nodePort: 32082
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-k8s-app-deployment
spec:
replicas: 1
selector:
matchLabels:
app: spring-boot-k8s-app
template:
metadata:
labels:
app: spring-boot-k8s-app
spec:
containers:
- name: spring-boot-k8s-app-controller
image: 192.168.6.128:5000/spring-boot-k8s-app:20200907-011935
ports:
- containerPort: 8080
env:
- name: MYSQL_PORT
value: '3306'
- name: MYSQL_USERNAME
value: root
- name: MYSQL_PASSWORD
value: mysql520
4)ソール命令スクリプト
手動でコマンドを叩く悩みを避けるために、梭を直接次のbashスクリプトに統合し、auto-deployと命名した.sh、deployフォルダの下に投げ込みます.このシナリオでは、次のようなことが実現されています.
git pull origin master
mvn clean package -DskipTests
tag=$(date +"%Y%m%d-%H%M%S")
if [ $# -eq 1 ]; then
tag=$1
fi
image=localhost:5000/spring-boot-k8s-app:$tag
imagename=spring-boot-k8s-app:$tag
docker build -t $image .
docker push $image
echo "$image"
echo "$imagename"
pwd
cp deploy/spring-boot-deployment.yaml deploy/spring-boot-deployment-tmp.yaml
sed -i s#spring-boot-k8s-app:[0-9]*-[0-9]*#$imagename# deploy/spring-boot-deployment-tmp.yaml
kubectl apply -f deploy/spring-boot-deployment-tmp.yaml
5)スクリプトによる導入
sh deploy/auto-deploy.sh
デプロイメント効果を表示し、node 2ノードにスケジューリングされていることを確認します.
[root@k8s-master spring-boot-k8s-app]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-7446cc569d-nglnb 1/1 Running 4 138m 10.244.1.38 k8s-node1 <none> <none>
spring-boot-k8s-app-deployment-587b6dc8c8-bx792 1/1 Running 0 5m48s 10.244.2.29 k8s-node2 <none> <none>
node 2のipを表示するには:
[root@k8s-master spring-boot-k8s-app]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready master 2d v1.19.0 192.168.6.128 <none> CentOS Linux 7 (Core) 3.10.0-957.12.2.el7.x86_64 docker://18.6.1
k8s-node1 Ready <none> 2d v1.19.0 192.168.6.131 <none> CentOS Linux 7 (Core) 3.10.0-957.12.2.el7.x86_64 docker://18.6.1
k8s-node2 Ready <none> 2d v1.19.0 192.168.6.132 <none> CentOS Linux 7 (Core) 3.10.0-957.12.2.el7.x86_64 docker://18.6.1
現在のspringbootプロジェクトに対応するサービスはNodePortタイプであるため、クラスタの外部からNodeIpおよびNodePortを介してアクセスできます.
http://192.168.6.132:32082/
アドレスに直接ホストブラウザでアクセスすると効果が得られます.プロジェクトのソースコードはGitHub spring-boot-k 8 s-appにアップロードされています.興味があれば教えてください.