Container

[超簡単!]kubernetesでオートスケール

2019/01/20


kubernetes1.10ではCPUベースの水平オートスケーリングが可能です。
Deployment,ReplicaSet,Podに対して設定可能。
ただBareMetalに構築したkubernetesクラスタでは、ちょこちょこ追加でインストールしたり設定する必要があったのでまとめました。

# ゴール
CPUベースでNginxのPodを水平オートスケーリングする。

# 前提
kubernetesのクラスタを物理マシンに構築済み
構築していない方はこちらを参考に
[ansibleでkubernetes環境の構築 1](https://qiita.com/tsukasa1301/items/56516f4cf7855308d259)
[ansibleでkubernetes環境の構築 2](https://qiita.com/tsukasa1301/items/d0eae29be0a4cd34a740)

# 説明しないこと
kubernetesの使い方
kubernetesの基本的なサービスの説明(Podとはなんぞや。みたいな)

# 環境
物理マシン
Ubuntu18.04
kubernetes 1.10

# やっていく
オートスケーリングするためにはkubectl topコマンドでPodのリソースを取得できている必要があります。

bash

$ kubectl top node<br />
Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)<br />

なんで???
とりあえずエラー内容にheapsterがどうのこうのといっているのでheapsterをインストールしてみます。
※後述しますが、heapsterのデプロイは必要ありませんでした!

## heapsterのinstall
git cloneしてきてstandaloneのheapsterをデプロイします。

bash
$ git clone https://github.com/kubernetes/heapster.git<br />
$ cd heapster<br />
$ kubectl apply -f deploy/kube-config/standalone/heapster-controller.yaml<br />

再度、topコマンドでPodのリソースを取得します。

bash
$ kubectl top pod prometheus-k8s-0<br />
NAME CPU(cores) MEMORY(bytes)<br />
prometheus-k8s-0 74m 41Mi<br />

おお、動いた。

ダッシュボードにも取得したメトリクスが表示されていい感じに。
![k8s-as-st1](https://daichan.club/wp-content/uploads/2019/01/k8s-as-st1.png)

負荷テスト用にnginxのDeploymentをデプロイします。

 

デプロイしたnginxにオートスケーリングの設定をします。
で,それぞれ実行。

bash
$ kubectl apply -f nginx-test-deployment.yaml<br />
$ kubectl apply -f scale.yaml<br />

## オートスケールを試す
デプロイしたNginxに負荷をかけます。
最近Golangにハマりかけているので、Golangで実行。

go
package main

import (<br />
"net/http"<br />
"sync"<br />
"log"<br />
"time"<br />
)

func main() {<br />
url := "http://192.168.100.100:30534/" // アクセスするURLだよ!

maxConnection := make(chan bool,1000) // 同時に並列する数をしていできるよ!(第二引数)<br />
wg := &sync.WaitGroup{} // 並列処理が終わるまでSleepしてくれる便利なやつだよ!

count := 0 // いくつアクセスが成功したかをアカウントするよ!<br />
start := time.Now() // 処理にかかった時間を測定するよ!<br />
for maxRequest := 0; maxRequest < 50000; maxRequest ++{ // 10000回リクエストを送るよ!<br />
wg.Add(1) // wg.add(1)とすると並列処理が一つ動いていることを便利な奴に教えるよ!<br />
maxConnection <- true // ここは並列する数を抑制する奴だよ!詳しくはググって!<br />
go func() { // go func(){/*処理*/}とやると並列処理を開始してくれるよ!<br />
defer wg.Done() // wg.Done()を呼ぶと並列処理が一つ終わったことを便利な奴に教えるよ!

resp, err := http.Get(url) // GETリクエストでアクセスするよ!<br />
if err != nil { // err ってのはエラーの時にエラーの内容が入ってくるよ!<br />
return // 回線が狭かったりするとここでエラーが帰ってくるよ!<br />
}<br />
defer resp.Body.Close() // 関数が終了するとなんかクローズするよ!(おまじない的な)

count++ // アクセスが成功したことをカウントするよ!<br />
<-maxConnection // ここは並列する数を抑制する奴だよ!詳しくはググって!<br />
}()<br />
}<br />
wg.Wait() // ここは便利な奴が並列処理が終わるのを待つよ!<br />
end := time.Now() // 処理にかかった時間を測定するよ!<br />
log.Printf("%d 回のリクエストに成功しました!\n", count) // 成功したリクエストの数を表示してくれるよ!<br />
log.Printf("%f 秒処理に時間がかかりました!\n",(end.Sub(start)).Seconds()) //何秒かかったかを表示するよ!<br />
}<br />

負荷いってらっしゃい!

bash
$ go run stress.go<br />

.....負荷はあがってきたけど、オートスケーリングしない。
ダッシュボードに次のような出力がありました。
**unable to get metrics for resource cpu**
heapsterをデプロイしたのに、なぜかPodのcpuが取得できていないです。

githubのissue漁りました。
kubernetes1.8以降はheapsterの代わりに、metrics-serverを使うみたいです。もっと調べておけばよかった。。

## metrics-serverのインストール
ということでmetrics-serverのデプロイをします。

bash
$ git clone https://github.com/kubernetes-incubator/metrics-server.git<br />
$ cd metrics-server<br />
$ kubectl create -f deploy/1.8+/<br />

超簡単に終わりました。

これでもう一度負荷をかけます。
![k8s-as-st2](https://daichan.club/wp-content/uploads/2019/01/k8s-as-st2.png)

![k8s-as-st3](https://daichan.club/wp-content/uploads/2019/01/k8s-as-st3.png)

感動。。。

# まとめ
heapsterのインストールの必要はなし!
heapsterの代わりにmetrics-serverのインストールが必要
できたら感動する!
現状はCPUベースのスケーリングしかできないが、ロードマップにはtraficやmemory,discなどがあるのでそのうちもっといろいろできるようになるはず!

AWSのEKSのHPA,heapsterについて書かれている記事がありました。
なんとAWSではどちらも使えないとのこと。
もしかしてEKSではオートスケーリング使えないのかもしれないです。
AWS好きじゃないので別にいいんやけど
[EKSでkubectl topやHorizontal Pod Autoscaler (HPA) が使えない理由 - Qiita](https://qiita.com/os1ma/items/db9635bf7ed74ae86f53)

# 追記
EKSでもオートスケーリングできるみたいです。
当然か!
[EKSでkubectl topやHorizontal Pod Autoscaler (HPA) が使えない理由 - Qiita](https://qiita.com/os1ma/items/db9635bf7ed74ae86f53)

参考サイト
https://github.com/kubernetes/kubernetes/issues/64027
https://github.com/kubernetes/kubernetes/issues/46915

HorizontalPodAutoscaler FailedGetResourceMetric, "unable to get metrics for resource cpu" · Issue #3006 · kubernetes-sigs/kubespray
Horizontal Pod Autoscaler (HPA) fails to collect metrics after setup, for example: $ kubectl get --all-namespaces event NAMESPACE LAST SEEN FIRST SEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE M...

 

-Container
-, , ,

Translate »