eks について
AWS上でKubernetesを運用するチーム向けのAmazon Elastic Kubernetes Service(EKS)リファレンススキルです。AWS CLIとeksctlの例を通じて、マネージドコントロールプレーン、ノードグループ、ワークロードID、アドオン、クラスター構築と運用を解説します。
主な機能
- 01EKSクラスターの作成と設定
- 02マネージド、自主管理、Fargateノードグループの管理
- 03IRSAによるPod単位のAWS権限付与
- 04EKSアドオンのインストールと更新
- 05セキュリティ、高可用性、問題診断の確認
活用シーン
- 01マネージドノードグループを使ったKubernetesクラスターの構築
- 02アプリケーションPodへの範囲を限定したAWS権限の付与
- 03CoreDNSまたはVPC CNIアドオンのインストール
- 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-kubeconfig | kubectl を設定します |
ノードグループ
| コマンド | 説明 |
|---|---|
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
参考資料
コメント
Markdown 対応