SpringBootアプリケーションとMySQLをkubernetesクラスタに配備


環境準備
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フォルダの下に投げ込みます.このシナリオでは、次のようなことが実現されています.
  • mavenパッケージ
  • dockerミラー
  • を打つ
  • ミラーをローカルウェアハウス
  • にプッシュ
  • Deploymentリソーステンプレートファイルを更新するミラーtag
  • 更新ファイルに従って配置
  • 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にアップロードされています.興味があれば教えてください.