ECSで運用しているサービスにEKSを導入し移行する - EKS構築編

by

@wapa5pow

ECSにNuxt.jsで作ったフロントエンドやGolangで作ったバックエンドがある環境を、EKS(Amazon Elastic Container Service for Kubernetes)に移す機会があったのでどう実施したかを紹介します。
ECSで構築されている時点でDocker化されているのでEKSをたてて移行するのは難しくないです。1つの記事で書くと長くなりそうなので以下の3つの記事にします。

  1. EKS構築
  2. ECSからEKSへ移行
  3. 運用

今回は、EKSの構築について書きます。

構築前と構築後のVPC

移行する前は以下の状態になっています。

before

移行後は以下の状態になります。

after

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コマンドをたたいて疎通できるか確認します。

title=debug-mysql.yaml
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ピアリングが正しく動いているかの確認まで行いました。次回は実際にバックエンドとフロントエンドのコンテナを移行します。