はじめに
お仕事で開発している minne というサービスは OpenStack と AWS のハイブリットクラウドなのだけれど(詳細はこちら)色々つらみがあってそのつらみを解決するために Kubernetes への移行を行ったんですよ。(移行についてはまた別のお話なので何処かで)
ハイブリットなのは変わらず OpenStack に cluster 構築してというのと AWS 側は EKS を使うという構成。
それで EKS 側は Auto Scale 使えるじゃん!ということを思い出したので実際に導入したという話。
Auto Scale 導入までの道のり
Auto Scale を導入するまでに必要な手順がいくつかあるので順を追って解説
Metrics Server の導入
だいたい手順は上記に書いてあるんですけど このリポジトリ 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 のロールにアタッチする。
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 日程ですが今の所問題は起きてません。