AWS EKS Kubernetesクラスター管理
Amazon Elastic Kubernetes Service (EKS)は、AWSクラウドでKubernetesを実行するためのマネージドサービスです。Kubernetesのコントロールプレーンを自動管理することで、運用負荷を軽減し、アプリケーション開発に集中できる環境を提供します。
この記事では、EKSの基本概念とクラスター構築の流れ、基本的な運用方法について説明します。
EKSの基本概念
EKSアーキテクチャ
EKSクラスターは大きく分けて2つの部分で構成されています。以下の図で全体像を把握しましょう。
コントロールプレーン(AWSマネージド)
AWSが完全に管理する部分で、以下のコンポーネントが含まれます:
- Kubernetes API Server: クラスター操作の中心となるAPI
- etcd データストア: クラスター状態を保存する分散データベース
- スケジューラー: Podをどのノードで実行するかを決定
- コントローラーマネージャー: クラスターの状態を監視し、必要に応じて調整
AWSがこれらのコンポーネントを完全に管理するため、パッチ適用、高可用性の設定、バックアップが自動化されています。
ワーカーノード(お客様管理)
アプリケーションのPodが実際に動作する部分で、3つの選択肢があります:
1. EKS Managed Node Groups(推奨)
- AWSが提供するマネージドなEC2インスタンス群
- ノードの起動、終了、アップデートをAWSが自動化
- Auto Scalingグループと連携した自動スケーリング
2. セルフマネージドノード
- お客様が直接管理するEC2インスタンス
- より細かい制御が可能だが、運用負荷が高い
- 特殊な要件がある場合に選択
3. AWS Fargate(サーバーレス)
- サーバーレスでコンテナを実行
- インスタンス管理が不要
- ただし、以下の制限があります:
- DaemonSetは使用不可
- 特権コンテナは使用不可
- GPUワークロードは非対応
- パブリックサブネットでは実行不可
- EBSボリュームのマウント不可
EKSクラスターの作成
AWS Console を使用した基本的な作成手順
IAMロールの準備
- EKSサービス用のIAMロールを作成
- AmazonEKSClusterPolicy を付与
VPCとサブネットの設定
- パブリック・プライベートサブネットを設定
- 複数アベイラビリティゾーンに配置
EKSクラスターの作成 Console の EKS サービスから「クラスターの作成」
- クラスター名、Kubernetesバージョンを指定
- 現在の推奨バージョン:1.31-1.33(標準サポート)
- 1.28-1.30は拡張サポート(追加料金あり)
- 先ほど作成したIAMロールとVPCを選択
- クラスター名、Kubernetesバージョンを指定
ワーカーノードの追加
- Managed Node Groups を使用(推奨)
- インスタンスタイプとスケーリング設定を指定
AWS CLI を使用した作成
AWS CLI でも EKS クラスターを作成できます。
# EKSクラスター作成(最新の推奨バージョンを使用)
aws eks create-cluster \
--name my-cluster \
--version 1.31 \
--role-arn arn:aws:iam::ACCOUNT:role/eks-service-role \
--resources-vpc-config subnetIds=subnet-12345,subnet-67890
# 作成状況確認
aws eks describe-cluster --name my-cluster --query cluster.status
EKS での基本的なワークロード管理
kubectl の設定
EKS クラスターが作成されたら、kubectl コマンドでクラスターにアクセスできます。
# kubeconfig の更新
aws eks update-kubeconfig --region us-west-2 --name my-cluster
# クラスター接続確認
kubectl get nodes
簡単なアプリケーションのデプロイ
サンプルアプリケーションをデプロイしてみます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
spec:
replicas: 2
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: app
image: nginx:1.20
ports:
- containerPort: 80
Helm を使用したパッケージ管理
Helm は Kubernetes のパッケージマネージャーで、複雑なアプリケーションの管理を簡素化します。
# Helmのインストール確認
helm version
# Helmチャートリポジトリの追加(推奨リポジトリを使用)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# サンプルアプリケーションのデプロイ
helm install my-wordpress bitnami/wordpress
EKSのセキュリティ機能
IAMとRBACの統合
EKSでは AWS IAM と Kubernetes RBAC を一緒に使ってセキュリティを実現します。
主なセキュリティ機能
- IAMロールによるアクセス制御: AWSリソースへの細やかな権限管理
- Pod Security Standards: コンテナの実行制約を定義(非rootユーザー実行、特権モードの制限など)
- ネットワークポリシー: Pod間通信の制御とマイクロセグメンテーション
- 暗号化機能: etcdでのデータ暗号化、EBSボリューム暗号化、通信の暗号化
- セキュリティグループ: Pod単位でのネットワークアクセス制御
- イメージスキャン: ECRとの統合による脆弱性検出
基本的なRBAC設定
サービスアカウントとロールの簡単な例:
# 基本的なサービスアカウント
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
namespace: default
EKSのネットワーキング
VPC CNI Plugin
EKSでは、AWS VPC CNIプラグインがネットワーキングを担当します。これはEKSがサポートする唯一のCNIプラグインで、以下の特徴があります:
主な仕組み
- 各EC2ノードに複数のElastic Network Interface(ENI)を作成
- Pod一つ一つにVPCの実際のIPアドレスを直接割り当て
- PodがVPC内のリソースと直接通信可能
メリット
- VPCセキュリティグループやNetwork ACLがPodレベルで適用可能
- AWS Load BalancerやRDSなどとの直接通信
- ネットワークパフォーマンスの向上
注意点
- インスタンスタイプごとにENIとIPアドレス数の上限あり
- IPアドレス不足を避けるため、適切なCIDR設計が重要
Load Balancer 統合
Service タイプ
- LoadBalancer: AWS ELB/ALB/NLB と統合
- ClusterIP: クラスター内部通信のみ
- NodePort: ノードのポートで公開
AWS Load Balancer Controller
より簡単に ALB を作成できるコントローラーで、Ingress リソースで ALB を作成できます。
## EKSの監視とログ
### CloudWatch Container Insights
EKS クラスターのメトリクスとログを CloudWatch で監視できます。
取得可能なメトリクス
- クラスターレベル: CPU、メモリ使用率
- ノードレベル: リソース使用状況
- Podレベル: アプリケーションのパフォーマンス
### ログ管理
EKS では以下のログを収集できます:
- API サーバーログ
- 監査ログ
- 認証ログ
- コントローラーマネージャーログ
- スケジューラーログ
## EKSの主なメリット
### 運用が簡単になる
- コントロールプレーンの完全マネージド
- 自動パッチ適用とアップグレード
- 高可用性の自動保証
### AWSサービスとの統合
- IAM、VPC、ELBなどとシームレス統合
- CloudWatchでの統合モニタリング
- AWSセキュリティ機能の活用
### コスト最適化
- Managed Node Groups での効率的なスケーリング
- Fargate でのサーバーレス実行
- Spot Instance でのコスト削減
## まとめ
AWS EKS は Kubernetes クラスターの管理を簡素化し、企業レベルのコンテナプラットフォームを構築できます。コントロールプレーンの管理をAWSがやってくれるので、開発チームはアプリケーション開発に集中できますね。