EKS

【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(EKS)、Node IAM Role(Fargate)、IRSA(Pod内のコンテナ)
※)権限設計の原則

信頼ポリシー: 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管理
ELBKubernetesサービスのロードバランサー作成
IAMサービスアカウント用のIRSA(IAM Roles for Service Accounts)設定
CloudWatch Logsコントロールプレーンログの出力
Auto Scalingノードグループの自動スケーリング
権限設計の原則

ログ・監視

ログ出力先ログの種類
CloudWatch Logsコントロールプレーンログ
CloudWatch Logs優先の原則
カスタムメトリクス(EKS Container Insights インストール)
メトリクス名説明
node_network_rx_bytesノード受信バイト
node_network_tx_bytesノード送信バイト
pod_network_rx_bytesPod受信バイト
pod_network_tx_bytesPod送信バイト
node_cpu_utilizationノードCPU使用率
node_fs_usage_bytesノードファイルシステム使用量
node_memory_utilizationノードメモリ使用率
pod_cpu_utilizationPod CPU使用率
pod_memory_utilizationPodメモリ使用率

制限値(固定値/ハードリミット/ソフトリミット)

固定値制限値
Podあたりのコンテナ数無制限

ハードリミット制限値
セレクター数/Fargateプロファイル5
アドオン数/クラスター10

ソフトリミット制限値
クラスター数/リージョン 100
ノード数/クラスター(マネージド)450
ノードグループ数/クラスター30
Fargate プロファイル数/クラスター10

AWS CLIのサンプルコード

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
クラスターEKSクラスターの時間課金
ワーカーノードEC2またはFargateワーカーノードの料金
料金計算ツール

公式ページ

AWSドキュメント EKS