EKSのクイックスタートチュートリアルで基本的なEKSアプリケーションのデプロイを学ぶ
序論
AWSのマネージドなKubernetesサービスであるEKS[1]は初めて触るときまずは何から始めればいいかわからず混乱した思い出があります。
なにか最初のとっかかりに良い教材ないかなと探しましたが、結局のところAWSの公式ドキュメント内に記載されていたクイックスタートチュートリアルが一番良さそうと思い、実際に触ってみるとEKSクラスターの作成からコンテナアプリケーションのデプロイまで体験できたので、このチュートリアルの内容について紹介しはじめてのEKSへのきっかけになれば幸いと思い今回の記事で紹介しようと思います。
対象読者
- EKSを使ったことがない
- Kubernetesマニフェストファイルについてチョットだけわかる
- コンテナのビルドや起動などの基本は理解している
チュートリアルの構成図
チュートリアルで作成されるAWSリソースはEKS以外にもEKSアプリケーションへアクセスできるようにするためのユーザーからのアクセス通信を制御するALBがあります。
ALBの作成やEKS、ALBを配置するためのサブネットの作成もチュートリアル内で作成しますが、これらはAWS Controllers for Kubernetes(ACK)を使うことでKubernetesマニフェストファイル内だけでAWSリソースを作成できるようになります。
EKSクラスター作成
まず最初にEKSクラスターを作成する必要がありますが、これ自体はAWSのマネージドサービスであるため、kubectlコマンドでは作成できません。
AWSコンソール画面やAWS CLIを使って作成もできますが、EKSクラスター操作に特化したコマンドラインツールがAWSから提供されています。
eksctlはEKSクラスターの作成、更新ができるコマンドラインツールで、クラスター情報が記載されているマニフェストファイルを指定してのクラスター作成もできます。
以下のクラスター作成マニフェストファイルを作成し、eksctlでクラスターを作成していきます。
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]リソースをどのように処理するか定義してくれます。
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
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内にゲームデータを永続的に保持できる設定を追加していきます。
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)を定義していきます。
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にボリュームをマウントできる設定を追加します。
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が残っていた
参考資料
Discussion