まっしろけっけ

めもてきなやーつ

EKS で Auto Scale 導入したお話

はじめに

お仕事で開発している minne というサービスは OpenStack と AWS のハイブリットクラウドなのだけれど(詳細はこちら)色々つらみがあってそのつらみを解決するために Kubernetes への移行を行ったんですよ。(移行についてはまた別のお話なので何処かで)

ハイブリットなのは変わらず OpenStack に cluster 構築してというのと AWS 側は EKS を使うという構成。

それで EKS 側は Auto Scale 使えるじゃん!ということを思い出したので実際に導入したという話。

Auto Scale 導入までの道のり

Auto Scale を導入するまでに必要な手順がいくつかあるので順を追って解説

Metrics Server の導入

docs.aws.amazon.com

だいたい手順は上記に書いてあるんですけど このリポジトリ clone して version とかきになるなら選んで apply すれば良いという感じ

$ git clone git@github.com:kubernetes-incubator/metrics-server.git
$ cd metrics-server

# このままだと最新の master なので最新のリリース version に切り替えるとかやる

$ kubectl apply -f deploy/1.8+/ # Kubernetes の version によって 1.8+ じゃなくて 1.7 とかのディレクトリを選ぶ必要がありそう

$ kubectl get deployment metrics-server -n kube-system --watch
NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
metrics-server   1         1         1            1           10d

$ kubectl top node
NAME                                              CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal   xxxxm        15%       xxxxMi          60%
ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal   xxxm         3%        xxxxMi          54%
ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal   xxxxm        24%       xxxxMi         65%

これで node や pod の metrics を確認できるようになるので Horizontal Pod Autoscaler を使うことができるようになる。

Horizontal Pod Autoscaler

Horizontal Pod Autoscaler - Kubernetes

Horizontal Pod Autoscaler(以下 HPA) は雑にいうと負荷によって pod 数を増減(スケールイン/アウト)させるやーつ

下記のような yaml を用意する。

# hpa.yaml
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: sample-hpa
spec:
  minReplicas: 2 # 最小の pod 数
  maxReplicas: 200 # 最大の pod 数
  metrics:
  - resource:
      name: cpu # pod の cpu の使用率を基準に増減させる
      targetAverageUtilization: 20 # 使用率 20% を基準に増減させる
    type: Resource
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: sample-deployment # 増減させたい deployment の名前を指定
$ kubectl apply -f hpa.yaml
$ k describe hpa
Name:                                                  sample-hpa
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration=.....
CreationTimestamp:                                     Fri, 19 Jul 2019 12:03:05 +0900
Reference:                                             Deployment/sample-deployment
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  15% (xxxxm) / 20%
Min replicas:                                          2
Max replicas:                                          200
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     False   BackoffBoth         the time since the previous scale is still within both the downscale and upscale forbidden windows
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:
  Type    Reason             Age   From                       Message
  ----    ------             ----  ----                       -------
  Normal  SuccessfulRescale  33s   horizontal-pod-autoscaler  New size: 4; reason: cpu resource utilization (percentage of request) above target

これで HPA が有効になった。

最初は Metrics の current 部分が unknown となるが待っていれば Metrics 収集して正常になるはず。

注意が必要なのは対象の deployment の全 container の resources (今回は cpu が対象なので cpu)が設定されていないと unknown のままで Events にエラーが出てるはず。他にも対象の deployment と同じ label 名の deployment の各 container も同様に resources が設定されてないといけない > see

HPA が有効になったので pod が増減するか見てみる

# アクセス数とかは調整してください
$ ab -n 100000 -c 100 "対象の deployment へアクセスが流れる IP を指定"

# 別プロセスで
$ kubectl get pods --watch

これで pod が増えたり減ったりする様子が眺められるはず。
k describe hpa で hpa の様子を見ると Events に pod を増減させている情報も表示されます。



これで HPA の導入は終わり

Cluster Autoscaler

GitHub - kubernetes/autoscaler: Autoscaling components for Kubernetes

最後に workernode を増減していきます。

まずは workernode の IAM に Auto Scale 周りのアクセス権を付与する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeLaunchConfigurations",
                "autoscaling:SetDesiredCapacity",
                "autoscaling:TerminateInstanceInAutoScalingGroup"
            ],
            "Resource": "*"
        }
    ]
}

上記のポリシーを作成し workernode のロールにアタッチする。

Autoscaler のマニフェストこちら

YOUR CLUSTER NAME の箇所を自身の環境に合わせて apply

pod の増減で確認した時のように負荷をかけつつ下記で log を眺める

$ kubectl logs -f deployment/cluster-autoscaler -n kube-system

# 別プロセスで
$ k get node --watch

これで EKS での Auto Scale の導入はおしまい

さいごに

HPA を有効にするところで少しハマりましたが、シュッと Auto Scale が有効にでき AWS の使用料も抑えることができたので便利でした。

本番導入して 10 日程ですが今の所問題は起きてません。