現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

GKEのオートスケールの設定手順をまとめた

概要

GKEにはアクセス負荷に応じて適宜サーバを増やしたり減らしたりしてくれるオートスケール機能が備わっています。
クラスタ作成時のその設定方法をまとめました。

オートスケール設定方法

GKEのオートスケールの種類について

GKEにはオートスケールの種類が2種類存在します。

  • Horizontal Pod Autoscaling(水平Podオートスケール)
  • Cluster Autoscaler

前者がPodをスケールさせ、後者がクラスタをスケールさせる。スケール速度はPodであれば一瞬、クラスタノードは起動までに30秒前後かかる。また、k8sの再起動がはいる。

CPUリソースなどの使用状況をk8sが監視し(デフォルト30秒)、設定されたオートスケール閾値を超えたら新しくPodをたてたり、クラスタを増やしたりする。当然、負荷が下がったら自動で減る。
出典: GKE + k8s オートスケールの設定方法 - Qiita

どちらのほうが優れているというより、両方使うのが正解のようです。よって、両方の設定を行ってみます。

Cluster Autoscaler の設定

Cluster Autoscaler はクラスタの作成時にノードの数のmin, maxを指定する形で設定します。
コマンドは以下のように書きます。

節約のためにマシンタイプは f1-micro を選択します。
マシン1台でクラスタを作成しようとすると、Clusters of f1-micro instances must contain at least 3 nodes. Please make the cluster larger or use a different machine type. というエラーになるのでマシン3台構成にします。

gcloud container clusters create sample-cluster --num-nodes=3 --enable-autoscaling --min-nodes=3 --max-nodes=5 --disk-size=30 --machine-type=f1-micro

クラスタ作成完了後は認証情報を入手します。

gcloud container clusters get-credentials sample-cluster

Horizontal Pod Autoscaling の設定

まず事前に作成した yaml を元に deployment を作成します。
その後、作成された deployment に対してオートスケールの設定を行う流れです。
今回の設定ではCPU使用率が70%を超えていれば最大5個までPodをスケールさせるという設定となっています。

# deployment の名前は sample-app としています。
kubectl create -f sample-app-deployment.yaml 
kubectl autoscale deployment sample-app --max 5 --min 1 --cpu-percent 70

ここまでできればオートスケールの設定は完了です。
あとはサービスの yaml を適用させてください。

kubectl apply -f sample-app-service.yaml

おまけ:ソースコード更新時のクラスタへのデプロイ手順

コード内容に変更が発生したときの変更手順です。

  • 変更コードを含んだDocker image を新たに作成する。
    • docker build -t gcr.io/YOUR_PROJECT/sample-app:1.1 . みたいな感じ
  • それを Container Registry に push する
    • gcloud docker -- push gcr.io/YOUR_PROJECT/sample-app:1.1
  • deploment の yaml 内、image を指定している箇所を書き換える(以下コード参照)
  • kubectl apply -f sample-app-deployment.yaml を実行してデプロイを行う

sample-app-deployment.yaml の修正箇所イメージ

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sample-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: sample-app
        image: gcr.io/YOUR_PROJECT/sample-app:1.1 # ここを書き換える
        ports:
        - containerPort: 80

参考文献