Add platform infrastructure configuration

This commit is contained in:
donghyeon-ka
2026-08-28 17:35:41 +09:00
parent fa76531e5b
commit 16c337bcc9
302 changed files with 83259 additions and 1 deletions
@@ -0,0 +1,33 @@
# SSD 정적 Local PersistentVolume
첫 배포에서는 서버의 루트 SSD에 워크로드별 Local PV 두 개를 예약한다.
| 워크로드 | StorageClass | 로컬 경로 | 선언 용량 |
| --- | --- | --- | ---: |
| 플랫폼 PostgreSQL | `ssd-local-postgres-retain` | `/srv/k3s/ssd/platform-postgres` | `20Gi` |
| Gitea | `ssd-local-gitea-retain` | `/srv/k3s/ssd/gitea` | `50Gi` |
별도의 StorageClass를 사용하여 PostgreSQL의 20 GiB Claim이 Gitea의 50 GiB 볼륨에
잘못 바인딩되는 것을 방지한다. `WaitForFirstConsumer`를 사용하면 Scheduler가
Local PV의 node affinity를 반영할 수 있다. 두 PV 모두 `Retain`을 사용하므로
Claim을 삭제해도 디스크의 데이터는 삭제되지 않는다.
PVC는 의도적으로 이 인프라 디렉터리가 아니라 소유자와 함께 둔다.
- CloudNativePG는 `Cluster`의 storage 명세에서 PostgreSQL 인스턴스 PVC를 생성한다.
이 PVC는 `ssd-local-postgres-retain``20Gi`를 요청해야 한다.
- Gitea 서비스 배포가 직접 또는 공식 Chart를 통해 자체 PVC를 소유한다. 이 PVC는
`ssd-local-gitea-retain``50Gi`를 요청해야 한다.
PV를 생성하기 전에 `scripts/bootstrap/prepare-ssd-local-paths.sh`를 수동으로
실행한다. 이 스크립트는 `/srv`가 루트 파일시스템에 있는지 확인한 후 정확히 두
디렉터리만 준비한다.
Local PV의 `capacity` 필드는 바인딩 메타데이터이며 파일시스템 quota가 아니다.
PostgreSQL과 Gitea는 루트 SSD의 여유 공간을 공유한다. 루트 파일시스템을
모니터링하고, 하드 제한이 필요해지면 파일시스템 또는 블록 장치 quota를 별도로
추가한다.
Local PV는 이 워크로드들을 `donghyeon-system-product-name` 노드에 종속시킨다.
`Retain`은 자동 파일 삭제를 막지만 백업이나 고가용성을 제공하지 않는다. Released
상태의 PV를 재사용하는 작업은 명시적인 복구 절차로 수행해야 한다.
@@ -0,0 +1,26 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: gitea-local-pv
labels:
app.kubernetes.io/part-of: platform
app.kubernetes.io/component: source-control
platform.hyeonworks.com/storage-tier: ssd
spec:
capacity:
storage: 50Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: ssd-local-gitea-retain
local:
path: /srv/k3s/ssd/gitea
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- donghyeon-system-product-name
@@ -0,0 +1,7 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- storage-classes.yaml
- platform-postgres-pv.yaml
- gitea-pv.yaml
@@ -0,0 +1,26 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: platform-postgres-local-pv
labels:
app.kubernetes.io/part-of: platform
app.kubernetes.io/component: database
platform.hyeonworks.com/storage-tier: ssd
spec:
capacity:
storage: 20Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: ssd-local-postgres-retain
local:
path: /srv/k3s/ssd/platform-postgres
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- donghyeon-system-product-name
@@ -0,0 +1,23 @@
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ssd-local-postgres-retain
labels:
app.kubernetes.io/part-of: platform
platform.hyeonworks.com/storage-tier: ssd
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: false
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ssd-local-gitea-retain
labels:
app.kubernetes.io/part-of: platform
platform.hyeonworks.com/storage-tier: ssd
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: false