MinikubeでSpring Bootアプリケーションを実行する

Minikubeを使用したSpring Bootアプリケーションの実行

1. 概要

このprevious articleでは、Kubernetesに関する理論的な紹介を取り上げました。

このチュートリアルでは、we’ll discuss how to deploy a Spring Boot application on a local Kubernetes environment, also known as Minikube.

この記事の一部として、次のことを行います。

  • ローカルマシンにMinikubeをインストールする

  • 2つのSpring Bootサービスで構成されるサンプルアプリケーションを開発する

  • Minikubeを使用して1ノードクラスターでアプリケーションをセットアップする

  • 構成ファイルを使用してアプリケーションをデプロイします

2. Minikubeのインストール

Minikubeのインストールは、基本的に3つのステップで構成されます。ハイパーバイザー(VirtualBoxなど)、CLIkubectl、およびMinikube自体のインストールです。

official documentationは、各ステップ、およびすべての一般的なオペレーティングシステムの詳細な手順を提供します。

インストールが完了したら、Minikubeを起動し、VirtualBoxをハイパーバイザーとして設定し、minikubeというクラスターと通信するようにkubectlを構成できます。

$> minikube start
$> minikube config set vm-driver virtualbox
$> kubectl config use-context minikube

その後、kubectlがクラスタと正しく通信していることを確認できます。

$> kubectl cluster-info

出力は次のようになります。

Kubernetes master is running at https://192.168.99.100:8443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

この段階で、応答のIPを閉じたままにします(この場合は192.168.99.100)。 これを後でNodeIPと呼びます。これは、クラスターの外部からリソースを呼び出すために必要です。 g. ブラウザから。

最後に、クラスターの状態を検査できます。

$> minikube dashboard

このコマンドは、デフォルトのブラウザーでサイトを開き、クラスターの状態に関する広範な概要を提供します。

4. デモアプリケーション

クラスターが実行され、展開の準備ができたので、デモアプリケーションが必要です。

この目的のために、frontendbackendと呼ばれる2つのSpringBootサービスで構成される単純な「Helloworld」アプリケーションを作成します。

バックエンドはポート8080に1つのRESTエンドポイントを提供し、そのホスト名を含むStringを返します。 フロントエンドはポート8081で使用でき、単にバックエンドエンドポイントを呼び出して応答を返します。

その後、各アプリからDockerイメージを作成する必要があります。 そのために必要なすべてのファイルは、on GitHubでも利用できます。

Dockerイメージを構築する方法の詳細については、Dockerizing a Spring Boot Applicationをご覧ください。

We have to make sure here that we trigger the build process on the Docker host of the Minikube clusterを指定しないと、Minikubeは後で展開中にイメージを見つけることができません。 さらに、ホスト上のワークスペースをMinikube VMにマウントする必要があります。

$> minikube ssh
$> cd /c/workspace/tutorials/spring-cloud/spring-cloud-kubernetes/demo-backend
$> docker build --file=Dockerfile \
  --tag=demo-backend:latest --rm=true .

その後、Minikube VMからログアウトできます。以降のすべての手順は、kubectlおよびminikubeコマンドラインツールを使用してホスト上で実行されます。

5. 命令コマンドを使用した簡単な展開

最初のステップでは、1つのポッドのみで構成されるdemo-backendアプリのデプロイメントを作成します。 これに基づいて、いくつかのコマンドについて説明し、展開を確認し、ログを調べて、最後にクリーンアップできるようにします。

5.1. デプロイメントの作成

kubectlを使用して、必要なすべてのコマンドを引数として渡します。

$> kubectl run demo-backend --image=demo-backend:latest \
  --port=8080 --image-pull-policy Never

ご覧のとおり、バージョンlatestdemo-backendとも呼ばれるイメージからインスタンス化されるdemo-backend, whichというデプロイメントを作成します。

–portを使用して、デプロイメントがポッド用にポート8080を開くことを指定します(demo-backendアプリがポート8080をリッスンするため)。

フラグ–image-pull-policy Neverは、Minikubeがレジストリからイメージをプルしようとせず、代わりにローカルのDockerホストからイメージを取得することを保証します。

5.2. 展開の確認

これで、デプロイが成功したかどうかを確認できます。

$> kubectl get deployments

出力は次のようになります。

NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
demo-backend   1         1         1            1           19s

アプリケーションログを確認するには、まずPod IDが必要です。

$> kubectl get pods
$> kubectl logs 

5.3. デプロイメント用のサービスの作成

バックエンドアプリのRESTエンドポイントを利用できるようにするには、サービスを作成する必要があります。

$> kubectl expose deployment demo-backend --type=NodePort

–type=NodePortは、クラスターの外部からサービスを利用できるようにします。 <NodeIP>:<NodePort>で利用可能になります。 e. このサービスは、<NodePort>で着信するリクエストを、割り当てられたポッドのポート8080にマッピングします。

公開コマンドを使用するため、NodePortはクラスタによって自動的に設定されます(これは技術的な制限です)。デフォルトの範囲は30000〜32767です。 選択したポートを取得するには、次のセクションで説明するように、構成ファイルを使用できます。

サービスが正常に作成されたことを確認できます。

$> kubectl get services

出力は次のようになります。

NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
demo-backend   NodePort    10.106.11.133           8080:30117/TCP   11m

ご覧のとおり、NodePortタイプのdemo-backendというサービスが1つあり、クラスター内部IP10.106.11.133で利用できます。

ポートPORT(S)を詳しく見る必要があります。ポート8080が展開で定義されているため、サービスはこのポートにトラフィックを転送します。 ただし、ブラウザからdemo-backend を呼び出す場合は、クラスタの外部から到達可能なポート30117を使用する必要があります。

5.4. サービスの呼び出し

これで、初めてバックエンドサービスを呼び出すことができます。

$> minikube service demo-backend

このコマンドはデフォルトのブラウザを起動し、<NodeIP>:<NodePort>.を開きます。この例では、http://192.168.99.100:30117になります。

5.5. サービスと展開のクリーンアップ

その後、サービスと展開を削除できます。

$> kubectl delete service demo-backend
$> kubectl delete deployment demo-backend

6. 構成ファイルを使用した複雑な展開

より複雑なセットアップの場合は、コマンドライン引数を介してすべてのパラメーターを渡すのではなく、構成ファイルの方が適しています。

構成ファイルは、デプロイメントを文書化する優れた方法であり、バージョン管理することができます。

6.1. バックエンドアプリのサービス定義

設定ファイルを使用して、バックエンドのサービスを再定義しましょう。

kind: Service
apiVersion: v1
metadata:
  name: demo-backend
spec:
  selector:
    app: demo-backend
  ports:
  - protocol: TCP
    port: 8080
  type: ClusterIP

metadata: nameフィールドで示されるdemo-backendという名前のServiceを作成します。

app=demo-backendラベルが付いたポッドのTCPポート8080をターゲットにします。

最後に、type: ClusterIPは、クラスター内からのみ使用可能であることを示します(今回は、demo-frontendアプリからエンドポイントを呼び出しますが、前の例のようにブラウザーから直接呼び出すことはできません)。 )。

6.2. バックエンドアプリのデプロイ定義

次に、実際の展開を定義できます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-backend
spec:
  selector:
      matchLabels:
        app: demo-backend
  replicas: 3
  template:
    metadata:
      labels:
        app: demo-backend
    spec:
      containers:
        - name: demo-backend
          image: demo-backend:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8080

metadata: nameフィールドで示されるdemo-backendという名前のDeploymentを作成します。

spec: selectorフィールドは、Deploymentが管理するポッドを見つける方法を定義します。 この場合、ポッドテンプレートで定義された1つのラベル(app: demo-backend)を選択するだけです。

replicasフィールドで示す3つの複製ポッドが必要です。

テンプレートフィールドは、実際のポッドを定義します。

  • ポッドにはapp: demo-backendというラベルが付いています

  • template: specフィールドは、各ポッドレプリケーションがバージョンlatestで1つのコンテナーdemo-backendを実行することを示します。

  • ポッドはポート8080を開きます

6.3. バックエンドアプリのデプロイ

これで展開をトリガーできます。

$> kubectl create -f backend-deployment.yaml

展開が成功したことを確認しましょう。

$> kubectl get deployments

出力は次のようになります。

NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
demo-backend   3         3         3            3           25s

サービスが利用可能かどうかも確認できます。

$> kubectl get services

出力は次のようになります。

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
demo-backend    ClusterIP   10.102.17.114           8080/TCP         30s

ご覧のとおり、サービスのタイプはClusterIPであり、セクション5の前の例とは異なり、30000〜32767の範囲の外部ポートを提供していません。

6.4. フロントエンドアプリのデプロイとサービス定義

その後、フロントエンドのサービスと展開を定義できます。

kind: Service
apiVersion: v1
metadata:
  name: demo-frontend
spec:
  selector:
    app: demo-frontend
  ports:
  - protocol: TCP
    port: 8081
    nodePort: 30001
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-frontend
spec:
  selector:
      matchLabels:
        app: demo-frontend
  replicas: 3
  template:
    metadata:
      labels:
        app: demo-frontend
    spec:
      containers:
        - name: demo-frontend
          image: demo-frontend:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8081

フロントエンドとバックエンドはほぼ同じです。the only difference between backend and frontend is the spec of the Service

フロントエンドの場合、タイプをNodePort として定義します(フロントエンドをクラスターの外部で使用できるようにするため)。 バックエンドはクラスタ内からのみ到達可能である必要があるため、typeClusterIPでした。

前に述べたように、nodePortフィールドを使用して、NodePortも手動で指定します。

6.5. フロントエンドアプリの導入

これで、同じ方法でこの展開をトリガーできます。

$> kubectl create -f frontend-deployment.yaml

展開が成功し、サービスが利用可能であることをすばやく確認しましょう。

$> kubectl get deployments
$> kubectl get services

その後、最終的にフロントエンドアプリケーションのRESTエンドポイントを呼び出すことができます。

$> minikube service demo-frontend

このコマンドは再びデフォルトのブラウザを起動し、<NodeIP>:<NodePort>を開きます。これはこの例ではhttp://192.168.99.100:30001です。

6.6. サービスとデプロイメントのクリーンアップ

最終的に、サービスとデプロイメントを削除することでクリーンアップできます。

$> kubectl delete service demo-frontend
$> kubectl delete deployment demo-frontend
$> kubectl delete service demo-backend
$> kubectl delete deployment demo-backend

7. 結論

この記事では、Minikubeを使用してローカルのKubernetesクラスターにSpring Bootの "Hello world"アプリを展開する方法について簡単に説明しました。

次の方法について詳しく説明しました。

  • ローカルマシンにMinikubeをインストールする

  • 2つのSpring Bootアプリで構成される例を開発および構築する

  • kubectlを指定した命令コマンドと構成ファイルを使用して、サービスを1ノードクラスターにデプロイします

いつものように、例の完全なソースコードはover on GitHubで入手できます。