Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Plone auf Kubernetes betreiben

Thomas Schorr
March 07, 2024
87

Plone auf Kubernetes betreiben

Vortrag auf der Plonetagung 2024 in Gießen.

Thomas Schorr

March 07, 2024
Tweet

Transcript

  1. Kubernetes als Tool zur Container-Orchestrierung • weit verbreitet • gute

    Hosting-Optionen • sehr gute Dokumentation • viele Addons/Tools • Distributionen • K3S • OpenShift • Auf dem eigenen Rechner • K3D • KinD • (minikube) • ... Plone auf Kubernetes betreiben
  2. Was braucht man im Kubernetes Cluster? • Distributed Filesystem •

    CephFS • Longhorn • optional Container-Registry • optional Integration mit Build-Pipeline • Jenkins • Gitlab CI • Tekton • ... Plone auf Kubernetes betreiben
  3. Plone - Komponenten • Frontend (optional) • Volto • Backend

    • Standard Python Package mit Abhängigkeiten: pip install Plone • ZODB Backends • FileStorage • ZEO • RelStorage • Reverse Proxy • Cacheserver (optional) Plone auf Kubernetes betreiben
  4. Plone - Ökosystem • buildout • mxdev • cookiecutter •

    official Docker Images • ... Plone auf Kubernetes betreiben
  5. Deployment - Stages • Applikationen, Applikationscode • Konfiguration • wsgi.ini

    • zope.conf • nginx.conf • default.vcl • Umgebungsvariablen Plone auf Kubernetes betreiben
  6. Kubernetes Objekte apiVersion: apps/v1 kind: Deployment metadata: name: plone6-nginx spec:

    replicas: 1 selector: matchLabels: app.kubernetes.io/name: nginx template: metadata: labels: app.kubernetes.io/name: nginx spec: containers: - name: nginx image: "nginx:latest" imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 • Deployment • ReplicaSet • Pod Plone auf Kubernetes betreiben
  7. Kubernetes Objekte apiVersion: v1 kind: Service metadata: name: plone6-nginx labels:

    app.kubernetes.io/name: nginx spec: type: ClusterIP ports: - port: 8081 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: nginx • Deployment • ReplicaSet • Pod • Service Plone auf Kubernetes betreiben
  8. Kubernetes Objekte apiVersion: v1 kind: PersistentVolumeClaim metadata: name: db-pvc spec:

    accessModes: - ReadWriteOnce resources: requests: storage: 200Mi storageClassName: longhorn volumeMode: Filesystem • Deployment • ReplicaSet • Pod • Service • PersistentVolumeClaim Plone auf Kubernetes betreiben
  9. Kubernetes Objekte apiVersion: v1 kind: PersistentVolumeClaim metadata: name: db-pvc spec:

    accessModes: - ReadWriteOnce resources: requests: storage: 200Mi storageClassName: longhorn volumeMode: Filesystem • Deployment • ReplicaSet • Pod • Service • PersistentVolumeClaim • Statefulset • ConfigMap • Secret • Ingress • Namespace Plone auf Kubernetes betreiben
  10. Pods und Container apiVersion: apps/v1 kind: Deployment metadata: name: plone6-frontend

    spec: replicas: 1 selector: matchLabels: ^^... template: metadata: labels: ^^... spec: containers: - name: frontend image: "docker.io/plone/plone-frontend:latest" imagePullPolicy: Always ports: - containerPort: 3000 protocol: TCP env: - name: "RAZZLE_INTERNAL_API_PATH" value: "http:^//plone6-backend:8080/Plone" ^^... • für Plone Deployments: 1 Container pro Pod • Patterns for Composite Containers (https://kuber- netes.io/blog/2015/06/the- distributed-system- toolkit-patterns/) Plone auf Kubernetes betreiben
  11. Kubernetes Deployment für Plone - ZODB Backends • FileStorage •

    Einzelinstanz kann jederzeit vom Cluster verschoben werden • PVC für File-/Blobstorage • Konfiguration als Statefulset denkbar • skaliert nicht • zweifelhafte Verfügbarkeit • ZEO • Clients skalierbar (Deployment) • ZEO im Cluster denkbar • nicht HA (keine Replikation) Plone auf Kubernetes betreiben
  12. Kubernetes Deployment für Plone - ZODB Backends • RelStorage mit

    PostgreSQL • Clients skalierbar (Deployment) • DB extern • Replikation • HA: PAF, Patroni • DB in Kubernetes • Replikation • HA: CloudNativePG https://cloudnative-pg.io • präferierte Lösung für aktuelles Plone • clientseitige Blobcaches als PVCs • schnellere Verfügbarkeit nach Restarts • bessere Kontrolle über Speicherbedarf der Clients (Blobs nicht im Hauptspeicher) • Restarts infolge Überschreitung von Resource Limits können vermieden werden Plone auf Kubernetes betreiben
  13. Plone Konfiguration und ConfigMaps • Applikationscode und Konfiguration trennen •

    Wiederverwendbarkeit • vereinfacht Entwicklung und Test • Änderungen einfacher und weniger störend • Anti-Pattern: Konfiguration im Container • -> Erzeugung während Container-Build nicht notwendig kind: ConfigMap apiVersion: v1 metadata: name: plone6-backend labels: helm.sh/chart: backend-0.1.0 app.kubernetes.io/name: backend app.kubernetes.io/instance: plone6 app.kubernetes.io/version: "6.0.10" app.kubernetes.io/managed-by: Helm data: zope.conf: ^|- %define INSTANCE $(INSTANCE) instancehome $INSTANCE %define CLIENTHOME $(INSTANCE)/var clienthome $CLIENTHOME debug-mode false security-policy-implementation C verbose-security off default-zpublisher-encoding utf-8 ^^... Plone auf Kubernetes betreiben
  14. Container Images • Plone 6 Official Images (plone-backend, plone-frontend) •

    Eigene Images • Anderes Basisimage • Custom Code • OpenShift Container Platform-specific guidelines https://docs.openshift.com/container- platform/4.14/openshift_images/create-images.html • https://github.com/GoogleContainerTools/distroless • ... Plone auf Kubernetes betreiben
  15. Docker Images FROM registry.access.redhat.com/ubi9/python-39:1-165 as base FROM base as builder

    ^^... ^^... [Installation / Build] ^^... FROM base USER root ^^... [Installation] COPY ^--from=builder ^^... ^^... RUN useradd default RUN chown -R default /opt/plone RUN chgrp -R 0 /opt/plone ^&& chmod -R g=u /opt/plone USER default EXPOSE 8080/tcp WORKDIR /opt/plone CMD ["bin/runwsgi", "etc/wsgi.ini"] Plone auf Kubernetes betreiben
  16. Health Checks • https://kubernetes.io/docs/tasks/configure-pod-container/configure- liveness-readiness-startup-probes/ • livenessProbe • readinessProbe •

    Checks sind pro Pod, nicht pro Service • für Plone (zumindest Backend): • nicht durch Checks Last erzeugen • unnötige Restarts vermeiden Plone auf Kubernetes betreiben
  17. Parametrisierte Deployments • Deployment -> Applikation • Helm - „Package

    Manager for Kubernetes“ • Kustomize • Kubes • CUE • ... kind: ConfigMap apiVersion: v1 metadata: name: {{ include "backend.fullname" . }} labels: {{- include "backend.labels" . | nindent 4 }} data: zope.conf: {{- .Values.zopeconf | toYaml | indent 2 }} wsgi.ini: {{- .Values.wsgiini | toYaml | indent 2 }} site.zcml: {{- .Values.sitezcml | toYaml | indent 2 }} zodbpack.conf: {{- .Values.pack.zodbpackconf | toYaml | indent 2 }} Plone auf Kubernetes betreiben
  18. Helmchart für Plone - Anforderungen • für möglichst unterschiedliche Backend-/Frontend-Images

    (official, eigene) verwendbar • Konfiguration in Umgebungsvariablen und ConfigMaps • ZODB Backend: nur RelStorage auf PostgreSQL unterstützt • CronJob für DB-Wartung • DB optional im Cluster • optionales shared Blobcache auf PVC (Filesystem muss File Locks unterstützen wie z.B. CephFS) • Nginx als Reverse Proxy optional zusätzlich zu Ingress • Varnish optional Plone auf Kubernetes betreiben
  19. Helm - Subcharts • Jede Komponente (DB, Frontend, Backend, Varnish,

    Nginx) in einem eigenen Chart • verschiedene Konfigurationen durch Kombination der Subcharts • Plone Volto • Plone Classic • Konfiguration in Subcharts kann überschrieben werden Plone auf Kubernetes betreiben
  20. Kurzfassung • ConfigMaps • ZODB Backend: Relstorage + PostgreSQL •

    Blobcache als PVC • Für Plone: 1 Container pro Pod • Helm Subcharts • https://gitlab.com/tschorr/helmcharts.plone Plone auf Kubernetes betreiben