SpringBootアプリからKubernetesClientConfigを使用してapplication.ymlを読み込む方法について

この記事を書いたチーム:chocochip

目的

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

SpringBootアプリの設定ファイルをKubernetes上で管理するため
KubernetesClientConfigを使用してKubernetesのConfigMapを読み込む
手順をここに記載します。

前提

・kubernetesが構築されていること
・kubectlが操作できる端末があること
・操作端末にJavaがインストール済みであること
・VSCodeがインストール済みであること
・Dockerが操作できる端末があること
・Amazon ECRが作成されていること
 ※今回の手順ではDockerレジストリにAmazon ECRを使用しますが
  特に指定ではありませんので、Docker Hub等他のレジストリでも構いません。

作成アプリ

WEBでルートパス(/)にアクセスした時にapplication.ymlに記載された
「greeting.message」というパラメータを表示するアプリケーションを作成します。

作成手順

【1】VSCodeに以下の拡張機能をインストールします。

Spring Boot Extension Pack
Java Extension Pack

【2】demoアプリの作成

①Ctr+Shift*Pを押してコマンドパレットを開きます。

②spring initializrと入力し、表示される中から「create a maven project」を選択します。

③spring bootのバージョンを選択します。
今回は「2.7.6」を選択しました。

④言語を「Java」を選択します。

⑤パッケージはデフォルトのままとします。

⑥アプリケーションの名前もデフォルトままとします。

⑦パッケージ形式は「Jar」を選択します。

⑧Javaのバージョンは「17」選択します。
※ここは自分の環境にイントールされているJavaバージョンを選択してください。

⑨プラグインを選択します。
今回は以下を選択しました。

Spring Web
Thymleaf

⑩プロジェクト作成場所は任意の場所に指定してください。

⑪VSCode左側のSpring bootのアイコンを選択し、demoアプリケーションを実行します。

ログに「Started DemoApplication in ~」と出力されれば起動完了です。

【3】demoアプリの依存関係を設定していきます。

①pom.xmlに「spring-cloud-starter-bootstrap」「spring-cloud-starter-kubernetes-client-config」を設定します。
※「spring-cloud-starter-bootstrap」については今後非推奨になっている可能性がありますので、使用時に確認をお願いします。
※バージョンは2022/12/09時のものを指定しています。
 古くなっている古くなっている場合がありますので最新バージョンに書き換えをお願いします。

編集ファイル:/demo/pom.xml

 

※★ここを追加となっている部分を参照願います。

【4】demoアプリに設定ファイルを作成します。

①デフォルトで作成されている「application.properties」を削除します。
削除ファイル:/demo/src/main/resources/application.properties

②ローカル動作確認用「application.yml」を作成します。

作成ファイル:/demo/src/main/resources/application.yml

 

③「bootstrap.yml」を作成します。

作成ファイル:/demo/src/main/resources/bootstrap.yml

 

※今回は「config-map-one」という名前のConfigMapを使用する設定とします。
※設定ファイルの書き方は公式ドキュメントに詳しく書いてありますのでそちらを参照願います。
https://docs.spring.io/spring-cloud-kubernetes/docs/current/reference/html/#configmap-propertysource

【5】demoアプリに確認用コントローラを作成します。

①確認用コントローラを作成します。

作成ファイル:/demo/src/main/java/com/example/demo/controller/DemoController.java

 

②確認用テンプレートを作成します。

作成ファイル:/demo/src/main/resources/templates/demo.html

 

③ローカルサーバーを再起動して「http://localhost:8080/」にアクセスします。

「ローカル環境で動作しています。」で動作していますと表示されれば成功です。

【6】demoアプリをDocker化します。

①Dockerfileを作成

作成ファイル:/demo/docker/Dockerfile

 

②demoアプリのドッカービルドを実行します。
※ここからdockerがインストールされた端末上で操作します。

demoアプリのカレントディレクトリに移動します。

Docerビルドを実行します。

Successfullyと表示されればビルド成功です。

③Kubernetesから参照できるECRにDockerイメージをプッシュします。

ECRにログイン

 

XXXXXXXXの部分は自分のAWSアカウントIDに変更をお願いします。

タグをECR用に変更

 

XXXXXXXXの部分は自分のAWSアカウントIDに変更をお願いします。

demo-ecrの部分は自分のECRに変更をお願いします。

ECRにプッシュ

 

XXXXXXXXの部分は自分のAWSアカウントIDに変更をお願いします。

demo-ecrの部分は自分のECRに変更をお願いします。

【5】kubenetesにdemoアプリをデプロイします。

※ここからkubectlが操作できる端末で操作します。
①demoアプリが参照する「ConfigMap」を作成します。

作成ファイル:/demo/kubernetes/configmap.yml

②ConfigMapをkubernetesにデプロイします。

③kubernetesにデプロイするファイルを作成します。

作成ファイル:/demo/kubernetes/demo-deployment.yml

 

XXXXXXXXの部分は自分のAWSアカウントIDに変更をお願いします。

demo-ecrの部分は自分のECRに変更をお願いします。

※demoアプリの権限は「cluster-admin」で全権限を付与していますが、実際に運用する場合は
以下のページにあるように最小権限を使用願います。
https://docs.spring.io/spring-cloud-kubernetes/docs/current/reference/html/#service-account

④kubernetesにデプロイします。

demoアプリのカレントディレクトリに移動します。

 

demoアプリをデプロイします。

⑤demoアプリが正常に起動したか確認します。

Runingになっていれば成功です。

【6】demoアプリの動作確認をします。

①demoアプリのpodに入ります。

対象のpod名を取得します。

podにログインします。

②curlコマンドで動作確認を実施します。

「サーバー環境で動作しています。」で動作していますと表示されれば成功です。

以上

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス