mcpField
E
eks

eks

github.com/itsmostafaクラウド・DevOps1.2k147 回インストール2 日前に更新
リポジトリ

eks について

AWS上でKubernetesを運用するチーム向けのAmazon Elastic Kubernetes Service(EKS)リファレンススキルです。AWS CLIとeksctlの例を通じて、マネージドコントロールプレーン、ノードグループ、ワークロードID、アドオン、クラスター構築と運用を解説します。

主な機能

  1. 01EKSクラスターの作成と設定
  2. 02マネージド、自主管理、Fargateノードグループの管理
  3. 03IRSAによるPod単位のAWS権限付与
  4. 04EKSアドオンのインストールと更新
  5. 05セキュリティ、高可用性、問題診断の確認

活用シーン

  1. 01マネージドノードグループを使ったKubernetesクラスターの構築
  2. 02アプリケーションPodへの範囲を限定したAWS権限の付与
  3. 03CoreDNSまたはVPC CNIアドオンのインストール
  4. 04ノード参加、DNS、AWSアクセスの問題調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill eks

インストール後、Claude Code で/eksを入力して読み込まれたか確認します。

同梱ファイルcluster-setup.md

詳細

AWS EKS

Amazon Elastic Kubernetes Service(EKS)は、独自のコントロールプレーンをインストールして運用することなく Kubernetes を実行できます。EKS はコントロールプレーンを管理し、AWS サービスと統合します。

目次

主な概念

コントロールプレーン

AWS が管理します。複数の AZ にまたがって Kubernetes API サーバー、etcd、コントローラーを実行します。

ノードグループ
種類説明
マネージドAWS がプロビジョニングと更新を管理します
セルフマネージドEC2 インスタンスを自分で管理します
Fargateサーバーレスのポッド単位のコンピューティング
IRSA(IAM ロールとサービスアカウント)

Kubernetes のサービスアカウントを IAM ロールに関連付け、AWS の権限をきめ細かく設定します。

アドオン

運用ソフトウェア:CoreDNS、kube-proxy、VPC CNI、EBS CSI ドライバー。

一般的なパターン

クラスターの作成

AWS CLI:

# Create cluster role
aws iam create-role \
  --role-name eks-cluster-role \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "eks.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

aws iam attach-role-policy \
  --role-name eks-cluster-role \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy

# Create cluster
aws eks create-cluster \
  --name my-cluster \
  --role-arn arn:aws:iam::123456789012:role/eks-cluster-role \
  --resources-vpc-config subnetIds=subnet-12345678,subnet-87654321,securityGroupIds=sg-12345678

# Wait for cluster
aws eks wait cluster-active --name my-cluster

# Update kubeconfig
aws eks update-kubeconfig --name my-cluster --region us-east-1

eksctl(推奨):

# Create cluster with managed node group
eksctl create cluster \
  --name my-cluster \
  --region us-east-1 \
  --version 1.29 \
  --nodegroup-name standard-workers \
  --node-type t3.medium \
  --nodes 3 \
  --nodes-min 1 \
  --nodes-max 5 \
  --managed
マネージドノードグループの追加
# Create node role
aws iam create-role \
  --role-name eks-node-role \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "ec2.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

aws iam attach-role-policy --role-name eks-node-role --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
aws iam attach-role-policy --role-name eks-node-role --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
aws iam attach-role-policy --role-name eks-node-role --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy

# Create node group
aws eks create-nodegroup \
  --cluster-name my-cluster \
  --nodegroup-name standard-workers \
  --node-role arn:aws:iam::123456789012:role/eks-node-role \
  --subnets subnet-12345678 subnet-87654321 \
  --instance-types t3.medium \
  --scaling-config minSize=1,maxSize=5,desiredSize=3 \
  --ami-type AL2_x86_64
IRSA の設定
# Enable OIDC provider
eksctl utils associate-iam-oidc-provider \
  --cluster my-cluster \
  --approve

# Create IAM role for service account
eksctl create iamserviceaccount \
  --cluster my-cluster \
  --namespace default \
  --name my-app-sa \
  --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
  --approve

IRSA の手動設定:

# Get OIDC issuer
OIDC_ISSUER=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text)
OIDC_ID=${OIDC_ISSUER##*/}

# Create trust policy
cat > trust-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/${OIDC_ID}"
    },
    "Action": "sts:AssumeRoleWithWebIdentity",
    "Condition": {
      "StringEquals": {
        "oidc.eks.us-east-1.amazonaws.com/id/${OIDC_ID}:sub": "system:serviceaccount:default:my-app-sa",
        "oidc.eks.us-east-1.amazonaws.com/id/${OIDC_ID}:aud": "sts.amazonaws.com"
      }
    }
  }]
}
EOF

aws iam create-role --role-name my-app-role --assume-role-policy-document file://trust-policy.json
Kubernetes サービスアカウント
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa
  namespace: default
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-role
アドオンのインストール
# CoreDNS
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name coredns \
  --addon-version v1.11.1-eksbuild.4

# VPC CNI
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name vpc-cni \
  --addon-version v1.16.0-eksbuild.1

# kube-proxy
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name kube-proxy \
  --addon-version v1.29.0-eksbuild.1

# EBS CSI Driver
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name aws-ebs-csi-driver \
  --addon-version v1.27.0-eksbuild.1 \
  --service-account-role-arn arn:aws:iam::123456789012:role/ebs-csi-role
アプリケーションのデプロイ
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app-sa
      containers:
      - name: app
        image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
  name: my-app
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: my-app

CLI リファレンス

クラスター管理
コマンド説明
aws eks create-clusterクラスターを作成します
aws eks describe-clusterクラスターの詳細を取得します
aws eks update-cluster-configクラスターの設定を更新します
aws eks delete-clusterクラスターを削除します
aws eks update-kubeconfigkubectl を設定します
ノードグループ
コマンド説明
aws eks create-nodegroupノードグループを作成します
aws eks describe-nodegroupノードグループの詳細を取得します
aws eks update-nodegroup-configノードグループを更新します
aws eks delete-nodegroupノードグループを削除します
アドオン
コマンド説明
aws eks create-addonアドオンをインストールします
aws eks describe-addonアドオンの詳細を取得します
aws eks update-addonアドオンを更新します
aws eks delete-addonアドオンを削除します

ベストプラクティス

セキュリティ
  • ポッド単位の AWS 権限には IRSA を使用します
  • KMS で クラスターの暗号化を有効にします
  • API サーバーには プライベートエンドポイントを使用します
  • CloudWatch への 監査ログ記録を有効にします
  • ポッドにセキュリティグループを使用します
  • ネットワークポリシーを導入します
# Enable secrets encryption
aws eks create-cluster \
  --name my-cluster \
  --encryption-config '[{
    "provider": {"keyArn": "arn:aws:kms:us-east-1:123456789012:key/..."},
    "resources": ["secrets"]
  }]' \
  ...
高可用性
  • 複数の AZ にまたがってデプロイします
  • マネージドノードグループを使用します
  • ポッド中断予算を設定します
  • 水平ポッドオートスケーリングを設定します
コスト最適化
  • 重要度の低いワークロードには Spot インスタンスを使用します
  • ノードとポッドのサイズを適正化します
  • 変動するワークロードには Fargate を使用します
  • クラスターオートスケーラーを導入します
  • 効率的なスケーリングには Karpenter を使用します

トラブルシューティング

クラスターに接続できない
# Verify kubeconfig
aws eks update-kubeconfig --name my-cluster --region us-east-1

# Check IAM identity
aws sts get-caller-identity

# Verify cluster status
aws eks describe-cluster --name my-cluster --query 'cluster.status'
ノードが参加しない

確認事項:

  • ノードの IAM ロールに必要なポリシーが設定されている
  • セキュリティグループでノードからコントロールプレーンへの通信が許可されている
  • ノードが API サーバーへのネットワークアクセスを持っている
# Check node status
kubectl get nodes

# Check aws-auth ConfigMap
kubectl describe configmap aws-auth -n kube-system

# Check node logs (SSH to node)
journalctl -u kubelet
ポッドから AWS サービスにアクセスできない
# Verify IRSA setup
kubectl describe sa my-app-sa

# Check pod environment
kubectl exec my-pod -- env | grep AWS

# Test credentials
kubectl exec my-pod -- aws sts get-caller-identity
DNS の問題
# Check CoreDNS pods
kubectl get pods -n kube-system -l k8s-app=kube-dns

# Test DNS resolution
kubectl run test --image=busybox:1.28 --rm -it -- nslookup kubernetes

# Check CoreDNS logs
kubectl logs -n kube-system -l k8s-app=kube-dns

参考資料

コメント