1. ツールのインストール
Java + Spring Boot を使ってMicroservice開発について調査を始める。
自分に必要なコマンドをインストール。
ついでに、あまり馴染みのないツールについては、少し調査。
brew tap spring-io/tap
brew install spring-boot
brew tap homebrew/cask-versions
brew install --cask microsoft-openjdk
brew install --cask docker
brew install jq
brew install helm
brew install siege
1-1. Spring boot を追加
brew tap spring-io/tap
brew install spring-boot
1-1-1. brew tap
「tap」は、追加のbrewパッケージを提供するソースリポジトリ。
brew tap <リポジトリオーナー>/<リポジトリ名>
- リポジトリオーナー:githubの所有者名
- リポジトリ名:所有者が管理するリポジトリ名
「spring-io」というgithubアカウントの「tap」というリポジトリをbrewに追加し、brew経由でSpring関連パッケージを管理できるようにする。
1-1-2. brew tapの利点
- 公式に含まれないパッケージの利用
- 異なるバージョン(過去バージョンなど)のインストール
1-1-3. tapの削除
brew untap <リポジトリオーナー>/<リポジトリ名>
1-2. Microsoft Open JDKの追加
自分はこれを使っている。
どれでもいいけど、Azure勉強しているので、同じベンダーであるMicrosoftさんのJDKを使わせてもらう。
brew tap homebrew/cask-versions
brew install --cask microsoft-openjdk
1-2-1. homebrew/cask-versionsという追加パッケージ
homebrewの追加パッケージで、GUIアプリケーションや大きいパッケージ(pkg or dmg)をインストールするためのもの。
1-3. jsonデータの加工ツールの追加
「jq」はREST APIをデバッグするなどで重宝するので入れておいた方がよい。
brew install jq
1-3-1. jqの便利な使い方集
- jsonの整形
未整形のJSONを見やすい形式で出力する。
sato@[12:07:46]:~% echo '{"name":"John","age":30,"city":"New York"}' | jq
{
"name": "John",
"age": 30,
"city": "New York"
}
- 特定キー値の抽出
name
フィールドの値だけを取り出す。
sato@[12:10:43]:~% echo '{"name":"John","age":30,"city":"New York"}' | jq '.name'
"John"
- データのフィルター
配列データの中で条件を満たす要素だけを抽出。
sato@[12:11:58]:~% echo '[{"name":"John","age":30},{"name":"Jane","age":25}]' | jq '.[] | select(.age == 30)'
{
"name": "John",
"age": 30
}
- jsonの変更
たとえばjsonのcity
という項目の値を変更。
sato@[12:13:21]:~% echo '{"name":"John","age":30,"city":"New York"}' | jq '.city = "Los Angeles"'
{
"name": "John",
"age": 30,
"city": "Los Angeles"
}
1-3-2. jqの利用シーン
- APIのレスポンス解析: REST APIからのJSONレスポンスを加工・フィルタリング
- データ変換: 大量のJSONデータから特定のキーを抽出したり、他のフォーマットに変換
- ログやデバッグの補助: JSON形式のログ解析時、特定フィールドのみを確認
1-4. K8Sパッケージマネージャーのインストール
helmについて簡単に整理。
1-4-1. Helmとは
- Kubernetes(K8s)でアプリケーションを管理するための **パッケージマネージャで、**Kubernetes上で複雑なアプリケーションのデプロイや管理を簡単にする
- アプリケーションを チャート(Chart) というパッケージ形式で管理、チャートには、Kubernetesのリソース(Pod、Service、Ingressなど)のテンプレートが含まれており、アプリケーションの構成情報や依存関係が記述されている
- アプリケーションのインストール、アップグレード、ロールバック、削除などの操作が一貫して行えるため、Kubernetes上でのアプリケーション管理が簡単になる
1-4-2. Helmの主な機能
- K8Sへのアプリケーションデプロイの簡素化
- バージョン管理(アップグレード、ロールバック)
- 再利用性(Helmチャートにより再利用可能パッケージ)
Helmの主要コマンド例
- helm install
指定チャートを使ってK8Sクラスタにアプリケーションをデプロイ - helm upgrade
既存アプリケーションをアップグレード - helm rollback
アプリケーションを以前のバージョンにロールバック
1-4-3. helmを利用するメリット
- 複雑なアプリケーションデプロイの自動化
チャートを使うことで、複雑なアプリケーションの設定や依存関係を管理した状態でデプロイを自動化 - アップグレードとロールバックを管理
- マイクロサービスの管理
- helmチャートの再利用
1-5. コマンドラインベースのWEB負荷テストツールのインストール
多分使うのだろうから、これは入れておく。
brew install siege
1-5-1. Siegeとは
HTTPサーバーへの負荷テストを行うためのコマンドラインツール。ウェブアプリケーションのパフォーマンスを評価し、特定のURLに対して同時にリクエストを送信してサーバーの応答時間やパフォーマンスを測定できる。
1-5-2. Siegeの主な機能
- 同時リクエストをシミュレート
高負荷状態のサーバー動作を検証可能。 - シナリオ設定
URLリストやクエリパラメータを設定することで、様々なシナリオを定義可能 - 結果の分析
リクエストの成功率、応答時間、スループットの分析情報を確認できる
1-5-3. Siegeの主な利用例
同時アクセス数10、5回のリクエストを実行する。
siege -c 10 -r 5 http://example.com
1-5-4. MacOSへのインストール時に表示される留意事項
インストール時に以下のメッセージが表示される。
macOS has only 16K ports available that won't be released until socket
TIME_WAIT is passed. The default timeout for TIME_WAIT is 15 seconds.
Consider reducing in case of available port bottleneck.
You can check whether this is a problem with netstat:
# sysctl net.inet.tcp.msl
net.inet.tcp.msl: 15000
# sudo sysctl -w net.inet.tcp.msl=1000
net.inet.tcp.msl: 15000 -> 1000
Run siege.config to create the ~/.siegerc config file.
1-5-5. Siege利用時の制限
- 利用可能なポート数に制限がある
macOSでは、同時に利用できるポートが16kに限定される。
- TIME_WAITによるポート再利用までの待機時間ある
一度TCP接続に利用さたポートは、TCP切断後、「TIME-WAIT」(デフォルトで15秒)が経過するまで解放されず再利用できない
このため、siegeで大量の同時アクセスを行うと、ポートが枯渇する可能性がある。
1-5-6. Siege利用制限への対応方法
- TCP MSL (Maximum Segment Lifetime)の変更
TIME_WAITはMSLに設定されているので、これを変更することで制限を緩和できる。
# 現在のMSLを確認
sysctl net.inet.tcp.msl
# MSLを変更
sudo sysctl -w net.inet.tcp.msl=1000
1-6. Dockerデスクトップのインストール
DockerデスクトップはGUIも含めて大きなパッケージ。caskオプションでバイナリーを直接インストールする。
brew install --cask docker
1-7. k8sのコマンドラインツール「kubernetes-cli」(kubectl)のインストール
k8sクラスタを管理するためのコマンドラインツール。
brew install kubernetes-cli
1-7-1. kubectlの主な機能
- リソース管理
k8sクラスタ上のポッド、サービス、デプロイメントなどのリソースの作成、削除、更新、確認を行う。
kubectl get pods # ポッド情報の取得
kubectl create -f deployment.yaml # デプロイメントの作成
kubectl delete pod my-pod # ポッドの削除
- クラスタ情報の取得
クラスタの状態、各リソースの状態を確認。
kubectl cluster-info # クラスタ情報の取得
kubectl get nodes # ノード情報の取得
- デバッグ・監視
ログ確認、リソースのイベント監視、ポッドへの接続
kubectl logs <pod-name> # ポッドのログ確認
kubectl exec -it <pod-name> -- /bin/bash # ポッドに接続してbashを実行
1-8. マイクロサービスのサービスメッシュレイヤーを実現するistioのコマンドラインツール「istioctl」をインストール
brew install istioctl
1-8-1. istioとは
マイクロサービス間の通信を効率的かつ安全に行うための技術として「サービスメッシュ」レイヤーがある。istioはサービスメッシュレイヤーを担う代表的なツール。
1-8-2. サービスメッシュレイヤーの主な機能
- サービス間トラフィック管理
ルーティングや負荷分散、障害時のリトライなどを管理する。1つのサービスをロールアウトして新バージョンに徐々に移行するカナリアリリース、1つのサービスの旧バージョンと新バージョンに対してトラフィックを分散するブルー・グリーンデプロイが可能。 - サービス間通信セキュリティ
サービス間の通信をTLSを使用して通信したり、サービス間で認証・認可の機能を提供する。 - 各サービスの観測
サービス間の通信状況、パフォーマンスメトリクス(遅延、スループット、エラー率など)を監視。 - フォールトトレランス
1つのサービスが一時的に遅延している場合にサーキットブレイカーを使用してそのサービスへのリクエストを一時的に停止し、回復後に再開するなどの制御が可能。
1-8-3. istioの構成
2つのプレーンで構成される。
- データプレーン
各サービスに配置するサイドカー(Envoyプロキシ)を通してサービス間のすべての通信を管理する。istioはサイドカーをすべてのサービスに自動的に追加、各サービス間の通信はすべてこのサイドカーを通して行われる。 - コントロールプレーン
サービスメッシュレイヤー全体の設定やポリシー(トラフィックルールやセキュリティポリシー)を一元管理する。
1-9. ローカル環境で実行できる小さなk8s環境「minikube」をインストール
brew install minikube
1-9-1. minikubeとは
ローカル環境でk8s向けアプリのクラスタのセットアップやテストが実行できる。通常K8sは複数のノード(クラスタ)で構成されるが、Minikubeにより1台のコンテナで軽量なk8sのシングルノードのクラスタを実行できる。
Docker や VirtualBoxが必要だが、今回はDockerを利用。
1-9-2. minikubeの主な機能
- ローカルk8s環境の提供
DockerやVirtualBoxを使ってローカルPC上で簡易なk8sアプリの開発、デバッグ、テストが実行可能。 - k8s用アプリのローカルテスト
クラウド上の環境にデプロイする前に、minikubeを使ってk8s対応アプリの動作確認が可能。 - k8sと同等の管理機能
k8sと同じようにkubectlでアプリケーションのデプロイやクラスタ管理が可能。