MinikubeでSpring Bootアプリケーションを実行する
1概要
このリンクで/kubernetes[前の記事]では、Kubernetesについての理論的な紹介を取り上げました。
このチュートリアルでは、Spring BootアプリケーションをローカルのKubernetes環境(Minikubeとも呼ばれる)にデプロイする方法について説明します。
この記事の一部として、
-
私たちのローカルマシンにMinikubeをインストールしてください
-
2つのSpring Bootサービスからなるサンプルアプリケーションを開発する
-
ミニキューブを使用して1ノードクラスタでアプリケーションを設定する
-
設定ファイルを使ってアプリケーションをデプロイする
2ミニキューブをインストールする
Minikubeのインストールは基本的に3つのステップから成ります。
ハイパーバイザ(VirtualBoxなど)、CLI
kubectl
、およびMinikube自体をインストールする。
公式文書
には、各ステップの詳細な説明と、一般的なすべてのオペレーティングシステムの詳細な説明があります。
インストールが完了したら、Minikubeを起動し、VirtualBoxをHypervisorに設定し、
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サービスからなるシンプルな「Hello world」アプリケーションを作成します。これらのサービスを
frontend
と
backend
と呼びます。
バックエンドはポート8080で1つのRESTエンドポイントを提供し、そのホスト名を含む
String
を返します。フロントエンドはポート8081で利用可能です、それは単にバックエンドエンドポイントを呼び出し、その応答を返します。
その後、各アプリからDockerイメージを作成する必要があります。そのために必要なファイルはすべてhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-kubernetes[on GitHub]からも入手できます。
Dockerイメージを構築する方法の詳細な説明についてはリンクを見てください:/dockerizing-spring-boot-application#Dockerize[Dockerizing a Spring Bootアプリケーション]
-
MinikubeクラスタのDockerホスト上でビルドプロセスを起動することを確認する必要があります。さらに、ホスト上のワークスペースは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つのPodのみで構成される
demo-backend
アプリのDeploymentを作成します。それに基づいて、展開を確認し、ログを調べ、最後にクリーンアップできるように、いくつかのコマンドについて説明します。
5.1. 配置の作成
必要なすべてのコマンドを引数として渡して、
kubectl
を使用します。
$> kubectl run demo-backend --image=demo-backend:latest \
--port=8080 --image-pull-policy Never
ご覧のとおり、
demo-backendという名前のDeploymentを作成します。これは
demo-backend
という名前のイメージからバージョン
latest__でインスタンス化されています。
-port
を使用して、DeploymentがそのPod用にポート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 <pod id>
5.3. 展開用サービスの作成
バックエンドアプリケーションのRESTエンドポイントを利用可能にするには、サービスを作成する必要があります。
$> kubectl expose deployment demo-backend --type=NodePort
– type = NodePort
は、サービスをクラスターの外側から利用できるようにします。それは
<NodeIP>で利用可能になるでしょう:<NodePort>
、すなわち。 e。サービスは、
<NodePort>
で着信するすべての要求を、割り当てられたPodのポート8080にマッピングします。
exposeコマンドを使用するので、
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
ご覧のとおり、
NodePort
タイプの
demo-backend
という名前の1つのサービスがあります。これは、クラスタ内部のIP 10.106.11.133で利用できます。
ポート8080が展開で定義されているので、サービスはこのポートにトラフィックを転送します。
ただし、ブラウザから
__ demo-backend
__を呼び出したい場合は、クラスタの外部からアクセスできるポート30117を使用する必要があります。
5.4. サービスを呼び出す
これで、バックエンドサービスを初めて呼び出すことができます。
$> minikube service demo-backend
このコマンドは、デフォルトのブラウザを起動し、
<NodeIP>:<NodePort>を開きます。この例では、
http://192.168.99.100:30117__になります。
5.5. サービスと展開のクリーンアップ
その後、Service and Deploymentを削除できます。
$> 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によって示される
demo-backend
という名前の
Service__を作成します。
name__フィールド
それは
app = demo-backend
ラベルを持つ任意のPodの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がどのPodを管理するのかを定義する方法を定義します。この場合は、Podテンプレートで定義されている1つのラベル(
app:demo-backend
)を選択するだけです。
私たちは
replicas
フィールドで示す3つの複製されたPodを持ちたいです。
テンプレートフィールドは実際のポッドを定義します。
-
ポッドは
app:demo-backend
としてラベル付けされています -
template:spec
フィールドは、各Podレプリケーションが実行されていることを示します。
1つのコンテナ、
demo-backend
、バージョン
latest
** Podsオープンポート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
ご覧のとおり、Serviceは
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
このコマンドは再び
<NodeIP>:<NodePort>
を開くデフォルトのブラウザを起動します。
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アプリからなる例を開発して構築する
-
命令型コマンドを使用して、1ノードクラスタにサービスをデプロイする
kubectl
と設定ファイル
いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-kubernetes[GitHubで入手可能]です。