kubernetes: add separate docs directory and update immich manifests
All checks were successful
ci/woodpecker/push/demo-workflow Pipeline was successful
All checks were successful
ci/woodpecker/push/demo-workflow Pipeline was successful
This commit is contained in:
151
doc/proxmox_storage_concepts.md
Normal file
151
doc/proxmox_storage_concepts.md
Normal file
@ -0,0 +1,151 @@
|
||||
# Proxmox LVM Architecture and Concepts
|
||||
|
||||
## 1. Overview of LVM
|
||||
|
||||
Logical Volume Manager (LVM) provides a flexible storage management layer
|
||||
between physical disks and file systems. It allows administrators to allocate,
|
||||
resize, and manage storage dynamically, without the limitations of fixed disk
|
||||
partitions.
|
||||
|
||||
The storage hierarchy under LVM is as follows:
|
||||
|
||||
Physical Volume (PV) → Volume Group (VG) → Logical Volume (LV)
|
||||
|
||||
Each layer abstracts the one beneath it to provide logical storage that can be
|
||||
managed independently of the physical disk structure.
|
||||
|
||||
## 2. Core LVM Components
|
||||
|
||||
a. Physical Volume (PV)
|
||||
|
||||
A Physical Volume represents a raw storage device (such as a disk or a
|
||||
partition) that LVM can manage.
|
||||
|
||||
It is initialized for use with the command:
|
||||
|
||||
pvcreate /dev/sda2
|
||||
|
||||
This prepares the partition /dev/sda2 as LVM-capable storage.
|
||||
|
||||
b. Volume Group (VG)
|
||||
|
||||
A Volume Group is a pool of storage composed of one or more Physical Volumes.
|
||||
It aggregates multiple disks or partitions into a single logical storage space.
|
||||
Example:
|
||||
|
||||
vgcreate pve /dev/sda2
|
||||
|
||||
In Proxmox, the default Volume Group created during installation is typically
|
||||
named pve. Once created, Logical Volumes can be allocated from this group.
|
||||
|
||||
c. Logical Volume (LV)
|
||||
|
||||
A Logical Volume functions like a virtual partition carved from a Volume Group.
|
||||
It behaves like a standard block device and can be formatted, mounted, or used
|
||||
for virtual machine disks.
|
||||
|
||||
Example:
|
||||
|
||||
lvcreate -L 50G -n vm-100-disk pve
|
||||
|
||||
This command creates a 50 GB logical volume named vm-100-disk within the pve
|
||||
Volume Group.
|
||||
|
||||
In Proxmox, each virtual machine disk backed by LVM appears as an LV under
|
||||
/dev/<VG>/, for example:
|
||||
|
||||
/dev/pve/vm-100-disk-0
|
||||
|
||||
d. Thin Pool and Thin Volumes
|
||||
|
||||
A thin pool enables thin provisioning, which allows Logical Volumes to allocate
|
||||
physical space on demand rather than all at once.
|
||||
|
||||
A thin pool is created as a special Logical Volume:
|
||||
|
||||
lvcreate -L 500G -T pve/data
|
||||
|
||||
Once the pool exists, thin-provisioned LVs can be created within it:
|
||||
|
||||
lvcreate -V 100G -T pve/data -n vm-101-disk
|
||||
|
||||
Here, vm-101-disk has a logical size of 100 GB but consumes physical space only
|
||||
as data is written. This is the mechanism used by Proxmox’s “LVM-Thin” storage
|
||||
type.
|
||||
|
||||
## 3. Example: Creating an Extra LV for /var/lib/vz
|
||||
|
||||
To create a new thin-provisioned LV for /var/lib/vz, the following command is used:
|
||||
|
||||
lvcreate -n vz -V 10G pve/data
|
||||
|
||||
Explanation:
|
||||
|
||||
-n vz: Names the new LV “vz”.
|
||||
|
||||
-V 10G: Defines a virtual (thin-provisioned) size of 10 GB.
|
||||
|
||||
pve/data: Specifies that the LV should be created within the thin pool data
|
||||
inside the VG pve.
|
||||
|
||||
This creates /dev/pve/vz, a 10 GB thin-provisioned LV that can then be formatted
|
||||
and mounted:
|
||||
|
||||
mkfs.ext4 /dev/pve/vz
|
||||
mkdir /var/lib/vz
|
||||
mount /dev/pve/vz /var/lib/vz
|
||||
|
||||
This approach isolates /var/lib/vz—commonly used by Proxmox to store container
|
||||
data, ISO images, and templates—from the root filesystem.
|
||||
|
||||
4. Typical Proxmox LVM Layout
|
||||
|
||||
A standard Proxmox installation configured with LVM uses a single Volume Group
|
||||
(pve) containing several Logical Volumes:
|
||||
|
||||
/dev/sda (disk)
|
||||
└── /dev/sda2 (partition)
|
||||
└── PV → VG: pve
|
||||
├── LV: root → Mounted as /
|
||||
├── LV: swap → Used as swap space
|
||||
└── LV-Thin: data → Thin pool for VM and container disks
|
||||
├── Thin LV: vm-100-disk-0
|
||||
└── Thin LV: vm-101-disk-0
|
||||
|
||||
This structure allows the operating system, swap, and virtual machine disks to
|
||||
share a single pool of storage while maintaining isolation through logical
|
||||
volumes.
|
||||
|
||||
## 4. Example of Creating a new LVM thin pool and LV
|
||||
|
||||
To create a new LVM thin pool and a thin-provisioned logical volume,
|
||||
follow these steps:
|
||||
|
||||
1. **Create a Physical Volume (if not already done)**
|
||||
|
||||
If you have a new disk or partition to use, initialize it as a Physical Volume:
|
||||
|
||||
```bash
|
||||
pvcreate /dev/sdb1
|
||||
```
|
||||
|
||||
2. **Create a Volume Group**
|
||||
Create a new Volume Group that includes the Physical Volume:
|
||||
|
||||
```bash
|
||||
vgcreate backup /dev/sdb1
|
||||
```
|
||||
|
||||
3. **Create a Thin Pool**
|
||||
Create a thin pool within the Volume Group:
|
||||
```bash
|
||||
lvcreate -L 200G -T backup/thinpool
|
||||
```
|
||||
4. Configure the thin pool to storage.cfg
|
||||
```
|
||||
lvmthin: backup-lvm
|
||||
thinpool backup/thinpool
|
||||
vgname backup
|
||||
content rootdir,images
|
||||
nodes proxmox-node1,proxmox-node2 # List of cluster nodes
|
||||
```
|
||||
@ -1,51 +0,0 @@
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: immich-migration-db
|
||||
spec:
|
||||
serviceName: "immich-migration-db"
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: immich-migration-db
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: immich-migration-db
|
||||
spec:
|
||||
containers:
|
||||
- name: postgres
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
env:
|
||||
- name: POSTGRES_DB
|
||||
value: immich
|
||||
- name: POSTGRES_USER
|
||||
value: immich
|
||||
- name: POSTGRES_PASSWORD
|
||||
value: arsehole
|
||||
volumeMounts:
|
||||
- name: pgdata
|
||||
mountPath: /var/lib/postgresql/data
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: pgdata
|
||||
spec:
|
||||
accessModes: ["ReadWriteOnce"]
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: immich-migration-db
|
||||
spec:
|
||||
selector:
|
||||
app: immich-migration-db
|
||||
ports:
|
||||
- name: postgres
|
||||
port: 5432
|
||||
targetPort: 5432
|
||||
type: LoadBalancer
|
||||
File diff suppressed because one or more lines are too long
11
kubernetes/immich/dbBackup.yaml
Normal file
11
kubernetes/immich/dbBackup.yaml
Normal file
@ -0,0 +1,11 @@
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: ScheduledBackup
|
||||
metadata:
|
||||
name: immich-db-backup
|
||||
spec:
|
||||
immediate: true
|
||||
schedule: "0 0 0 * * *" # At midnight every day
|
||||
backupOwnerReference: self
|
||||
cluster:
|
||||
name: immich-database
|
||||
|
||||
@ -43,7 +43,7 @@ image:
|
||||
tag: v1.4.0
|
||||
supportBundleKit:
|
||||
repository: longhornio/support-bundle-kit
|
||||
tag: v0.0.17
|
||||
tag: v0.0.69
|
||||
csi:
|
||||
attacher:
|
||||
repository: longhornio/csi-attacher
|
||||
|
||||
Reference in New Issue
Block a user