免責事項:これは英文の記事 「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: ...
VMware vSphere with Tanzu 7.0
Harbor Redis ポッドのバックエンドである Persistent Volume (PV) が 100% の容量に達し、Redis がバックグラウンドスナップショット (bgsave) を保存できなくなっていることが原因です。
これにより MISCONF 状態がトリガーされ、以降のデータ書き込み操作がすべて失敗します。
vSphere 7.0 では、vSphere Client UI から組み込み Harbor レジストリのストレージ制限を拡張出来ない実装であり、標準的なオフラインでの PVC 拡張操作が行えません。
警告: この手順では Harbor Redis の StatefulSet をスケールダウンするため、Harbor レジストリへのアクセスが一時的に停止します。
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
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
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 で変更内容を保存終了します。
kubectl get sts -n <harbor-namespace名> -l component=redis
出力例:
NAME READY AGE
harbor-349###19-harbor-redis 1/1 10d
kubectl scale sts <harbor-redis-statefulset名> -n <harbor-namespace名> --replicas=0
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
kubectl patch pvc <redis-pvc名> -n <harbor-namespace名> -p '{"spec":{"resources":{"requests":{"storage":"18Gi"}}}}'kubectl get pvc <redis-pvc名> -n <harbor-namespace> -o yaml | grep FileSystemResizePending -C 2
結果の中に FileSystemResizePending が含まれることを確認します。
kubectl scale sts <harbor-redis-statefulset名> -n <harbor-namespace名> --replicas=1
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
注:vSphere 8.x 環境の場合は「Expansion for registry PV for Harbor as as supervisor service」の手順を実施してください