地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【k8s】水平オートスケールして遊ぶ

概要

kubernetes.io

Horizontal Pod Autoscalerを使って遊んだ時のログ記事です。

メトリクスサーバをデプロイ

オートスケールの契機を決めるのにpodやnodeのメトリクスを取得する必要があるのでこちらをデプロイします。

GitHub - kubernetes-sigs/metrics-server: Cluster-wide aggregator of resource usage data.

$ wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.1/components.yaml

containersへcommandを追加します。以下の4行をyamlへ追記。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
(省略)
    spec:
      containers:
(省略)
        command:
        - /metrics-server
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP
(省略)

デプロイ & 動作確認(CPU使用率が取得できているか)

k8s-worker01   45m          2%     893Mi           51%
(|kubernetes-admin@kubernetes:argocd) [root@k8s-master metrics-server]# kubectl apply -f components.yaml
serviceaccount/metrics-server unchanged
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader unchanged
clusterrole.rbac.authorization.k8s.io/system:metrics-server unchanged
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader unchanged
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator unchanged
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server unchanged
service/metrics-server unchanged
deployment.apps/metrics-server configured
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io unchanged

(|kubernetes-admin@kubernetes:argocd) [root@k8s-master metrics-server]# k top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master     105m         5%     1160Mi          66%
k8s-worker01   45m          2%     893Mi           51%

CPUバウンドなアプリをデプロイ

ひたすらddをするpodを生成します。スケールアウトしやすいようにreplicasは1で設定しておきます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-test-deploy
  labels:
    app: hpa-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hpa-app
  template:
    metadata:
      name: hpa-app
      labels:
        app: hpa-app
    spec:
      containers:
      - image: busybox
        name: hpa-test-deploy
        command: ["dd", "if=/dev/zero", "of=/dev/null"]

次にHorizontalPodAutoscalerを作ります。

.spec.scaleTargetRefにスケールさせたいdeploymentを指定します。ここではCPU使用率を契機にスケールさせる設定を行います。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-test
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-test-deploy
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 1

上記をapplyすれば完了です。podはCPUバウンドなのですぐにスケールします。全てrunningになるはずです

(|kubernetes-admin@kubernetes:default) [root@k8s-master hpa]# k get horizontalpodautoscalers.autoscaling
NAME       REFERENCE                    TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-test   Deployment/hpa-test-deploy   233%/1%   1         5         4          67m

(|kubernetes-admin@kubernetes:default) [root@k8s-master hpa]# k get horizontalpodautoscalers.autoscaling
NAME       REFERENCE                    TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-test   Deployment/hpa-test-deploy   137%/1%   1         5         5          68m

まとめ

今回はCPU使用率でスケールアウト/インを定義しましたがアプリケーションが提供するcustom metricsでスケールさせたり他にもデフォルトで提供されている他のリソースの値で設定も可能らしい。

メモリ不足だったら垂直スケールさせたりIOバンドな場合は帯域幅とか変えたりみたいなのも読んだが正直別次元すぎてついていけなかった。

とりあえずCPU使用率 or アプリのメトリクスだけみて水平スケールのやりかたさえ分かればなんとかならないかな。

次はサービスディスカバリを使った動的podの検出で監視システムの構築に挑戦予定。

参考リンク