- 開発技術
SpringBootアプリからKubernetesClientを使用してkubernetesを操作する方法について
- #Kubernetes
目次
目的
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
SpringBootアプリからkubernetesを操作したい要望があったため
ここに手順を纏めておきます。
サンプルとしてkubernetes内のpod名を全て取得する手順となっています。
JavaのAPI部分を変更することでkubernetesの様々な操作が可能となります。
前提
・kubernetesが構築されていること
・kubectlが操作できる端末があること
・操作端末にJavaがインストール済みであること
・VSCodeがインストール済みであること
・Dockerが操作できる端末があること
・Amazon ECRが作成されていること
※今回の手順ではDockerレジストリにAmazon ECRを使用しますが
特に指定ではありませんので、Docker Hub等他のレジストリでも構いません。
作成アプリ
WEBでルートパス(/)にアクセスした時にkubernetes内のpod名を
すべて取得するアプリケーションを作成します。
作成手順
以下はJavaがインストール済みの端末で操作します。
例ではwindows10上で操作していきます。
【1】VSCodeに以下の拡張機能をインストールします。
Spring Boot Extension Pack
Java Extension Pack
【2】demoアプリを作成します。
①Ctr+Shift*Pを押してコマンドパレットを開きます。
②spring initializrと入力し、表示される中から「create a maven project」を選択します。
③spring bootのバージョンを選択します。
今回は「3.0.0」を選択しました。
④言語を「Java」を選択します。
⑤パッケージはデフォルトのままとします。
⑥アプリケーションの名前もデフォルトままとします。
⑦パッケージ形式は「Jar」を選択します。
⑧Javaのバージョンは「17」選択します。
※ここは自分の環境にイントールされているJavaバージョンを選択してください。
⑨プラグインを選択します。
今回は以下を選択しました。
Spring Web
Thymleaf
※上記のプラグインは必須ではありません。動作確認用に追加しています。
⑩プロジェクト作成場所は任意の場所に指定してください。
⑪VSCode左側のSpring bootのアイコンを選択し、demoアプリケーションを実行します。
ログに「Completed initialization in ~」と出力されれば起動完了です。
【3】demoアプリにkubernetes-clientコントローラを作成します。
①pom.xmlに「spring-cloud-starter-kubernetes-client」を設定します。
編集ファイル:/demo/pom.xml
1 2 3 4 5 6 |
<dependency><span><dependency></span> <groupid> org.springframework.cloud</groupid> <artifactid><dependency><groupid> </groupid></dependency>spring-cloud-starter-kubernetes-client</artifactid> <version>2.1.5 <span></dependency></span></version> </dependency> |
※バージョンは2022/12/09時のものを指定しています。
古くなっている古くなっている場合がありますので最新バージョンに書き換えをお願いします。
pom.xmlの35行目~39行目に追加してください。
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 |
<?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>3.0.0</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> </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-kubernetes-client</artifactId> <version>2.1.5</version> </dependency> <!-- ↑ ここに追加 --> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
②確認用コントローラを作成します。
作成ファイル:/demo/src/main/java/com/example/demo/controller/DemoController.java
このクラスでkubernetesのpod一覧を取得しています。
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 |
package com.example.demo.controller; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.Configuration; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodList; import io.kubernetes.client.util.Config; @Controller public class DemoController { @GetMapping("/") public String demo(Model model) { try { // 設定権限の読み込みを行います。 ApiClient client = Config.defaultClient(); Configuration.setDefaultApiClient(client); // APIを使用しpodのリストを取得します。 CoreV1Api api = new CoreV1Api(); V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null, null); // 取得したpodリストからpodの名前を取得します。 List<string> pods = new ArrayList<string>(); for (V1Pod item : list.getItems()) { // 確認用コンソール出力 System.out.println(item.getMetadata().getName()); // 表示用リストに追加 pods.add(item.getMetadata().getName()); } model.addAttribute("pods", pods); } catch (IOException e) { e.printStackTrace(); } catch (ApiException e) { e.printStackTrace(); } return "demo"; } }</string></string> |
③確認用テンプレートを作成します。
作成ファイル:/demo/src/main/resources/templates/demo.html
1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <title>demo</title> </head> <body> <h1>Hello Kubernetes Client</h1> <ul> <th:block th:each="pod : ${pods}"> <li th:text="${pod}"></li> </th:block> </ul> </body> </html> |
1 |
※この時点でSpring bootを起動し「localhost:8080」にアクセスしてもkubernetes上で動作していないためエラーとなります。
【4】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ビルドを実行します。
※ここからの手順ではdocker、kubectlがインストールされた端末で操作してください。
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 | sudo 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アプリをデプロイします。
①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 45 |
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に変更をお願いします。
※権限を「cluster-admin
」で全権限を付与していますので、本番環境等で使用する場合はここの権限を絞って使用をお願いします。
②kubernetesにデプロイします。
demoアプリのカレントディレクトリに移動します。
1 |
cd /demo |
demoアプリをデプロイします。
1 |
kubectl apply -f kubernetes/demo-deployment.yml |
③demoアプリが正常に起動したか確認します。
1 |
kubectl get po |
【6】demoアプリの動作確認をします。
①demoアプリのpodに入ります。
対象のpod名を取得します。
1 |
kubectl get po |
podにログインします。
1 |
kubectl exec -it demo-deployment-74d5845f4-hpjqj /bin/sh |
※demo-deployment-74d5845f4-hpjqj
の部分は上記で確認したpod名に変更してください。
②curlコマンドで動作確認を実施します。
1 |
curl localhost:8080 |
podの一覧が取得できれば成功です。
以上
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>