EKS(Kubernetes on AWS)の基礎と導入方法

はじめに

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のアーキテクチャは以下の主要コンポーネントで構成されています:

  1. EKSコントロールプレーン:
    • Kubernetesの中核機能(API Server、etcd、Controller Manager、Schedulerなど)
    • AWSによって管理され、複数のアベイラビリティゾーンにデプロイ
  2. データプレーン:
    • マネージドノードグループ: AWSが管理するEC2インスタンス
    • セルフマネージドノード: ユーザーが管理するEC2インスタンス
    • AWS Fargate: サーバーレスコンピューティングエンジン
  3. ネットワーク:
    • 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種類のノードグループを選択できます:

  1. マネージドノードグループ:
    • AWSが自動的にEC2インスタンスをプロビジョニングして管理
    • 自動スケーリング、更新、終了処理をAWSが担当
  2. セルフマネージドノード:
    • ユーザーが直接EC2インスタンスを管理
    • より細かいカスタマイズが可能
  3. 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を利用する際のコスト最適化ポイントをいくつか紹介します:

  1. 適切なインスタンスタイプの選択:
    • ワークロードに応じて最適なインスタンスタイプを選ぶ
    • Spotインスタンスの活用を検討
  2. Auto Scalingの活用:
    • 需要に応じてノード数を自動調整
    • 夜間や週末などの低負荷時間帯にスケールダウン
  3. Fargateの選択的利用:
    • 負荷変動が大きいワークロードにはFargateを検討
    • 安定した高負荷ワークロードにはEC2が費用対効果が高い場合も
  4. リソース制限の設定:
    • Pod/コンテナのCPU/メモリ制限を適切に設定
    • リソースクォータで名前空間ごとに使用上限を設定
  5. 未使用リソースの削除:
    • 使用していないロードバランサー、EBSボリュームなどの削除

トラブルシューティング

EKSで発生しがちな問題とその解決方法をいくつか紹介します:

接続問題

問題: kubectlでクラスターに接続できない

解決策:

  1. kubeconfig を更新: aws eks update-kubeconfig --name my-eks-cluster --region ap-northeast-1
  2. AWS認証情報を確認: aws sts get-caller-identity
  3. APIサーバーエンドポイントへのネットワーク接続を確認

Pod起動問題

問題: PodがPending状態のまま

解決策:

  1. リソース不足がないか確認: kubectl describe pod [pod-name]
  2. ノードの状態確認: kubectl get nodeskubectl describe node [node-name]
  3. PersistentVolumeの問題確認: kubectl get pv,pvc

ロードバランサー問題

問題: LoadBalancerタイプのServiceがExternalIPを取得しない

解決策:

  1. ロードバランサーコントローラーのログ確認: kubectl logs -n kube-system deployment/aws-load-balancer-controller
  2. サービスアカウントの権限確認
  3. サブネットタグの確認(kubernetes.io/role/elbタグが必要)

まとめ

Amazon EKSは、Kubernetesの管理負担を大幅に軽減しながら、そのパワーと柔軟性を活用できるサービスです。この記事では、EKSの基本概念から具体的な導入手順、運用管理のポイントまで解説しました。

Kubernetesは学習曲線がやや急ですが、EKSを利用することで、インフラ管理の負担を減らしながらコンテナオーケストレーションの恩恵を受けることができます。特にマイクロサービスアーキテクチャやクラウドネイティブアプリケーションの運用において、EKSは強力な選択肢となるでしょう。

この記事が、AWSでのKubernetes導入の第一歩として役立てば幸いです。

参考リソース

コメント

タイトルとURLをコピーしました