これは、Amazon EKS Advent Calendar 2019 6日目の記事です。 現在関わっているプロジェクトにおいて進行中のKubernetes移行で取り入れた技術や方法について、少し紹介したいと思います。 現状の構成がベストプラクティスであるということではなく、試行錯誤した結果の途中経過となりますが、何らかのヒントになれば幸いです。

前提

  • Amazon EKS 1.14
  • ワーカーノードはEC2(Fargateではない)
  • IaCはTerraform 0.12系を使う

Terraformでどこまで適用するか

はじめ、EKSクラスタについてはAWS CLIでの構築を考えていました。その理由としては、

  • Terraformの適用環境はCodeBuildである(IAMロールを使う)
  • kubectl実行環境は別にある(EC2+SessionManager+SSHの踏み台的な環境)

という前提で、kubectlの実行環境でクラスタを作成したほうがaws-authのConfigMapの適用で考えることが少なくて済む、という考えがありました。

しかし、現在はTerraformで管理する対象を増やしています。大きな理由としては、

  • アプリケーションをデプロイする手前までの環境は自動化したい

というところです。

Terraformで適用するリソース

AWS Providerを使う

  • EKSクラスタ
  • ワーカーノード
    • Auto Scaling Group
    • Security Group
    • IAM Role

Kubernetes Providerを使う

https://www.terraform.io/docs/providers/kubernetes/index.html

  • ConfigMap: aws-auth
  • Helm
    • Service Account
    • Cluster Role Binding
  • External DNS
    • Service Account
    • Cluster Role
    • Cluster Role Binding
    • Deployment

Helm Providerを使う

https://www.terraform.io/docs/providers/helm/index.html

(できたらContainer Insights on Amazon EKSもHelmで導入したい…!)

これらを一通りTerraformで、 AWS modulesを活用しつつ構築することで、アプリケーション側のデプロイに専念できる形にする、というのが現時点での答えとなっています。

Kustomizeの利用

アプリケーションのマニフェストをdev/staging/productionといった環境ごとに重複しない形で管理できるようにKustomizeを利用しています。

デプロイ

デプロイはArgoCDを選定しています。

Argo CD - Declarative GitOps CD for Kubernetes https://argoproj.github.io/argo-cd/

これがベストかどうかはまだわかりませんが、利用事例の多さ、開発の頻度、Helmで一発で導入できること、Kustomizeへの対応、見やすいWebUIなどが魅力的だと感じています。

まだ確定はしていませんが、ECRへのイメージプッシュからLambdaを起動して、argocdのCLIからプッシュされたイメージのタグを指定してデプロイする方法(GitOps)が良さそうだと考えています。

Parameter Overrides https://argoproj.github.io/argo-cd/user-guide/parameters/

おわりに

とても簡単な解説にはなりますが、以上の組み合わせでKubernetesまわりの環境を構築しています(しようとしています)。 ここはどうなっているの?という質問や疑問がありましたら、Twitter @isaoshimizu まで優しくお気軽にメンションしていただけたら、こちらとしても大変ありがたい限りです。