Zenn

EKSのクイックスタートチュートリアルで基本的なEKSアプリケーションのデプロイを学ぶ

2025/03/17に公開

序論

AWSのマネージドなKubernetesサービスであるEKS[1]は初めて触るときまずは何から始めればいいかわからず混乱した思い出があります。
なにか最初のとっかかりに良い教材ないかなと探しましたが、結局のところAWSの公式ドキュメント内に記載されていたクイックスタートチュートリアルが一番良さそうと思い、実際に触ってみるとEKSクラスターの作成からコンテナアプリケーションのデプロイまで体験できたので、このチュートリアルの内容について紹介しはじめてのEKSへのきっかけになれば幸いと思い今回の記事で紹介しようと思います。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/quickstart.html

対象読者

  • EKSを使ったことがない
  • Kubernetesマニフェストファイルについてチョットだけわかる
  • コンテナのビルドや起動などの基本は理解している

チュートリアルの構成図

チュートリアルで作成されるAWSリソースはEKS以外にもEKSアプリケーションへアクセスできるようにするためのユーザーからのアクセス通信を制御するALBがあります。
ALBの作成やEKS、ALBを配置するためのサブネットの作成もチュートリアル内で作成しますが、これらはAWS Controllers for Kubernetes(ACK)を使うことでKubernetesマニフェストファイル内だけでAWSリソースを作成できるようになります。

https://aws.amazon.com/jp/blogs/containers/aws-controllers-for-kubernetes-ack/

EKSクラスター作成

まず最初にEKSクラスターを作成する必要がありますが、これ自体はAWSのマネージドサービスであるため、kubectlコマンドでは作成できません。
AWSコンソール画面やAWS CLIを使って作成もできますが、EKSクラスター操作に特化したコマンドラインツールがAWSから提供されています。
eksctlはEKSクラスターの作成、更新ができるコマンドラインツールで、クラスター情報が記載されているマニフェストファイルを指定してのクラスター作成もできます。

https://eksctl.io/

以下のクラスター作成マニフェストファイルを作成し、eksctlでクラスターを作成していきます。

cluster-config.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: web-quickstart
  region: ap-northeast-1
  version: 1.31

autoModeConfig:
  enabled: true
$ eksctl create cluster -f ./cluster-config.yaml

$ eksctl get cluster
NAME            REGION          EKSCTL CREATED
web-quickstart  ap-northeast-1  True


クラスター画面

EKSクラスターが作成されますが、明示的に指定しなければクラスター専用のVPCやサブネットなどのネットワークリソースも同時に作成されます。


一緒に作成されたVPCリソース

Auto Mode[2]を有効にしているためEKSの実行基盤はEC2となってます。

EKSクラスターの実行基盤となるEC2

IngressClass作成

クラスターを作成しましたらIngressClass[3]を作成します。Auto Modeを有効にしているEKSクラスターでは、IngressClassがIngress[4]リソースをどのように処理するか定義してくれます。

ingressclass.yaml
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: alb
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: eks.amazonaws.com/alb
$ kubectl apply -f .\ingressclass.yaml
ingressclass.networking.k8s.io/alb created

EKSアプリケーションデプロイコマンド

IngressClassを作成できましたらチュートリアル用のアプリケーションをEKSヘデプロイします。

アプリケーションデプロイ
kubectl apply -n game-2048 -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/examples/2048/2048_full.yaml

https://github.com/kubernetes-sigs/aws-load-balancer-controller/blob/main/docs/examples/2048/2048_full.yaml

ALBの作成に少し時間がかかりますので、プロビジョニングが完了するまで待ちます。

アプリケーションへアクセス

ALBのプロビジョニングが完了されたらALBのDNS名を取得します。

kubectl get ingress -n game-2048
NAME           CLASS   HOSTS   ADDRESS                                                                        PORTS   AGE
ingress-2048   alb     *       k8s-game2048-ingress2-9d85330077-1924159881.ap-northeast-1.elb.amazonaws.com   80      46m

ADDRESSに表示されたDNS名をブラウザに貼り付ければデモアプリにアクセスできます。


2048ゲームアプリ

データを永続化

EKS Auto Modeを有効化したクラスターを作成しているとKuberntes準拠のストレージも利用できます。
EBS内にゲームデータを永続的に保持できる設定を追加していきます。

storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: auto-ebs-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.eks.amazonaws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  encrypted: "true"
$ kubectl apply -f .\storage-class.yaml
storageclass.storage.k8s.io/auto-ebs-sc created

作成したEBSをPodsの永続的なストレージとして利用できるようにPersistentVolumeClaim(PVC)を定義していきます。

ebs-vpc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: game-data-pvc
  namespace: game-2048
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: auto-ebs-sc
$ kubectl apply -f .\ebs-pvc.yaml
persistentvolumeclaim/game-data-pvc created

先ほどのアプリケーションデプロイマニフェストからDeploymentを定義している個所を抜き出し、Podsにボリュームをマウントできる設定を追加します。

ebs-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  replicas: 5
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
        - name: app-2048
          image: public.ecr.aws/l6m2t8p7/docker-2048:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          volumeMounts:
            - name: game-data
              mountPath: /var/lib/2048
      volumes:
        - name: game-data
          persistentVolumeClaim:
            claimName: game-data-pvc
$ kubectl apply -f .\ebs-deployment.yaml
deployment.apps/deployment-2048 configured

この設定でEKSコンテナに永続的なストレージが保持でき、実行基盤であるEC2や内部のコンテナで異常が発生したとしてもデータの保有先はEBSとなり、消えるリスクが低減されます。

$ kubectl describe pod deployment-2048-7986ddd84c-bfgcr -n game-2048 | grep -A 4 'Volumes'
Volumes:
  game-data:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  game-data-pvc
    ReadOnly:   false

所感

クイックスタートチュートリアルでEKSクラスターの作成からアプリケーションデプロイまでを体験しました。
KubernetesやEKSは構成要素が多く複雑なためどうやって勉強すればいいか迷う人も多いと思います。
まずはマニフェストファイルを書いてみて、よく使うKubernetes APIを知ることでアプリケーションのデプロイをできるようになるとこから頑張ってみてもいいかなと思います。
今回構築したAWSリソースは放置すると結構なコストとなりますので最後に削除することを忘れないようにしてください。

最後にEKSはクラスターを削除すればクラスター内にリソースが残っていても強制的に削除してくれます。

$ eksctl delete cluster -f ./cluster-config.yaml

追記

storage-classで作成したEBSはクラスター内リソースと判定されてないらしくeksctl delete~で削除した後も残ってましたのでこちらは手作業で削除してください。


EBSが残っていた

参考資料

https://dev.classmethod.jp/articles/eks-auto-mode/

脚注
  1. https://aws.amazon.com/jp/eks/ ↩︎

  2. https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-eks-auto-mode/ ↩︎

  3. https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-class-v1/ ↩︎

  4. https://kubernetes.io/docs/concepts/services-networking/ingress/ ↩︎

GitHubで編集を提案

Discussion

ログインするとコメントできます