Pod内で複数コンテナを運用している場合のHPAの設定方法
要約すると「複数コンテナを有するPodに対してHPA設定をかけるなら、コンテナすべてにlimits設定をかけておきましょう。でなければ正常に機能しません」という些末な話になります。
課題
HPA設定を付与したリソースを確認しようと思いGKEのコンソール画面を覗くと、
HPA cannot read metrics value
どうやらHPAの設定がうまくいっていない様子。
なぜだろうと思い、クラスタの状態を確認するも、似たような症状になっていて訳が分からなかった。
というのも、他のPodに付与しているHPA設定も、今回エラーを発見したものと同様の設定をかけていたので条件は同じはず…とずっと思っていたからです。
原因と対処
そこでGCPサポートに相談したところ、実は今回エラーになっていたHPA設定の対象となっていたPodはサイドカーを持っており、そのサイドカーのlimits設定がなされていなかったからでした。下記がサイドカーのlimits制限がされてない状態のときのmanifestです。
apiVersion: apps/v1 kind: Deployment metadata: name: hoge namespace: hoge spec: replicas: 3 selector: matchLabels: app: hoge tier: backend template: metadata: labels: app: hoge tier: backend spec: containers: - env: - name: SPRING_PROFILES_ACTIVE value: prd image: 省略 imagePullPolicy: Always livenessProbe: httpGet: path: /private/health port: 8080 initialDelaySeconds: 30 periodSeconds: 30 name: hoge ports: - containerPort: 8080 readinessProbe: httpGet: path: /private/health port: 8080 initialDelaySeconds: 5 periodSeconds: 5 resources: limits: cpu: 500m memory: 768Mi requests: cpu: 100m memory: 512Mi # サイドカー - name: cloudsql-proxy command: 省略 image: gcr.io/cloudsql-docker/gce-proxy:1.17 name: cloudsql-proxy volumeMounts: - mountPath: /secrets/cloudsql name: cloudsql-instance-credentials readOnly: true volumes: - name: cloudsql-instance-credentials secret: secretName: cloudsql-instance-credentials
メインコンテナの hoge
の設定があれば大丈夫だと思っていたのが勘違いのもとでした。
Limitsを付与して実行するとうまくメトリクスを取得できていたので、課題は解決しました。
... - name: cloudsql-proxy command: 省略 image: gcr.io/cloudsql-docker/gce-proxy:1.17 resources: limits: memory: 64Mi requests: memory: 32Mi ...
今回はメモリに対してオートスケール設定を付与するケースだったので、メモリだけlimits制限をかけています。