
【VPC内リージョンサービス】
EKS(Elastic Kubernetes Service)は、AWSが提供するマネージド型のKubernetes(クバネティス)サービスです。
コントロールプレーンはAWSによって運用・管理され、ユーザーはデータプレーンとして EC2(Elastic Compute Cloud)または Fargate を利用する起動タイプを選択できます。
EKSのクラスタは、AWSが提供する高可用なコントロールプレーンと、ユーザーが管理するワーカーノードで構成されます。ノードは ノードグループ(EC2ベース) または Fargate Profile(サーバーレスベース)として構築でき、用途や負荷に応じて柔軟に運用できます。
コンテナは Pod(ポッド)単位で実行され、VPC CNI(Container Network Interface) によって各PodにVPC内のIPアドレスが直接割り当てられます。アプリケーション公開には ALB(Application Load Balancer)/NLB(Network Load Balancer) Ingress を利用し、HTTP/HTTPSやTCPトラフィックを効率的にルーティングします。
EBS(Elastic Block Store) や EFS(Elastic File System)を利用した永続ストレージは CSI(Container Storage Interface) を通じてPodにアタッチされます。
スケーリング機能としては、ノード数を自動調整する Cluster Autoscaler(クラスターオートスケーラー)、Pod数を動的に増減する HPA(Horizontal Pod Autoscaler)、リソース割り当てを最適化する VPA(Vertical Pod Autoscaler) をサポートしています。
セキュリティ面では、IRSA(IAM Roles for Service Accounts) により、Pod単位でIAM(Identity and Access Management)ロールを割り当て、最小権限の原則に基づいたきめ細かなアクセス制御を実現します。
さらに、Observability(可観測性)を高めるため、CloudWatch や Prometheus(オープンソースのモニタリングツール)などと統合でき、メトリクス・ログ・トレースを通じてクラスター全体の状態を可視化できます。
Helm(ヘルム)よるアプリケーションデプロイや、App Mesh によるサービスメッシュ連携も可能で、マイクロサービス間通信の可視化やトラフィック制御を効率的に行うことができます。
重要用語
ユースケース
| Kubernetesベースのマイクロサービス基盤 | 既にKubernetesを利用しているチームが、EKS上に複数のマイクロサービスをデプロイし、クラスタ管理をAWSに任せつつ運用する。 |
| ハイブリッドKubernetes環境の一部として利用 | オンプレミスのKubernetesクラスターとEKSを組み合わせて、環境間でワークロードを移動させたり分散させるハイブリッド構成をとる。 |
| 機械学習・データ処理ワークロードのコンテナ実行 | 学習ジョブや分散データ処理ジョブをKubernetesジョブとしてEKS上で実行し、必要に応じてノード数を増減させる。 |
ベストプラクティス
| ノードIAMロールとIRSAの利用 | PodごとにIAMロールを割り当てて最小権限アクセスを実現する。 |
| セキュリティグループとネットワークポリシー | SGとKubernetes NetworkPolicyで多層防御のネットワーク制御を行う。 |
| オートスケーラの活用 | Cluster AutoscalerとHPAを組み合わせてリソース効率と可用性を最適化する。 |
高可用性・バックアップ・リトライ
| 高可用性・バックアップ・リトライ設計のポイント |
|---|
| 【コントロールプレーンのマルチAZ】 【デフォルト】マルチAZ(AWS 管理) |
| 【データプレーンのマルチAZ】 EC2(複数 AZ のサブネットにノードグループ(ASG)を配置し、ノードを分散させる) Fargate(プロファイルで複数 AZ のサブネットを指定しその範囲で Pod をスケジューリングさせる) |
| 【Pod の冗長化】 Replica 数を 2 以上に設定し、可能な限り別 AZ・別ノードに分散配置する |
| 【ノードのAuto Scaling】 Cluster Autoscaler / Karpenter によるノード数の自動増減 |
| 【Pod のAuto Scaling】 HPA:レプリカ数の自動調整 / VPA:CPU・メモリの自動調整 |
| 【自動リトライ】EKSのコントロールプレーン(AWSの冗長化機構) APIサーバのダウン時に、APIリクエストを自動リトライ etcdノード障害時、クラスタ状態の書き込みを自動リトライ マネージドノード障害時、APIサーバ、スケジューラ、コントローラなどが自動リトライ |
| 【自動リトライ】EKSのデータプレーン(Kubernetesの自己修復機能) Podが異常終了した場合、自動的に新しい Pod を別ノード上で再作成し自動リトライ ノード障害の場合Pod は自動で他ノードに再配置し自動リトライ Job/CronJob の失敗時、自動リトライ コンテナの死活監視を設定しておくと、Probeが失敗した時に Kubeletが自動リトライ |
セキュリティ
| 関連サービス | 設定内容 |
|---|---|
| Subnet(公開リソースと内部リソースの分離) | 【Webサーバ】 Privateの専用SubnetでマルチAZ構成 【バッチサーバ】 Privateの専用SubnetでマルチAZ構成 |
| SG(リソース単位のアクセス制御) | 【Webサーバ】 インバウンド:80(HTTP),443(HTTPS) アウトバウンド:すべて許可 【バッチサーバ】 インバウンド:空(すべて拒否) アウトバウンド:443(API通信、必要範囲のみ) |
| KMS(データの暗号化と鍵の安全管理) | - |
| Secrets Manager(機密情報の安全管理) | シークレット(秘密情報)の作成が推奨 Pod内で必要な認証情報 |
| SSM Parameter Store(設定情報の一元管理) | パラメータ(Parameter)の作成が推奨 Podやアプリ設定(構成ファイル、環境設定) |
| CloudTrail(操作履歴の記録・監査・追跡) | 【自動記録】 作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI) データ操作は追跡できない(データプレーンAPI) |
| Config(リソースの構成状態・設定変更を記録) | 【Configが有効な場合】 クラスター設定変更履歴・エンドポイント/暗号化/ロギングの準拠評価 |
| GuardDuty(脅威を自動検出) | 【GuardDutyが有効な場合】 コントロールプレーン操作やENI通信の異常検知(Auditログ除外) 【追加オプション】 EKS Audit Logs導入を推奨 Amazon EKS の監査ログを分析し、不正なK8s API呼び出しなどを検出 EKS クラスタ単位 Kubernetes={AuditLogs={Enable=true}} で有効化 【追加オプション】 EKS Runtime Monitoring導入を推奨 EKS のワークロード動作を監視し、マルウェア挙動や異常プロセスを検出 EKS クラスタ単位 EKS Agent が自動的にデプロイされる |
EKSが実行ロールを引き受ける典型的な連携パターン
| 実行ロールを介して連携するサービス | 実行ロールにアタッチするポリシー |
|---|---|
| 【Cluster Service Role】 VPC CloudWatch Logs ALB | AmazonEKSClusterPolicy |
| 【Node IAM Role】 EC2 | AmazonEKSWorkerNodePolicy AmazonEC2ContainerRegistryReadOnly AmazonEKS_CNI_Policy |
| 【IRSA】 CloudWatch Logs | logs:DescribeLogGroups logs:CreateLogGroup logs:CreateLogStream logs:PutLogEvents |
| 【IRSA】 ECR | ecr:BatchCheckLayerAvailability ecr:GetDownloadUrlForLayer ecr:BatchGetImage |
| 【IRSA】 RDS | rds-db:connect |
| 【IRSA】 DynamoDB | dynamodb:GetItem dynamodb:PutItem dynamodb:UpdateItem dynamodb:DeleteItem dynamodb:Query dynamodb:Scan |
| 【IRSA】 S3 | s3:ListBucket s3:GetObject s3:PutObject s3:DeleteObject |
| 【IRSA】 Step Functions | states:StartExecution states:DescribeExecution |
| 【IRSA】 Lambda | lambda:InvokeFunction |
| 【IRSA】 Kinesis Data Streams | kinesis:PutRecord kinesis:PutRecords kinesis:GetRecords kinesis:GetShardIterator kinesis:DescribeStream kinesis:ListShards |
| 【IRSA】 EventBridge(Event Bus) | events:PutEvents |
| 【IRSA】 SNS | sns:Publish |
| 【IRSA】 SQS(送信) | sqs:SendMessage |
| 【IRSA】 SQS(ポーリング) | sqs:ReceiveMessage sqs:DeleteMessage sqs:GetQueueAttributes |
| 【IRSA】 Secrets Manager | secretsmanager:GetSecretValue |
| 【IRSA】 SSM Parameter Store | ssm:GetParameter |
| 【IRSA】 KMS | kms:Decrypt kms:Encrypt kms:DescribeKey |
※)権限設計の原則
信頼ポリシー: Cluster Service Role
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
信頼ポリシー: Node IAM Role
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
信頼ポリシー: IRSA
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.ap-northeast-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:namespace-name:service-account-name",
"oidc.eks.ap-northeast-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
}
}
}
]
}
EKS が使用する SLR の連携パターン
SLR名 : AWSServiceRoleForAmazonEKS
| SLR が操作するサービス | 用途 |
|---|---|
| EC2 | ワーカーノードの管理とクラスターネットワーク設定 |
| VPC | クラスターのVPC設定とENI管理 |
| ELB | Kubernetesサービスのロードバランサー作成 |
| IAM | サービスアカウント用のIRSA(IAM Roles for Service Accounts)設定 |
| CloudWatch Logs | コントロールプレーンログの出力 |
| Auto Scaling | ノードグループの自動スケーリング |
ログ・監視
| ログ出力先 | ログの種類 |
|---|---|
| CloudWatch Logs | コントロールプレーンログ |
カスタムメトリクス(EKS Container Insights インストール)
| メトリクス名 | 説明 |
|---|---|
| node_network_rx_bytes | ノード受信バイト |
| node_network_tx_bytes | ノード送信バイト |
| pod_network_rx_bytes | Pod受信バイト |
| pod_network_tx_bytes | Pod送信バイト |
| node_cpu_utilization | ノードCPU使用率 |
| node_fs_usage_bytes | ノードファイルシステム使用量 |
| node_memory_utilization | ノードメモリ使用率 |
| pod_cpu_utilization | Pod CPU使用率 |
| pod_memory_utilization | Podメモリ使用率 |
制限値(固定値/ハードリミット/ソフトリミット)
| 固定値 | 制限値 |
|---|---|
| Podあたりのコンテナ数 | 無制限 |
| ハードリミット | 制限値 |
|---|---|
| セレクター数/Fargateプロファイル | 5 |
| アドオン数/クラスター | 10 |
| ソフトリミット | 制限値 |
|---|---|
| クラスター数/リージョン | 100 |
| ノード数/クラスター(マネージド) | 450 |
| ノードグループ数/クラスター | 30 |
| Fargate プロファイル数/クラスター | 10 |
AWS CLIのサンプルコード
CloudFormationのサンプルコード
Terraformのサンプルコード
料金計算
| 課金項目 | 説明 |
|---|---|
| クラスター | EKSクラスターの時間課金 |
| ワーカーノード | EC2またはFargateワーカーノードの料金 |