はじめに
Amazon Elastic Kubernetes Service(EKS)は、AWSが提供するマネージドKubernetesサービスです。独自のKubernetesコントロールプレーンをセットアップ・運用する手間なく、Kubernetesを利用できることが最大の魅力です。本記事では、EKSの基本概念から具体的な導入手順まで、初心者にもわかりやすく解説します。
Kubernetesとは?
まずはKubernetesについて簡単に説明しておきましょう。Kubernetes(略称:K8s)は、Googleが開発したオープンソースのコンテナオーケストレーションプラットフォームです。主な機能には以下のようなものがあります:
- コンテナのデプロイと管理: Dockerなどのコンテナを複数のホストにわたって実行・管理
- スケーリング: 負荷に応じて自動的にコンテナ数を調整
- 自己修復: 障害が発生したコンテナを自動的に再起動
- サービスディスカバリとロードバランシング: 複数コンテナへのトラフィック分散
- ストレージオーケストレーション: 永続ストレージの管理
Amazon EKSの特徴
EKSは、AWSが提供するマネージドKubernetesサービスで、以下のような特徴があります:
- マネージドコントロールプレーン: Kubernetesのマスターノードをマネージドサービスとして提供
- 高可用性: 複数のアベイラビリティゾーンにわたってコントロールプレーンを自動的に分散
- AWSサービスとの統合: IAM、VPC、Route 53などのAWSサービスと緊密に統合
- 最新バージョンのサポート: 常に最新のKubernetesバージョンをサポート
- マネージドノードグループ: EC2インスタンスのプロビジョニングと管理を自動化
- Fargateとの統合: サーバーレスでコンテナを実行可能
EKSのアーキテクチャ
EKSのアーキテクチャは以下の主要コンポーネントで構成されています:
- EKSコントロールプレーン:
- Kubernetesの中核機能(API Server、etcd、Controller Manager、Schedulerなど)
- AWSによって管理され、複数のアベイラビリティゾーンにデプロイ
- データプレーン:
- マネージドノードグループ: AWSが管理するEC2インスタンス
- セルフマネージドノード: ユーザーが管理するEC2インスタンス
- AWS Fargate: サーバーレスコンピューティングエンジン
- ネットワーク:
- Amazon VPCを使用
- ワーカーノード間の通信はVPC内で行われる
- コントロールプレーンへのアクセスはエンドポイントを通じて行われる
EKSクラスターの導入手順
それでは、実際にEKSクラスターを構築する手順を見ていきましょう。
前提条件
- AWSアカウント
- AWS CLIのインストールと設定
- eksctlのインストール(EKSクラスター管理ツール)
- kubectlのインストール(Kubernetes管理ツール)
手順1: ツールのインストール
AWS CLIのインストール(例:macOS)
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
aws --version
設定:
aws configure
eksctlのインストール
macOSの場合(Homebrew):
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl
Linuxの場合:
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
kubectlのインストール
macOSの場合(Homebrew):
brew install kubernetes-cli
Linuxの場合:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
手順2: EKSクラスターの作成
最も簡単な方法はeksctl
を使用する方法です。以下のコマンドでクラスターを作成できます:
eksctl create cluster \
--name my-eks-cluster \
--region ap-northeast-1 \
--version 1.28 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 3 \
--managed
このコマンドは以下のリソースを作成します:
- EKSクラスター(コントロールプレーン)
- VPC、サブネット、セキュリティグループなどのネットワークリソース
- マネージドノードグループ(t3.mediumインスタンス×2)
クラスターの作成には15〜20分ほどかかります。
手順3: クラスターへの接続確認
クラスターが作成されたら、kubectlを使って接続確認をしましょう:
# kubeconfig ファイルを更新
aws eks update-kubeconfig --name my-eks-cluster --region ap-northeast-1
# ノードの確認
kubectl get nodes
# 全てのリソースの確認
kubectl get all --all-namespaces
手順4: サンプルアプリケーションのデプロイ
簡単なNginxアプリケーションをデプロイしてみましょう。
まず、nginx-deployment.yaml
ファイルを作成します:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
そして、このファイルを適用します:
kubectl apply -f nginx-deployment.yaml
デプロイメントとサービスが作成されたことを確認します:
kubectl get deployments
kubectl get services
LoadBalancerタイプのサービスを作成したので、AWS ELBが自動的に作成されます。EXTERNAL-IP
列に表示されるURLにアクセスすると、Nginxのデフォルトページが表示されるはずです。
EKSの主要コンポーネントと操作方法
ノードグループ
EKSでは、以下の3種類のノードグループを選択できます:
- マネージドノードグループ:
- AWSが自動的にEC2インスタンスをプロビジョニングして管理
- 自動スケーリング、更新、終了処理をAWSが担当
- セルフマネージドノード:
- ユーザーが直接EC2インスタンスを管理
- より細かいカスタマイズが可能
- AWS Fargate:
- サーバーレスでコンテナを実行
- インフラ管理が不要
マネージドノードグループの追加
eksctl create nodegroup \
--cluster my-eks-cluster \
--region ap-northeast-1 \
--name additional-nodes \
--node-type t3.large \
--nodes 2 \
--nodes-min 1 \
--nodes-max 4
ノードグループの削除
eksctl delete nodegroup \
--cluster my-eks-cluster \
--name additional-nodes \
--region ap-northeast-1
Fargateプロファイル
Fargateを使用すると、サーバーレスでPodを実行できます。Fargateプロファイルを作成するには:
eksctl create fargateprofile \
--cluster my-eks-cluster \
--name my-fargate-profile \
--namespace fargate-ns
これにより、fargate-ns
名前空間に作成されるPodは自動的にFargateで実行されます。
IAMとの統合
EKSはAWS IAMと統合されており、Kubernetes RBACと連携して認証と認可を行います。
IAMロールにKubernetes権限を付与
eksctl create iamidentitymapping \
--cluster my-eks-cluster \
--arn arn:aws:iam::123456789012:role/MyRole \
--username admin \
--group system:masters
アドオンの管理
EKSでは様々なアドオンを簡単にインストールできます。
AWSロードバランサーコントローラーのインストール
eksctl create iamserviceaccount \
--cluster=my-eks-cluster \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::123456789012:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=my-eks-cluster \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller
EKSクラスターの運用管理
クラスターのアップグレード
EKSクラスターのバージョンをアップグレードするには、まずコントロールプレーンをアップグレードし、その後ノードグループをアップグレードします。
# コントロールプレーンのアップグレード
eksctl upgrade cluster --name my-eks-cluster --version 1.29 --approve
# ノードグループのアップグレード
eksctl upgrade nodegroup --cluster my-eks-cluster --name standard-workers
モニタリングとログ記録
CloudWatchコンテナインサイトの有効化
eksctl utils enable-containerinsights \
--cluster my-eks-cluster \
--region ap-northeast-1
Prometheusを使用したモニタリング
# Helmのインストール
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Prometheusのインストール
helm install prometheus prometheus-community/prometheus \
--namespace monitoring \
--create-namespace
自動スケーリング
Kubernetes Metrics ServerとCluster Autoscalerを使用して、自動スケーリングを設定できます。
Metrics Serverのインストール
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Cluster Autoscalerのデプロイ
# IAMポリシーの作成
aws iam create-policy \
--policy-name AmazonEKSClusterAutoscalerPolicy \
--policy-document file://cluster-autoscaler-policy.json
# サービスアカウントの作成
eksctl create iamserviceaccount \
--cluster=my-eks-cluster \
--namespace=kube-system \
--name=cluster-autoscaler \
--attach-policy-arn=arn:aws:iam::123456789012:policy/AmazonEKSClusterAutoscalerPolicy \
--approve
# Cluster Autoscalerのデプロイ
kubectl apply -f cluster-autoscaler-autodiscover.yaml
バックアップと復元
EKSクラスターのバックアップには、Veleroなどのツールが使用できます。
# Veleroのインストール
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.4.0 \
--bucket velero-backups \
--backup-location-config region=ap-northeast-1 \
--snapshot-location-config region=ap-northeast-1 \
--secret-file ./credentials-velero
コスト最適化のポイント
EKSを利用する際のコスト最適化ポイントをいくつか紹介します:
- 適切なインスタンスタイプの選択:
- ワークロードに応じて最適なインスタンスタイプを選ぶ
- Spotインスタンスの活用を検討
- Auto Scalingの活用:
- 需要に応じてノード数を自動調整
- 夜間や週末などの低負荷時間帯にスケールダウン
- Fargateの選択的利用:
- 負荷変動が大きいワークロードにはFargateを検討
- 安定した高負荷ワークロードにはEC2が費用対効果が高い場合も
- リソース制限の設定:
- Pod/コンテナのCPU/メモリ制限を適切に設定
- リソースクォータで名前空間ごとに使用上限を設定
- 未使用リソースの削除:
- 使用していないロードバランサー、EBSボリュームなどの削除
トラブルシューティング
EKSで発生しがちな問題とその解決方法をいくつか紹介します:
接続問題
問題: kubectlでクラスターに接続できない
解決策:
- kubeconfig を更新:
aws eks update-kubeconfig --name my-eks-cluster --region ap-northeast-1
- AWS認証情報を確認:
aws sts get-caller-identity
- APIサーバーエンドポイントへのネットワーク接続を確認
Pod起動問題
問題: PodがPending
状態のまま
解決策:
- リソース不足がないか確認:
kubectl describe pod [pod-name]
- ノードの状態確認:
kubectl get nodes
とkubectl describe node [node-name]
- PersistentVolumeの問題確認:
kubectl get pv,pvc
ロードバランサー問題
問題: LoadBalancerタイプのServiceがExternalIPを取得しない
解決策:
- ロードバランサーコントローラーのログ確認:
kubectl logs -n kube-system deployment/aws-load-balancer-controller
- サービスアカウントの権限確認
- サブネットタグの確認(
kubernetes.io/role/elb
タグが必要)
まとめ
Amazon EKSは、Kubernetesの管理負担を大幅に軽減しながら、そのパワーと柔軟性を活用できるサービスです。この記事では、EKSの基本概念から具体的な導入手順、運用管理のポイントまで解説しました。
Kubernetesは学習曲線がやや急ですが、EKSを利用することで、インフラ管理の負担を減らしながらコンテナオーケストレーションの恩恵を受けることができます。特にマイクロサービスアーキテクチャやクラウドネイティブアプリケーションの運用において、EKSは強力な選択肢となるでしょう。
この記事が、AWSでのKubernetes導入の第一歩として役立てば幸いです。
コメント