Kubernetes 解体新書Part 5 パブリッククラウドとの関係

EKS を OSS の組み合わせとして読む

認証、ネットワーク、ストレージなど、EKS と AWS の機能をつなぐ部品を、やりたいことごとに整理します。

  • L0 ブラウザだけ
  • 更新 2026年10月6日

EKS 上のアプリから AWS のデータを読みたい。 ディスクを使いたいし、ロードバランサーで外へ公開したい。 こうした要求を、Kubernetes の設定から AWS の機能へつなぐ部品がいくつもあります。

この章では、認証、ネットワーク、ストレージなど、やりたいことごとに担当を整理します。 EKS を 1 つのサービスとして使いながらも、問題が起きたときにどの部品を確認するかが分かるよう、接続関係を図で見ます。

GOAL この章のゴール

  • EKS と AWS の各機能をつなぐ部品を見分けられる
  • 利用者の認証と、Pod が AWS にアクセスする認証を区別できる
  • ノードの運用を任せる動作モードで、管理範囲がどう変わるか分かる

EKS を構成する部品と拡張点

Part 4 で見た通り、Kubernetes は本体の外に部品を差し込む前提で作られています。 認証は webhook、ネットワークは CNI、ストレージは CSI、LB は Service / Ingress の controller、ノードの増減も controller です。 EKS は、この差し込み口のそれぞれに AWS の機能を繋ぐ部品を差し込んだものです。

EKS を構成する OSS の地図: AWS の機能と、それを繋ぐ OSS プロジェクト中央に Kubernetes、周囲に AWS の機能 (IAM / VPC / EBS / ELB / Route 53 / EC2 Auto Scaling / CloudFormation) を置き、それぞれを繋ぐ OSS (aws-iam-authenticator と Pod Identity、amazon-vpc-cni-k8s、aws-ebs-csi-driver、AWS Load Balancer Controller、external-dns、Karpenter、eksctl) を線上に配置した図。Kubernetes (EKS)拡張点: 認証 webhook / CNI / CSI /Service / Ingress controller / Node の増減どれも「本体の外」に差し込むIAM認証と認可aws-iam-authenticator+ EKS Pod Identity / IRSAVPC / ENIPod の IPamazon-vpc-cni-k8saws-node DaemonSet (CNI)EBS / EFS / FSxボリュームaws-ebs-csi-driveraws-efs-csi-driver / fsx (CSI)ELB (ALB / NLB)入口aws-load-balancer-controllerIngress / Service / GatewayRoute 53DNSexternal-dnsService / Ingress → レコードEC2 / Auto Scalingノードの増減KarpenterPending の Pod を見て EC2 を起動CloudFormationクラスタ自体の作成eksctlCluster API Provider AWSEC2 (ノード)AMI / kubeletamazon-eks-ami / Bottlerocket
図 1中央が Kubernetes、外周が AWS の機能、間に居るのが OSS。どれも github.com で読める。

主な部品を、AWS の機能と対応づけて並べます。

AWS の機能 OSS 拡張点
IAM kubernetes-sigs/aws-iam-authenticator、EKS Pod Identity Agent 認証 webhook / ServiceAccount
VPC / ENI aws/amazon-vpc-cni-k8s (aws-node DaemonSet) CNI
EBS / EFS / FSx kubernetes-sigs/aws-ebs-csi-driver ほか CSI
ALB / NLB kubernetes-sigs/aws-load-balancer-controller Ingress / Service / Gateway controller
Route 53 kubernetes-sigs/external-dns Service / Ingress を watch する controller
EC2 (ノードの増減) kubernetes-sigs/karpenter (aws/karpenter-provider-aws)、kubernetes/autoscaler Pending の Pod を watch する controller
EC2 (AMI) awslabs/amazon-eks-ami、Bottlerocket ノードの OS
CloudFormation eksctl-io/eksctl、kubernetes-sigs/cluster-api-provider-aws クラスタ自体の作成

ネットワーク: VPC CNI

EKS のノードの ENI を見ると、セカンダリ IP がいくつも付いています。 この IP を Pod に配っているのが Amazon VPC CNI で、kube-system の aws-node DaemonSet として動いています。

やっていることは Part 2 で見た CNI の仕事 (Pod に IP を配り、veth で Pod の netns をつなぎ、経路を用意する) そのものですが、IP の出どころが AWS 固有です。 リポジトリの説明によると、aws-node の中の ipamd がノードの ENI にセカンダリ IP をあらかじめ複数確保しておき、Pod が作られるたびに 1 つを割り当て、CNI のバイナリが veth で Pod の netns に繋ぎます。 Pod の IP が VPC のサブネットから直接配られるので、VPC 内のどこからでも Pod に届き、Security Group や Network ACL が Pod にも効きます。 ノード間の経路は VPC が持っているので、VXLAN も BGP も要りません。

この方式の代償は IP アドレスの消費です。 インスタンスタイプごとに ENI の数とセカンダリ IP の数に上限があり、それが「このノードに置ける Pod の最大数」になります。 prefix delegation (ENI に /28 のプレフィックスを付ける) を有効にすると、この上限を緩められます。

認証: IAM との 2 つの接点

EKS のクラスタに最初に kubectl を通すとき、aws eks update-kubeconfig を実行します。 Pod から S3 を読みたいときは、ServiceAccount に IAM ロールを紐付けます。 この 2 つが、EKS と IAM の接点です。

EKS と IAM の 2 つの接点: 人が kubectl を使うとき、Pod が AWS API を使うとき上段: kubectl が aws eks get-token で IAM 署名付きトークンを作り、コントロールプレーンの aws-iam-authenticator がそれを検証して access entry で Kubernetes のユーザーに対応づける。下段: Pod は ServiceAccount を使い、EKS Pod Identity Agent (または IRSA の OIDC) 経由で IAM ロールの一時クレデンシャルを得て AWS API を呼ぶ。人 → Kubernetes APIkubectlaws eks get-tokenIAM 署名付き tokenkube-apiserver認証 webhookaws-iam-authenticatorIAM principal → access entry → RBACaccess entries (EKS API で管理) が現在の推奨。aws-auth ConfigMap は旧方式。Pod → AWS APIPod (app)aws-sdkserviceAccountName: app169.254.170.23eks-pod-identity-agentDaemonSet (hostNetwork)AssumeRoleForPodIdentityEKS Auth → IAM ロールPod Identity association で紐付け旧方式 IRSA: ServiceAccount の OIDC token を STS AssumeRoleWithWebIdentity で交換。クラスタごとに OIDC provider が要る。Pod Identity: 信頼ポリシーは pods.eks.amazonaws.com 1 つ。Fargate では使えない (IRSA を使う)。
図 2上: 人の IAM 認証情報を Kubernetes のユーザーに変換する。下: Pod の ServiceAccount を IAM ロールに変換する。

人から Kubernetes API への経路では、update-kubeconfig が書く kubeconfig に aws eks get-token を exec する設定が入っています。 aws-iam-authenticator のリポジトリによると、この exec は STS の GetCallerIdentity に対する署名済みリクエストをトークンに詰め、apiserver はそれを認証 webhook で authenticator のサーバーに渡し、サーバーは STS で署名を検証して IAM principal を Kubernetes のユーザーとグループに対応づけます。 対応表は現在 access entries (EKS の API で管理) が推奨で、aws-auth ConfigMap は旧方式です。 サーバー側は EKS のコントロールプレーンで動いていて、利用者からは見えません。

Pod から AWS API への経路では、ノードの IAM ロール (インスタンスプロファイル) より狭い権限を Pod ごとに渡すために、ServiceAccount と IAM ロールを紐付けます。

入口と名前: Load Balancer Controller と external-dns

前の章で見た通り、type: LoadBalancer を見て NLB を作るのは AWS Load Balancer Controller です。 同じ controller が Ingress から ALB を作り、Gateway API のリソースも扱います。 ALB のリスナールール、ターゲットグループ、Security Group を Kubernetes のオブジェクトから reconcile し、TargetGroupBinding という CRD で既存のターゲットグループに Pod を登録することもできます。

external-dns は Service と Ingress を watch して、annotation に書かれたホスト名を Route 53 のレコードにします。 Cloud DNS や Azure DNS、Cloudflare にも対応した汎用の controller です。

ノードの増減: Karpenter

Pending の Pod を見てノードを増やす仕組みには 2 世代あります。

ノードを増やす 2 つの方式: Cluster Autoscaler と KarpenterPending の Pod を見て、Cluster Autoscaler は既存の Auto Scaling Group の desired を増やし、Karpenter は NodePool の制約から Pod に合うインスタンスタイプを選んで EC2 を直接起動する。Pod (Pending)apprequests: cpu 4, gpu 1Cluster Autoscalernode group を見る合う group の台数を +1台数を増やすEC2 ASG固定のタイプm5.xlargenode group の中からしか選べない。GPU 用に別 group を用意しておく必要がある。Karpenter (EKS Auto Mode の中身でもある)NodePool / NodeClass を見るPod の要求に合う型を計算インスタンス起動EC2 API型は都度選ぶg5.xlargeSpot / On-Demand、アーキテクチャ、ゾーンも制約として書く。空いたら統合 (consolidation) して減らす。設定した寿命を過ぎたノードは expired として入れ替える。
図 3Cluster Autoscaler は node group の台数を動かす。Karpenter は Pod の要求から型を選んで EC2 を直接起動する。

Cluster Autoscaler (kubernetes/autoscaler) は、node group (EKS では Auto Scaling Group) 単位で台数を増減させます。 GPU が要る Pod のために GPU の node group を事前に作っておく、といった設計が必要です。

KarpenterカーペンターPending の Pod の要求に合う EC2 を、その場で選んで起動するノードの自動増減ツール。用語集で見る は kubernetes-sigs のプロジェクトで、AWS 向けの実装が aws/karpenter-provider-aws にあります。 ドキュメントによると、Karpenter は scheduler が Unschedulable と印を付けた Pod を見て、その制約を評価し、node group のような仕組みを介さずにインスタンスを直接起動します。 利用者は NodePool (インスタンスファミリー、Spot / On-Demand、アーキテクチャ、ゾーンなどの制約) と、クラウド固有の NodeClass (AWS では EC2NodeClass に AMI、サブネット、Security Group) を書きます。 使用率の低いノードの Pod は他のノードに寄せて空いたノードを削除し (consolidation)、設定した寿命を過ぎたノードは expired として入れ替えます。 EKS Auto Mode のスケーリングはこの Karpenter です。

EKS Auto Mode: 境界線の移動

EKS Auto Modeイーケーエスオートモードノードの運用まで AWS が引き受ける、EKS の動作モード。ノード、スケール、CNI、CSI、LB 連携をコア機能として AWS が持つ。用語集で見る は 2024 年 12 月に始まりました。 前の章の ManagedBoundary で見た「あなたが入れる」の層が、まとめて AWS 側に移ります。

EKS 標準モードと EKS Auto Mode: 境界線の移動左の標準モードでは、AWS が持つのはコントロールプレーンだけで、ノード、CNI の更新、CSI、LB controller、オートスケーラーは利用者が入れる。右の Auto Mode では、それらがコア機能として AWS 側に移り、利用者はアプリと NodePool / NodeClass の指定だけを持つ。EKS 標準モードコントロールプレーン (AWS)VPC CNI / CoreDNS / kube-proxy (add-on、更新はあなた)ノード: managed node group (AMI 更新はあなた)EBS CSI driver (あなたが入れる)AWS Load Balancer Controller (あなたが入れる)Karpenter / Cluster Autoscaler (あなたが入れる)アプリEKS Auto Mode (2024 年 12 月〜)コントロールプレーン (AWS)Pod ネットワーク + NetworkPolicy (内蔵)ノード: EC2 managed instances、最長 21 日で入替EBS CSI (内蔵)ALB / NLB 連携 (内蔵)Karpenter によるスケール (内蔵)アプリ + NodePool / NodeClass の指定AWS が管理共同あなたが入れるSSH / SSM 不可。ノードは「アプライアンス」として扱う。
図 4標準モードで add-on だったものが、Auto Mode ではコア機能になる。ノードは SSH できないアプライアンス。

Auto Mode のノードには SSH でも SSM でも入れず、SELinux は enforcing、ルートファイルシステムは読み取り専用で、最長 21 日 (短くもできる) で新しい AMI のノードに入れ替わります。 利用者が中身を触らない前提にしたことで、AWS は OS の設定を固定した AMI だけを配り、短い周期でノードを作り直してパッチを行き渡らせられます。 入れ替えは Pod Disruption Budget を尊重して行われます。 既定の NodePool と NodeClass は編集せず、必要なら別の NodePool / NodeClass を追加し、ノードに常駐させたいもの (監視など) は DaemonSet で入れます。 内蔵の controller 群は AWS 所有の基盤で動くので、VPC CNI や EBS CSI の Pod は利用者のアカウントには見えません。 この方向は次の章の Fargate と同じです。

コミュニティとの付き合い方

EKS の部品は OSS なので、開発の流れが見えます。 Kubernetes 本体では SIG Cloud Provider の下に provider-aws のサブプロジェクトがあり、cloud-provider-aws や aws-load-balancer-controller はそこで議論されます。 AWS 側の計画は aws/containers-roadmap リポジトリの issue で公開されていて、EKS と ECS の今後の機能が「We’re working on it」「Shipped」のラベル付きで見られます。 欲しい機能があれば issue に賛成票を入れるのが、AWS に届く一番確実な方法です。

ふりかえり

QEKS で Pod に VPC のサブネットの IP が直接付くのはなぜ?

aws-node DaemonSet (amazon-vpc-cni-k8s) の ipamd が ENI にセカンダリ IP を確保し、Pod 作成時に 1 つを割り当てて veth を差します。ルートテーブルは使いません (VPC が経路を持っています)。

QEKS Pod Identity が IRSA と違う点は?

IRSA は ServiceAccount の OIDC トークンを STS で交換するためクラスタごとに OIDC provider が要ります。Pod Identity は eks-pod-identity-agent が EKS Auth から取ったクレデンシャルを配り、信頼ポリシーは pods.eks.amazonaws.com 1 つで済みます。Fargate では逆に Pod Identity が使えません。

QEKS Auto Mode で「利用者の責任」として残るものは?

Auto Mode ではノード、CSI、LB 連携、スケーリングが AWS 側に移ります。アプリ、VPC、クラスタ設定、Kubernetes のバージョン選択は引き続き利用者の責任です。

参考