vSphere with Tanzu 7.0 における「MISCONF Redis is configured to save RDB snapshots」による Harbor 障害と手動容量拡張手順
search cancel

vSphere with Tanzu 7.0 における「MISCONF Redis is configured to save RDB snapshots」による Harbor 障害と手動容量拡張手順

book

Article ID: 436635

calendar_today

Updated On:

Products

VMware vSphere Kubernetes Service

Issue/Introduction

免責事項:これは英文の記事 「Manual volume expansion for Harbor "MISCONF Redis..." failure in vSphere with Tanzu 7.0」の日本語訳です。
記事はベストエフォートで翻訳を進めているため、ローカライズ化コンテンツは最新情報ではない可能性があります。
最新情報は英語版の記事で参照してください。


組み込み Harbor レジストリがアクセス不能になり、HTTP 500 Internal Server Error やヘルスチェックの失敗が発生します。
依存する Harbor ポッド (jobservice や registry など) が CrashLoopBackOff 状態に陥るか、connection refused で失敗します。
harbor-redis ポッドのイベントやログを確認すると、以下のエラーが記録されています。

MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

また、この状態で PVC を直接パッチして容量を拡張しようとすると、ネームスペースのクォータ超過を示すエラーで拒否されます。

Error from server (Forbidden): persistentvolumeclaims "<pvc-name>" is forbidden: exceeded quota: <namespace>-storagequota, requested: ... used: ... limited: ...

Environment

VMware vSphere with Tanzu 7.0

Cause

Harbor Redis ポッドのバックエンドである Persistent Volume (PV) が 100% の容量に達し、Redis がバックグラウンドスナップショット (bgsave) を保存できなくなっていることが原因です。
これにより MISCONF 状態がトリガーされ、以降のデータ書き込み操作がすべて失敗します。
vSphere 7.0 では、vSphere Client UI から組み込み Harbor レジストリのストレージ制限を拡張出来ない実装であり、標準的なオフラインでの PVC 拡張操作が行えません。

Resolution

警告: この手順では Harbor Redis の StatefulSet をスケールダウンするため、Harbor レジストリへのアクセスが一時的に停止します。

  1. Troubleshooting vSphere Supervisor Control Plane VMs を参考に、スーパーバイザコントロールプレーン VM に SSH ログインします。
  2. Harbor レジストリ固有のネームスペース名と、Redis pod 名を特定します。
    kubectl get pods -A -l component=redis
    出力例:
    NAMESPACE                         NAME                             READY   STATUS    RESTARTS   AGE
    vmware-system-registry-349###19   harbor-349###19-harbor-redis-0   1/1     Running   0          9d
  3. ネームスペースに関連付けられている ResourceQuota 名を確認します。
    kubectl get resourcequota -n <harbor-namespace名>
    出力例:
    NAME                                           AGE   REQUEST                                                                                 LIMIT
    vmware-system-registry-349###19-storagequota   10d   vsan-default-storage-policy.storageclass.storage.k8s.io/requests.storage: 200Gi/200Gi
  4. ResourceQuota を編集し、ストレージ上限を一時的に引き上げます。
    エディタが開いたら、使用しているストレージクラス (例: vsan-default-storage-policy.storageclass.storage.k8s.io/requests.storage) の hard 上限を見つけ、値を増やします (例: 200Gi から 220Gi) 
    kubectl edit resourcequota <ResourceQuota名> -n <harbor-namespace名> 
    出力例:
      ...中略
       spec:
         hard:
           vsan-default-storage-policy.storageclass.storage.k8s.io/requests.storage: 200Gi ※変更対象
       status:
         hard:
           vsan-default-storage-policy.storageclass.storage.k8s.io/requests.storage: 200Gi ※変更対象
         used:
         vsan-default-storage-policy.storageclass.storage.k8s.io/requests.storage: 200Gi ※used の 200Gi は対象外

    変更後、Esc のあと、Shift + zz で変更内容を保存終了します。
  5. ボリューム拡張対象の Harbor Redis StatefulSet 名を確認します
    kubectl get sts -n <harbor-namespace名> -l component=redis
    出力例:
    NAME                           READY   AGE
    harbor-349###19-harbor-redis   1/1     10d
  6. ボリュームを安全にアンマウントするため、Harbor Redis StatefulSet のレプリカを 0 にスケールダウンします。
    kubectl scale sts <harbor-redis-statefulset名> -n <harbor-namespace名> --replicas=0
  7. 拡張対象の Persistent Volume Claim (PVC) 名を確認します。
    kubectl get pvc -n <harbor-namespace名> -l component=redis
    出力例:
    NAME                                 STATUS  VOLUME                                    CAPACITY  ACCESS MODES  STORAGECLASS     AGE
    data-harbor-349###19-harbor-redis-0  Bound   pvc-9aaa8930-493e-4957-9b42-026b9###1f3d  6Gi      RWO           vsan-default-storage-policy  10d
  8. Redis の Persistent Volume Claim (PVC) にパッチを適用し、要求サイズを拡張します (例: 6Gi から 18Gi)。
    kubectl patch pvc <redis-pvc名> -n <harbor-namespace名> -p '{"spec":{"resources":{"requests":{"storage":"18Gi"}}}}'
  9. PVC のステータスが FileSystemResizePending になることを確認します。
    kubectl get pvc <redis-pvc名> -n <harbor-namespace> -o yaml | grep FileSystemResizePending -C 2
    結果の中に FileSystemResizePending が含まれることを確認します。
  10. ボリュームを再度マウントしファイルシステムの拡張を完了させるため、Harbor Redis StatefulSet のレプリカを 1 にスケールアップします。
    kubectl scale sts <harbor-redis-statefulset名> -n <harbor-namespace名> --replicas=1
  11. Redis pod の /var/lib/redis の Size が 18G に増加したことを確認します。
    ※Redis pod 名は、手順2で確認したものを使用します
    kubectl exec -it <harbor-redis-pod名> -n <harbor-namespace名> -- df -h
    出力例:
    Filesystem     Size  Used Avail Use% Mounted on
    overlay        253M   13M  239M   6% /
    tmpfs           64M     0   64M   0% /dev
    shm             64M     0   64M   0% /dev/shm
    /dev/sda       253M   13M  239M   6% /dev/termination-log
    /dev/sdb        18G   48K   18G   1% /var/lib/redis
  12. Redis pod が正常に起動し、Harbor への接続が復旧したことを確認します。

Additional Information

注:vSphere 8.x 環境の場合は「Expansion for registry PV for Harbor as as supervisor service」の手順を実施してください