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