PONCOTSU

インフラ領域を主にあれしてます

Pod内で複数コンテナを運用している場合のHPAの設定方法

要約すると「複数コンテナを有するPodに対してHPA設定をかけるなら、コンテナすべてにlimits設定をかけておきましょう。でなければ正常に機能しません」という些末な話になります。

課題

HPA設定を付与したリソースを確認しようと思いGKEのコンソール画面を覗くと、

HPA cannot read metrics value

どうやらHPAの設定がうまくいっていない様子。

HPAの設定がうまくいっていないケース
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
...

正常なHPA設定時のマネージドコンソール上の表示
正常なHPA設定時のマネージドコンソール上の表示

今回はメモリに対してオートスケール設定を付与するケースだったので、メモリだけlimits制限をかけています。