K8s、EKSを支えるツール群
はじめに
K8s、EKSはマイクロサービス開発において欠かせない技術です。
しかし、その運用はECSや単体でDockerを利用している時より難易度が上がります。
本稿では、k8s、EKSの運用を支援するためのツールに焦点を当てて紹介していきます。
ここで扱うのは、現場で名前がよく挙がる代表的なツールたちです。
「どのレイヤーを担当しているか」「どんな場面で使うか」を中心に整理していきます。
全体像:EKSを支える4つのレイヤー
まず、EKSまわりのツールを次の4つに分けて考えます。
クラスタをつくるレイヤー
アプリを載せるレイヤー
クラスタを守るレイヤー
クラスタを見張るレイヤー
全体の流れを1枚にするとこうなります。
```mermaid
flowchart LR
Dev[開発者] --> Git[Gitリポジトリ]
Git --> CI[CIパイプライン]
CI --> Image[コンテナイメージ]
Image --> ECR[ECR]
ECR --> GitOps[Argo CD / Flux]
GitOps --> EKS[EKSクラスタ]
```左側がアプリ開発の世界、右側がEKSクラスタの世界です。
この間を、IaC、Helm、GitOps、監視系のツールが支えていきます。
クラスタをつくるツール群
EKSを使うには、VPC、サブネット、クラスタ、ノードグループといった土台を先に準備します。
ここを自動化するのが「クラスタをつくる」レイヤーです。
eksctl
eksctlは、EKS専用のCLIツールです。
YAMLファイルとコマンドだけで、EKSクラスタとノードグループをまとめて作成できます。
特徴は次の通りです。
シンプルなYAMLでクラスタ定義を書ける
内部でCloudFormationを使うため、AWSアカウント側の変更履歴も追いやすい
小さめの検証環境を素早く立ち上げる用途と相性が良い
個人検証やPoCでは、まずeksctlで始め、その後TerraformやCDKに寄せる構成もよくあります。
Terraform
Terraformは、HCLという独自言語でインフラを定義するIaCツールです。
AWSだけでなく、他クラウドやSaaSも含めて一括管理する用途で選ばれることが多いです。
EKSまわりでTerraformを使うときのポイントは次の通りです。
VPC、EKSクラスタ、ノードグループを一式コード化できる
dev / stg / prod を同じコードベースで再現しやすい
Pull Requestベースでインフラ変更をレビューしやすい
EKS用のモジュールも整備されており、細かいリソースを1つ1つ書かずに、入力パラメータ中心で組み立てられます。
CloudFormation / CDK
CloudFormationはAWS純正のテンプレート型IaC、CDKはプログラミング言語でCloudFormationを生成するツールです。
EKSを含むAWSリソース一式を、AWS標準スタックで揃えたいケースで選ばれます。
既にCloudFormation中心で運用している組織
開発者がTypeScriptやPythonでテンプレートを書きたい組織
こういった前提がある場合、CDKでEKSスタックを構成し、その上に後述のツールを重ねていく形になります。
アプリを載せるツール群
クラスタが用意できたら、アプリケーションとアドオンをどう載せるかが課題になります。
kubectl
kubectlはKubernetes標準のCLIです。
マニフェストのapply
PodやServiceの状態確認
ログの取得やポートフォワード
といった基本操作を一通り担います。
本番環境での恒常的なデプロイ手段にするというより、デバッグやスポット対応用のツールという位置づけで捉えた方が整います。
Helm
Helmは「Kubernetes向けパッケージマネージャ」と呼ばれるツールです。
Chartと呼ばれる単位で、Deployment、Service、ConfigMapなどをまとめて管理します。
共通部分をテンプレート化し、環境ごとの差分は values.yaml に寄せる
IngressコントローラやPrometheusスタックなど、複数リソースで構成されるアドオンを1つのChartとして扱う
Chartのバージョンを上げるだけで、アプリのリリースを表現する
こういった運用がしやすくなります。
EKSアドオンの多くはHelmチャートとして配布されているため、Helmを押さえておくと選択肢が広がります。
Argo CD
Argo CDは、Kubernetes上で動作するGitOpsツールです。
Gitリポジトリを「望ましい状態」とみなし、クラスタとの同期を自動で行います。
特徴を整理すると次のようになります。
Gitリポジトリごとに「Application」という単位で管理する
HelmチャートやKustomizeにも対応している
UIから差分表示やロールバック操作ができる
「Gitにマニフェストを書いた時点でデプロイ完了」という運用を作りたい場合、Argo CDが分かりやすい選択肢になります。
Flux
FluxもGitOpsツールです。
Argo CDと同様に、Gitをソースとし、クラスタと同期します。
Fluxならではの特徴として、次のような点があります。
KubernetesのCRDとして構成されており、ツール本体の設定もYAMLで扱いやすい
アプリだけでなく、クラスタ内のインフラ定義もまとめて管理しやすい
UIを重視するならArgo CD、Kubernetesリソースとしての一体感を重視するならFlux、というような分け方もあります。
GitOpsの流れをシーケンス図で整理します。
```mermaid
sequenceDiagram
participant Dev as 開発者
participant Git as Git
participant CI as CI
participant ECR as ECR
participant GitOps as Argo CD / Flux
participant EKS as EKS
Dev->>Git: コードとマニフェストをpush
Git->>CI: Webhookで通知
CI->>ECR: コンテナイメージをpush
CI->>Git: マニフェストのイメージタグを更新
GitOps->>Git: 変更されたマニフェストを取得
GitOps->>EKS: 差分を反映してデプロイ
```CIはイメージのビルドとテスト、GitOpsツールは状態同期、という分担になります。
クラスタを守るツール群
EKS運用では、「誰がどこに何をデプロイできるか」「どのPodがどの外部リソースに触れるか」をきちんと決めておく必要があります。
IAM と IRSA
EKSでは、IAMロールとKubernetesのサービスアカウントを紐付けるIRSA(IAM Roles for Service Accounts)が使えます。
マイクロサービス単位で専用のIAMロールを用意する
各サービスアカウントに対応するロールを割り当てる
Podは自分のサービスアカウント経由でAWSリソースにアクセスする
こういった構成にすることで、「誰がどのAWSリソースにアクセスできるか」を細かく制御しやすくなります。
Kyverno
Kyvernoは、Kubernetesネイティブなポリシーエンジンです。
ポリシー自体をYAMLで定義し、Admissionのタイミングでマニフェストを検証したり、書き換えたりします。
よく使われるパターンは次のようなものです。
特定の名前空間では指定のラベルを必須にする
root権限で動くコンテナや特定の特権設定を拒否する
監査用のアノテーションやサイドカーコンテナを自動付与する
ポリシーもGitで管理できるため、「セキュリティ要件をコードとして扱う」運用と相性が良いです。
External Secrets Operator
External Secrets Operatorは、外部シークレットストアとKubernetes Secretを橋渡しするオペレータです。
AWS Secrets ManagerやSSM Parameter Storeなどに機密情報を保存
Kubernetes側では「どのSecretをどこに同期するか」だけを設定
ESOが定期的に外部ストアから値を取得し、Secretリソースを更新
アプリ側は通常のSecret参照と同じ書き方で済むため、実装の複雑さを増やさずに安全性を高めやすくなります。
クラスタを見張るツール群
最後は、稼働中のクラスタを監視するレイヤーです。
メトリクス、ログ、トレースの3つを意識して構成を考えます。
Prometheus
Prometheusは、時系列メトリクスの収集と保管を行うツールです。
Kubernetesクラスターとの相性が良く、PodのCPU/メモリ、リクエスト数、エラーレートなどを一括で集約できます。
Exporterを通じてKubernetesやアプリからメトリクスを取得
PromQLで集計し、アラートルールを定義
Grafanaのデータソースとして利用
EKSでは、Prometheus OperatorやマネージドPrometheusを使う構成がよく採用されています。
Grafana
Grafanaは、各種データソースからメトリクスを取得してダッシュボードを作るツールです。
クラスタ全体の状態を見るダッシュボード
名前空間ごとのリソース使用量を見るダッシュボード
マイクロサービスごとのレイテンシとエラーレートをまとめたダッシュボード
こういった画面を作り、開発チームと共有することで、性能や障害の議論がしやすくなります。
CloudWatch Container Insights と Fluent Bit
AWS寄りの構成では、CloudWatch Container InsightsとFluent Bitの組み合わせもよく使われます。
Container Insightsでクラスタ・ノード・Podなどのメトリクスを収集
Fluent BitをDaemonSetとして各ノードに配置し、コンテナログをCloudWatch Logsへ転送
ログの流れを図にすると次のようになります。
```mermaid
flowchart LR
Pod[アプリケーションPod] --> FB[Fluent Bit DaemonSet]
FB --> CWL[CloudWatch Logs]
CWL --> Dash[CloudWatchまたはGrafanaのダッシュボード]
```Prometheus+Grafanaでアプリ寄りのメトリクスを、Container Insights+CloudWatch Logsでインフラ寄りのメトリクスとログを、というように棲み分ける構成も扱いやすいです。
小さなチーム向けのツール構成例
最後に、3〜5人ほどの開発チームでEKSを運用する場合のひとつの組み合わせ例をまとめます。
クラスタ構築
TerraformでVPCとEKSクラスタ、マネージドノードグループを定義
初期検証ではeksctlも併用し、最終的な構成をTerraformに落とし込む
アプリ配布
アプリとアドオンをHelmチャート化
GitHub Actionsでイメージビルドとテスト
Argo CDでGitリポジトリからEKSへ自動同期
セキュリティ・ガバナンス
IRSAでサービス単位のIAMロールを割り当て
KyvernoでPodセキュリティとネームスペースごとの制約を定義
External Secrets OperatorでSecrets Managerと連携
監視・ログ
Prometheus+Grafanaでアプリとクラスタのメトリクスを可視化
CloudWatch Container InsightsとFluent Bitでログとインフラメトリクスを集約
まずはこのあたりから構成を始めて、チームのスキルやサービスの規模に合わせて少しずつ拡張していく形が扱いやすいと感じます。
参考ページ
詳しく深掘りしたいときの入り口として、主な公式情報やドキュメントを挙げておきます。
URLは省略し、名称のみ記載します。
Amazon EKS 公式ドキュメント
eksctl User Guide / GitHub リポジトリ
Terraform AWS Provider / EKS関連モジュールドキュメント
AWS CloudFormation / AWS CDK 公式ドキュメント
Helm 公式ドキュメント
Argo CD 公式ドキュメント
Flux 公式ドキュメント
Kyverno 公式ドキュメント / サンプルポリシー集
Prometheus 公式ドキュメント
Grafana 公式ドキュメント
Amazon CloudWatch Container Insights ドキュメント
Fluent Bit 公式ドキュメント
External Secrets Operator 公式ドキュメント
チートシート:ツール別の役割早見表
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?
