Container

EKSでオートスケール ~ PodとEC2どちらも~

はじめに

今回はEKSでオートスケールに挑戦します。
サービスを保守・運用していく中で、リソースが枯渇してサービスの継続が困難になることは避けたいです。
KubernetesではPod(コンテナ)にリソースを割り当てることができ、リソースが不足すると自動でPodを増やす機能があります。
Horizontal Pod Autoscaler

ただEC2インスタンスのリソースが不足した場合は、Podのオートスケールは機能しません。(リソースがないから。。。)

なので、EC2インスタンスのオートスケールも必要になってきます。
cluster-autoscalerという機能を使ってEC2インスタンスのオートスケールも設定します。
これを設定することで、リソースが必要なときのみEC2インスタンスを作成し、リソースが不要になった場合はEC2インスタンスを自動で削除します。

Architecture

  • cluster autoscaler
    EC2インスタンスのオートスケールを担当する機能です。

  • kube2iam
    PodからAWSリソースを操作するためのIAM権限の管理をするツール。
    cluster autoscalerを動かすためのIAM Roleをkube2iamを使って管理します。
    kube2iamのデプロイは本記事では説明しません。AWSのKubernetesでサービスを公開する最高の方法~ALB,ACM,Route53の自動作成~こちらを参考にしてください。

  • Metrics Server
    クラスタのリソース使用量を集計してくれるツール。Podがオートスケールするために必要。前まではheapsterというツールだったが、HeapsterはKubernetes 1.11でDeprecateされた。

  • Helm
    Kubernetesのパッケージマネージャーです。
    Metrics Serverをインストールするのに使用します。

やっていく

前提

  • EKS Clusterが構築済みであること
    構築されていない方はeksctlコマンドを使ってみてください!

Install Helm

README通りにやっていきます。

RBACマニフェストを作成します。

マニフェストファイルをデプロイしてinitコマンドを実行します。

これでHelmのインストールは完了です。

Install Metrics Server

Metrics Serverのインストールはhelmコマンドで一発でできます。

OK!

https://github.com/kubernetes-incubator/metrics-server
https://eksworkshop.com/scaling/deploy_hpa/

cluster autoscaler

Create IAM Role

まずはcluster autoscalerに割り当てるポリシーを記載したclusterAutoscale-iam-policy.jsonファイルを作成します。

次にcluster-autoscalerという名前のRoleを作成します。

AutoScalingGroupにタグを付与

cluster autoscalerが自動でAutoScalingGroupを見つけるために、AutoScalingGroupにタグを付与します。

Nameがk8s.io/cluster-autoscaler/enabledでValueはtrueにします。
もう1つ設定します。をご自身の環境のクラスタ名に読み替えて設定してください。Valueは不要です。
k8s.io/cluster-autoscaler/<Your Cluster Name>

cluster autoscalerのデプロイ

まずはymlファイルをダウンロードします。

cluster-autoscaler-one-asg.yamlファイルの中を3箇所変更します。

Deploymentのspecのmetadataにannotationsを追加します。これを追加することでAutoScalintGroupの操作をする権限をPodに付与します。kube2iamの機能になります。
<Arn of cluster-autoscaler Role>IAMロールの作成で作成したcluster-autoscalerロールのArnです。

commandの引数の--nodesをコメントアウトします。
これはAutoScalingGroupのミニマムとマックスを手動で設定する場合です。今回はAutoScalingGroupにタグを付与したため、自動で設定されます。
複数のNODEGROUPを指定したい場合は,--nodes引数にそれぞれ設定が必要です.

EC2インスタンスとKubernetes APIが通信するときに使用するcrtファイルを変更します。OSにAmazon Linux 2を使っている方は、/etc/ssl/certs/ca-bundle.crtを記述してください。
めちゃめちゃハマりましたが、ちゃんとドキュメントには書いてました。ドキュメント大事。

これで準備できました!
デプロイしましょう!

エラーログが出ていなかったら成功です!

試してみる

それではサンプルアプリをデプロイしてオートスケールを試してみましょう!
下記のymlファイルをデプロイするとDeployment, Service, HorizontalPodAutoscalerが作られます。

作ったPodに対してGolangで負荷をかけてみます!
(Golangよく分かんないよという方はkubectl execでPodに接続し て yes > /dev/null コマンドでも負荷かけれます。)

では負荷をかけます。

k8s-as-st2

素晴らしい。。。
スクショ忘れましたが、EC2インスタンスの数もAutoScalingGroupのMaxまで増えました!

まとめ

EKS最高!
EKSで何でもできるので、お仕事ください!w

References

kubernetes/autoscaler
Autoscaling components for Kubernetes. Contribute to kubernetes/autoscaler development by creating an account on GitHub.

https://medium.com/@alejandro.millan.frias/cluster-autoscaler-in-amazon-eks-d9f787176519

Terraformで構築したEKSにHelmでHPA、CA、ALB Ingressまで導入 - Qiita
# 概要

k8s上でオートスケールするWebアプリケーションを動かす場合、DeploymentとServiceに加え、Ingress、Horizontal Pod Autoscaler (HPA) まで作成することになります。
また...

-Container
-, , , , , ,

Translate »