Vererbung¶
Was ist Block-Vererbung?¶
Block-Vererbung ermöglicht die Wiederverwendung und Anpassung von bestehenden Blocks. Ein Block, der in der workspace.poly instanziiert wird, kann von einem Template-Block erben und dessen Eigenschaften übernehmen:
- Konfiguration (
config) – wird per Deep-Merge zusammengeführt - Actions – können überschrieben oder erweitert werden
- Working Directory – wird auf den Template-Block gesetzt
Vererbung ist auf EIN Level beschränkt
Die from:-Angabe erfolgt ausschließlich in der workspace.poly, nicht in der block.poly. Ein Block in der workspace.poly kann von einem Template-Block in der blocks/-Directory erben – mehr Vererbungsebenen gibt es nicht.
Vererbungs-Hierarchie¶
graph LR
subgraph "blocks/ Directory"
Template[Template-Block<br/>postgres-base/block.poly]
end
subgraph "workspace.poly"
Instance[Block-Instanz<br/>my-postgres]
end
Template -->|from: postgres-base| Instance
style Template fill:#e1f5fe
style Instance fill:#c8e6c9 Wichtig: Es gibt nur EIN Level der Vererbung:
- Template-Block (
blocks/postgres-base/block.poly) – definiert Actions, Config-Defaults, Playbooks - Block-Instanz (
workspace.poly) – erbt viafrom:und überschreibt bei Bedarf
Vererbung definieren¶
Template-Block (block.poly)¶
Ein Template-Block definiert die Basis-Funktionalität:
# blocks/postgres-base/block.poly
name: postgres-base
kind: k8sapp
version: 1.0.0
config:
namespace: default
app:
persistence:
size: 10Gi
storageClass: standard
replicas: 1
actions:
- name: install
playbook: playbooks/install.yml
- name: backup
playbook: playbooks/backup.yml
Block-Instanz (workspace.poly)¶
In der workspace.poly wird der Template-Block instanziiert und angepasst:
# workspace.poly
blocks:
- name: my-postgres
from: postgres-base # Erbt von lokalem Template-Block
config:
namespace: production # Override
app:
persistence:
size: 100Gi # Override
- name: harbor
from: registry.my-org.com/blocks/k8s/harbor:1.2.0 # Erbt von Registry-Block
config:
namespace: harbor-prod
Registry-Blocks
Bei from: cargo.ayedo.cloud/... wird der Block automatisch von der Registry gepullt und als Template verwendet.
Merge-Verhalten¶
Beim Zusammenführen (Merge) der Konfigurationen gilt:
graph LR
Template[Template-Block Config] --> Merge[Deep Merge]
Instance[Block-Instanz Config] --> Merge
Merge --> Result[Resultierende Config] Wichtig: Instanz-Werte überschreiben Template-Werte!
Beispiel: Config-Merge¶
Template-Block (blocks/postgres-base/block.poly):
name: postgres-base
config:
namespace: default
app:
persistence:
size: 10Gi
storageClass: standard
replicas: 1
Block-Instanz (workspace.poly):
blocks:
- name: my-postgres
from: postgres-base
config:
namespace: production
app:
persistence:
size: 50Gi
Resultierende Config (Workspace Snapshot):
# my-postgres nach Merge
config:
namespace: production # überschrieben
app:
persistence:
size: 50Gi # überschrieben
storageClass: standard # geerbt
replicas: 1 # geerbt
Actions vererben und überschreiben¶
Actions werden ebenfalls vererbt, können aber in der Block-Instanz überschrieben werden:
Template-Block (blocks/postgres-base/block.poly):
actions:
- name: install
playbook: playbooks/install.yml
- name: backup
playbook: playbooks/backup.yml
Block-Instanz (workspace.poly):
blocks:
- name: my-postgres
from: postgres-base
actions:
- name: install
playbook: playbooks/custom-install.yml # Überschreibt Template-Action
- name: migrate
playbook: playbooks/migrate.yml # Neue Action
Resultat: Die Block-Instanz my-postgres hat drei Actions:
install(überschrieben mit custom-install.yml)backup(geerbt vom Template-Block)migrate(neu hinzugefügt)
Inventory und Kubeconfig referenzieren¶
Block-Instanzen können Inventory und Kubeconfig von anderen Blocks im Workspace referenzieren:
# workspace.poly
blocks:
- name: my-cluster
from: registry.my-org.com/blocks/k8s/cluster:1.0.0
- name: infrastructure
# Generiert inventory.yml
- name: my-app
from: registry.my-org.com/blocks/k8s/my-app:1.0.0
kubeconfig:
from: my-cluster # Nutzt Kubeconfig von Block "my-cluster"
inventory:
from: infrastructure # Nutzt Inventory von Block "infrastructure"
Dies ist besonders nützlich, wenn mehrere Blocks dasselbe Ziel-Cluster oder dieselbe Infrastruktur nutzen.
Unterschied zu from:
kubeconfig.from und inventory.from referenzieren Artefakte anderer Blocks, nicht deren Konfiguration. Das ist kein Vererbungsmechanismus, sondern eine Referenzierung.
Best Practices¶
1. Template-Blocks erstellen¶
Erstellen Sie wiederverwendbare Template-Blocks in der blocks/ Directory:
# blocks/postgres-template/block.poly
name: postgres-template
kind: k8sapp
version: 1.0.0
config:
# Sinnvolle Defaults
namespace: default
persistence:
enabled: true
size: 10Gi
monitoring:
enabled: true
actions:
- name: install
playbook: playbooks/install.yml
- name: backup
playbook: playbooks/backup.yml
2. Sinnvolle Overrides in workspace.poly¶
Überschreiben Sie nur das Nötigste:
# workspace.poly
blocks:
# ✅ Gut: Nur spezifische Werte überschreiben
- name: my-postgres-prod
from: postgres-template
config:
namespace: production
persistence:
size: 100Gi
# ❌ Schlecht: Gesamte Config wiederholen
- name: my-postgres-bad
from: postgres-template
config:
namespace: production
persistence:
enabled: true # Unnötig, wird geerbt
size: 100Gi
monitoring:
enabled: true # Unnötig, wird geerbt
3. Registry-Blocks verwenden¶
Für produktionsreife Blocks empfehlen wir die Verwendung von Registry-Blocks:
# workspace.poly
blocks:
- name: my-harbor
from: registry.my-org.com/blocks/k8s/harbor:1.2.0
config:
namespace: harbor-production
Polycrate pulled den Block automatisch von der Registry und verwendet ihn als Template.
Working Directory
Bei der Ausführung einer Action wird die Working Directory auf die des Template-Blocks gesetzt. Playbooks und Scripts werden relativ zum Template-Block-Verzeichnis ausgeführt.