MinikubeでSpringBootアプリケーションを実行する
1. 概要
この前の記事では、Kubernetesに関する理論的な紹介を取り上げました。
このチュートリアルでは、ローカルのKubernetes環境(Minikubeとも呼ばれます)にSpringBootアプリケーションをデプロイする方法について説明します。
この記事の一部として、次のことを行います。
- Minikubeをローカルマシンにインストールします
- 2つのSpringBootサービスで構成されるサンプルアプリケーションを開発する
- Minikubeを使用して1ノードクラスターでアプリケーションをセットアップします
- 構成ファイルを使用してアプリケーションをデプロイします
2. Minikubeのインストール
Minikubeのインストールは、基本的に3つのステップで構成されます。ハイパーバイザー(VirtualBoxなど)、CLI kubectl 、およびMinikube自体のインストールです。
公式ドキュメントには、各手順とすべての一般的なオペレーティングシステムの詳細な手順が記載されています。
インストールが完了したら、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. デモアプリケーション
これでクラスターが実行され、デプロイの準備ができたので、デモアプリケーションが必要です。
この目的のために、フロントエンドとバックエンドと呼ばれる2つのSpring Bootサービスで構成される単純な「Helloworld」アプリケーションを作成します。
バックエンドはポート8080に1つのRESTエンドポイントを提供し、そのホスト名を含むStringを返します。 フロントエンドはポート8081で使用可能であり、バックエンドエンドポイントを呼び出してその応答を返すだけです。
その後、各アプリからDockerイメージを構築する必要があります。 そのために必要なすべてのファイルは、GitHubでも利用できます。
Dockerイメージを構築する方法の詳細については、 SpringBootApplicationのDockerizingを参照してください。
ここで、MinikubeクラスターのDockerホストでビルドプロセスをトリガーすることを確認する必要があります。そうしないと、Minikubeは後でデプロイ中にイメージを見つけることができません。 さらに、ホスト上のワークスペースをMinikubeVMにマウントする必要があります。
$> 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
ご覧のとおり、
–port を使用して、Deploymentがポッド用にポート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
アプリケーションログを確認する場合は、最初にポッドIDが必要です。
$> kubectl get pods
$> kubectl logs <pod id>
5.3. 展開用のサービスの作成
バックエンドアプリのRESTエンドポイントを利用できるようにするには、サービスを作成する必要があります。
$> kubectl expose deployment demo-backend --type=NodePort
–type = NodePort は、クラスターの外部からサービスを利用できるようにします。 それはで利用可能になります
公開コマンドを使用するため、 NodePort はクラスターによって自動的に設定されます(これは技術的な制限です)。デフォルトの範囲は30000〜32767です。 次のセクションで説明するように、選択したポートを取得するには、構成ファイルを使用できます。
サービスが正常に作成されたことを確認できます。
$> kubectl get services
出力は次のようになります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-backend NodePort 10.106.11.133 <none> 8080:30117/TCP 11m
ご覧のとおり、demo-backendというタイプのNodePortというサービスが1つあります。これは、クラスター内部IP10.106.11.133で使用できます。
PORT(S)列を詳しく調べる必要があります。Deploymentでポート8080が定義されているため、サービスはトラフィックをこのポートに転送します。 ただし、ブラウザからデモバックエンドを呼び出す場合は、クラスタの外部から到達可能なポート30117を使用する必要があります。
5.4. サービスの呼び出し
これで、バックエンドサービスを初めて呼び出すことができます。
$> minikube service demo-backend
このコマンドはデフォルトのブラウザを起動し、
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 )を選択するだけです。
replysフィールドで示す3つの複製ポッドが必要です。
テンプレートフィールドは、実際のポッドを定義します。
- ポッドにはapp:demo-backendというラベルが付いています
- template:spec フィールドは、各Podレプリケーションがバージョン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 <none> 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
フロントエンドとバックエンドはほぼ同じです。バックエンドとフロントエンドの唯一の違いは、サービスの仕様です。
フロントエンドの場合、タイプを NodePort として定義します(フロントエンドをクラスターの外部で使用できるようにするため)。 バックエンドはクラスター内からのみ到達可能である必要があるため、typeはClusterIPでした。
前述のように、 nodePort フィールドを使用して、NodePortも手動で指定します。
6.5. フロントエンドアプリの導入
これで、同じ方法でこの展開をトリガーできます。
$> kubectl create -f frontend-deployment.yaml
展開が成功し、サービスが利用可能であることをすばやく確認しましょう。
$> kubectl get deployments
$> kubectl get services
その後、最終的にフロントエンドアプリケーションのRESTエンドポイントを呼び出すことができます。
$> minikube service demo-frontend
このコマンドは、デフォルトのブラウザを再び起動し、開きます
6.6. サービスと展開のクリーンアップ
最後に、サービスとデプロイメントを削除することでクリーンアップできます。
$> kubectl delete service demo-frontend
$> kubectl delete deployment demo-frontend
$> kubectl delete service demo-backend
$> kubectl delete deployment demo-backend
7. 結論
この記事では、Minikubeを使用してSpringBootの「Helloworld」アプリをローカルのKubernetesクラスターにデプロイする方法について簡単に説明しました。
次の方法について詳しく説明しました。
- Minikubeをローカルマシンにインストールします
- 2つのSpringBootアプリで構成される例を開発および構築します
- kubectl での命令コマンドと構成ファイルを使用して、サービスを1ノードクラスターにデプロイします
いつものように、例の完全なソースコードは、GitHubでから入手できます。