概要
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の検出で監視システムの構築に挑戦予定。