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

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

–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 は、クラスターの外部からサービスを利用できるようにします。 それはで利用可能になります 、 私。 e。 サービスは、で着信するすべての要求をマップします割り当てられたポッドのポート8080に。

公開コマンドを使用するため、 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

このコマンドはデフォルトのブラウザを起動し、 私たちの例では、それは 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 )を選択するだけです。

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

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

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

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

$> kubectl create -f frontend-deployment.yaml

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

$> kubectl get deployments
$> kubectl get services

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

$> minikube service demo-frontend

このコマンドは、デフォルトのブラウザを再び起動し、開きます 、これは 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を使用してSpringBootの「Helloworld」アプリをローカルのKubernetesクラスターにデプロイする方法について簡単に説明しました。

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

  • Minikubeをローカルマシンにインストールします
  • 2つのSpringBootアプリで構成される例を開発および構築します
  • kubectl での命令コマンドと構成ファイルを使用して、サービスを1ノードクラスターにデプロイします

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