ECSで運用しているサービスにEKSを導入し移行する - EKS構築編
ECSにNuxt.jsで作ったフロントエンドやGolangで作ったバックエンドがある環境を、EKS(Amazon Elastic Container Service for Kubernetes)に移す機会があったのでどう実施したかを紹介します。
ECSで構築されている時点でDocker化されているのでEKSをたてて移行するのは難しくないです。1つの記事で書くと長くなりそうなので以下の3つの記事にします。
今回は、EKSの構築について書きます。
構築前と構築後のVPC
移行する前は以下の状態になっています。
移行後は以下の状態になります。
VPC2にEKSをたてて、FrontendとBackendのコンテナを移行します。VPC2にあるBackend側からVPC1にあるRDSに接続する必要があるのでVPC1とVPC2はVPCピアリングで接続します。
EKSでKubernetesのクラスタを作成する
それでは実際に構築していきます。EKSは2018年12月に東京リージョンに対応したので東京リージョンで作っていきます。
Kubernetesのクラスタの作成は基本的に、Amazon EKS の使用開始の通りに進めます。日本語版のドキュメントは情報古いことが多々あるので英語のドキュメントですすめるといいかなと思います。ドキュメントではサンプルアプリのデプロイまでしてますがここでは以下の作業を行います。
- EKS用のVPCの作成
kubectl
の設定- EKSクラスターの作成
- ワーカーノードの起動
EKS用のVPCの作成
クラスタのVPCは手順の通り新しく作ります。既存サービスのRDSが別のVPCにあるのであとからVPCペアリング機能でVPC同士を接続します。このとき重複するCIDRブロック同士では接続できないので被らないように気をつけてください。
今回はEC2-Classic
の環境だったため、VPCをCloudFormationで作るときにサブネットのAvailability Zoneがただしく設定できずに以下のエラーがでました。YAMLファイルをAvailabilityZone: "ap-northeast-1b"
のように直接指定して作成することができました。
Subnet01 Value (ap-northeast-1a) for parameter availabilityZone is invalid. Subnets can currently only be created in the following availability zones: ap-northeast-1b, ap-northeast-1c, ap-northeast-1d. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue; ...
kubectlの設定
手順どおり行います
EKSクラスターの作成
手順どおり行います。途中でVPCやSecurity Groupを指定するところがありますが、最初の手順のCloudFormationでVPCを作ったときの出力のものを使います。
クラスターの作成はしばらくかかるので待機します。
クラスターができたらkubectl
コマンドを実行し疎通確認をします。
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 30m
ワーカーノードの起動
手順どおり行います。ワーカノードの数はアプリケーションの種類によるのですが、今回のようにフロントエンドやバックエンドを配布するときは自分は最低3台用意しています。ワーカノードのインスタンスタイプですが、eni-max-pods.txtにあるように、インスタンスタイプによって起動できる最大ポッド数がかわってきます。最低でもt3.medium
くらいあると余裕があっていいかなと思います。
VPCピアリング接続設定
今回、Kubernetes上のVPCからRDSがあるVPCに接続したいのでVPC ピアリング接続の作成と使用を参考にしながら設定していきます。
作成し承認したら、VPC ピアリング接続のルートテーブルを更新するを参考にしてルーティングテーブルを更新します。
EKSのPublic Subnetsのルーティングテーブルに、既存のVPCへのルーティングを加えます。既存のVPCからEKSへもルーティングテーブルを追加します。
Kubernetes上のワーカーノードからRDSへ接続できるようにセキュリティグループも設定しておきます。EKSのセキュリティグループは今回作ったやり方だと以下の2つのセキュリティグループができます。Security group for all nodes in the cluster
の説明がかいてあるセキュリティグループがワーカーノードのセキュリティグループなのでそこからRDSへ繋げれるようにRDSのセキュリティグループを設定します。
- Security group for all nodes in the cluster
- Cluster communication with worker nodes
疎通確認
今回はRDSがMySQLなので以下のようなDeploymentを作って、kubectl apply -f debug-mysql.yaml
でデバッグ用のMySQLポッドをデプロイします。起動したらそのPodにつなげにいき、mysql
コマンドをたたいて疎通できるか確認します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-client
spec:
replicas: 1
selector:
matchLabels:
app: mysql-client
template:
metadata:
labels:
app: mysql-client
spec:
containers:
- name: mysql-client
image: mysql:5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
まとめ
EKSのクラスタを立ち上げ、ワーカーノードを作成し、VPCピアリングが正しく動いているかの確認まで行いました。次回は実際にバックエンドとフロントエンドのコンテナを移行します。