EKS+RDS(MySQL5.7)+Flaskをeksctlで既存VPCに構築してみる

おはようございます、もきゅりんです。

先日、Flask+RDS(MySQL5.7)+FargateをCFnで構築してみるを書いたのですが、ほんじゃEKSではどうやんの?と思ったので、何千番煎じなのか知らないですがやってみました。

今回使うサンプルで使うFlaskとk8sのManifestファイルはこちらです。

所要時間: 約20~25分

所要時間ですが、クラスターが作成されるのに15~20分くらい。

その間にRDSを作成しましょう。これは5分くらい。

余った10~15分はくつろぎましょう。

クラスターができたら、残りは数分で完了するので約25分です。

前提条件

  • 利用予定のアカウントで、AWS CLIが利用可能

  • kubectlがインストールされていること
    (kubectlのバージョンは作成するk8sクラスタのバージョンと合わせておきましょう)

  • eksctlがインストールされていること

全く本番運用を想定していないので、できる限りシンプルにして、余分な課金されないように自分はデフォルトVPCで構築しました。

そのため、サブネットがすべてパブリックであり、設計としては望ましくありません。

実際の運用では、弊社記事3個のパラメータでEKSクラスタをサクッと構築するクイックスタートの紹介でも紹介されているようなアーキテクチャがより適切だと考えます。

クラスターの作成

eksctlを使います。

yamlファイルを使ってクラスターを作成します。

デフォルトVPCに存在するパブリックサブネット3つを使って作成しています。

なお、t2.micro1つの場合、Podを1つしか作成できないため、t2.microを2つで実行していますことご注意下さい。

yamlの中身については上記公式ページをご参照下さい。

eksctl create cluster -f cluster.yaml

しばらくかかるので、その間にRDSを作成します。

RDS(MySQL)の作成

export SECURITY_GROUP_NAME=mysql-from-default-vpc
export RDS_DATABASE_NAME=demo-flask-mysql
export DB_NAME=flask_db
export USER_NAME=YOUR_NAME
export USER_PASSWORD=YOUR_PASSWORD
# セキュリティグループ(以下sg)の作成
SECURITY_GROUP_ID=`aws ec2 create-security-group \
--description ${SECURITY_GROUP_NAME} \
--group-name ${SECURITY_GROUP_NAME} \
| jq -r '.GroupId'`
# YOUR_VPC_CIDRから3306を開放するルールを作成
aws ec2 authorize-security-group-ingress \
--group-id ${SECURITY_GROUP_ID} \
--protocol tcp \
--port 3306 \
--cidr YOUR_VPC_CIDR
# DBを作成
aws rds create-db-instance \
--db-instance-identifier ${RDS_DATABASE_NAME} \
--db-name ${DB_NAME} \
--vpc-security-group-ids ${SECURITY_GROUP_ID} \
--allocated-storage 20 \
--db-instance-class db.t2.micro \
--engine mysql \
--engine-version 5.7 \
--master-username ${USER_NAME} \
--master-user-password ${USER_PASSWORD}

しばらくしたらエンドポイントを確認しましょう。

表示されたら控えます。

aws rds describe-db-instances \
--db-instance-identifier ${RDS_DATABASE_NAME}

デプロイ

rds/serviceのエンドポイントにRDSのエンドポイントを更新して

rds/secretsにbase64でエンコードしたユーザ名とパスワードを更新。

echo -n ${USER_NAME} | base64
echo -n ${USER_PASSWORD}  | base64
# 環境確認
kubectl config current-context
kubectl get nodes
# マニフェスト実行
kubectl apply -f rds/
kubectl apply -f flask/
# 確認
kubectl get svc,po

特に問題なさそうならELBのエンドポイントを取得してポート8000で表示しましょう。

xxxxxx.ap-northeast-1.elb.amazonaws.com:8000

いつもの出てくる...

user register

article uploaded

以上です。 どなたかのお役に立てれば幸いです。

参考

Kubernetes, Local to Production with Django: 5— Deploy to AWS using Kops with RDS Postgres

t2.micro 1台でEKSを起動してみた