- 開発技術
SpringBootアプリからKubernetesClientConfigを使用してapplication.ymlを読み込む方法について
- #Kubernetes
目次
目的
【エンジニア募集中】フルリモート可◎、売上/従業員数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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> <!-- ↓★ここを追加 --> <spring-cloud.version>2021.0.3</spring-cloud.version> <!-- ↑★ここを追加 --> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- ↓★ここを追加 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.5</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-kubernetes-client-config</artifactId> <version>2.1.5</version> </dependency> <!-- ↑★ここを追加 --> </dependencies> <!-- ↓★ここを追加 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- ↑★ここを追加 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
※★ここを追加となっている部分を参照願います。
【4】demoアプリに設定ファイルを作成します。
①デフォルトで作成されている「application.properties」を削除します。
削除ファイル:/demo/src/main/resources/application.properties
②ローカル動作確認用「application.yml」を作成します。
作成ファイル:/demo/src/main/resources/application.yml
1 2 3 4 5 6 |
spring: application: name: demo greeting: message: ローカル環境で動作しています。 |
③「bootstrap.yml」を作成します。
作成ファイル:/demo/src/main/resources/bootstrap.yml
1 2 3 4 5 6 7 |
spring: cloud: kubernetes: config: namespace: default sources: - name: config-map-one |
※今回は「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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class DemoController { // 設定ファイルで指定されたパラメータを取得します。 @Value("${greeting.message}") public String message; @GetMapping("/") public String demo(Model model) { System.out.println(message); model.addAttribute("message", message); return "demo"; } } |
②確認用テンプレートを作成します。
作成ファイル:/demo/src/main/resources/templates/demo.html
1 2 3 4 5 6 7 8 9 10 11 |
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <title>demo</title> </head> <body> <h1>Hello Kubernetes Client Config</h1> <p th:text="${message}"></p> </body> </html> |
③ローカルサーバーを再起動して「http://localhost:8080/」にアクセスします。
「ローカル環境で動作しています。」で動作していますと表示されれば成功です。
【6】demoアプリをDocker化します。
①Dockerfileを作成
作成ファイル:/demo/docker/Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Dockerfile # maven https://hub.docker.com/_/maven FROM maven:3.8.5-openjdk-17 as builder WORKDIR /usr/src/app/ COPY ./pom.xml /usr/src/app/ COPY ./src/ /usr/src/app/src/ RUN mvn -B package -Dmaven.test.skip=true # openjdk https://hub.docker.com/_/openjdk FROM openjdk:17.0.2-buster # spring boot実行ユーザー追加 ARG USERNAME=demouser ARG GROUPNAME=demouser ARG UID=1000 ARG GID=1000 RUN groupadd -g $GID $GROUPNAME && \ useradd -m -s /bin/bash -u $UID -g $GID $USERNAME USER $USERNAME WORKDIR /demo/ COPY --from=builder /usr/src/app/target/*.jar /demo/app.jar ENTRYPOINT ["java","-jar","/demo/app.jar"] |
②demoアプリのドッカービルドを実行します。
※ここからdockerがインストールされた端末上で操作します。
demoアプリのカレントディレクトリに移動します。
1 |
cd /demo |
Docerビルドを実行します。
1 |
docker build -t demo:ver1.0 -f docker/Dockerfile . |
Successfullyと表示されればビルド成功です。
③Kubernetesから参照できるECRにDockerイメージをプッシュします。
ECRにログイン
1 |
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com |
※XXXXXXXX
の部分は自分のAWSアカウントIDに変更をお願いします。
タグをECR用に変更
1 |
sudo docker tag demo:ver1.0 XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/demo-ecr:demo-ver1.0 |
※XXXXXXXX
の部分は自分のAWSアカウントIDに変更をお願いします。
※demo-ecr
の部分は自分のECRに変更をお願いします。
ECRにプッシュ
1 |
sudo docker push XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/demo-ecr:demo-ver1.0 |
※XXXXXXXX
の部分は自分のAWSアカウントIDに変更をお願いします。
※demo-ecr
の部分は自分のECRに変更をお願いします。
【5】kubenetesにdemoアプリをデプロイします。
※ここからkubectlが操作できる端末で操作します。
①demoアプリが参照する「ConfigMap」を作成します。
作成ファイル:/demo/kubernetes/configmap.yml
1 2 3 4 5 6 7 8 |
kind: ConfigMap apiVersion: v1 metadata: name: config-map-one data: application.yml: |- greeting: message: サーバー環境で動作しています。 |
②ConfigMapをkubernetesにデプロイします。
1 |
kubectl apply -f kubernetes/configmap.yml |
③kubernetesにデプロイするファイルを作成します。
作成ファイル:/demo/kubernetes/demo-deployment.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
apiVersion: v1 kind: ServiceAccount metadata: name: demo-user namespace: default --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: demo-cluster-role-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: demo-user namespace: default --- apiVersion: apps/v1 kind: Deployment metadata: name: demo-deployment namespace: default spec: selector: matchLabels: app: demo tier: web environment: main replicas: 1 template: metadata: labels: app: demo tier: web environment: main spec: serviceAccount: demo-user containers: - name: demo image: XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/demo-ecr:demo-ver1.0 ports: - containerPort: 8080 |
※XXXXXXXX
の部分は自分のAWSアカウントIDに変更をお願いします。
※demo-ecr
の部分は自分のECRに変更をお願いします。
※demoアプリの権限は「cluster-admin」で全権限を付与していますが、実際に運用する場合は
以下のページにあるように最小権限を使用願います。
https://docs.spring.io/spring-cloud-kubernetes/docs/current/reference/html/#service-account
④kubernetesにデプロイします。
demoアプリのカレントディレクトリに移動します。
1 |
cd /demo |
demoアプリをデプロイします。
1 |
kubectl apply -f kubernetes/demo-deployment.yml |
⑤demoアプリが正常に起動したか確認します。
1 |
kubectl get po |
Runingになっていれば成功です。
【6】demoアプリの動作確認をします。
①demoアプリのpodに入ります。
対象のpod名を取得します。
podにログインします。
②curlコマンドで動作確認を実施します。
「サーバー環境で動作しています。」で動作していますと表示されれば成功です。
以上
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>