Zum Hauptinhalt springen
Kubernetes

Zwei oder mehr Replikas hinter einem ClusterIP-Service, nur von Ihrem Back-End erreichbar.

Markdown

Voraussetzungen​

  • Ein Kubernetes-Cluster und kubectl-Zugriff darauf.
  • Eine PostgreSQL-Datenbank, die ausschließlich Human Plugin vorbehalten und vom Cluster aus erreichbar ist. Siehe Voraussetzungen und Zugang.
  • Die Registry-Zugangsdaten und der Zugriffsschlüssel von Unico.

Alles Folgende gehört in einen eigenen Namespace:

kubectl create namespace human-plugin

1. Registry-Pull-Secret​

kubectl -n human-plugin create secret docker-registry unico-registry \
--docker-server=pkg.unico.run \
--docker-username="<username>" \
--docker-password="<token>"

2. Secret für die Einstellungen​

kubectl -n human-plugin create secret generic human-plugin \
--from-literal=HUMAN_API_ACCESS_KEY='<your access key>' \
--from-literal=POSTGRES_ADDRESS_HOST='<database host>' \
--from-literal=POSTGRES_USER='human_plugin' \
--from-literal=POSTGRES_PASSWORD='<database password>'

Fügen Sie POSTGRES_ADDRESS_PORT, POSTGRES_DATABASE oder POSTGRES_SSL_MODE nur hinzu, wenn Ihre Datenbank von den Standardwerten in Konfiguration abweicht. Wenn Sie Secrets mit einem anderen Werkzeug verwalten (External Secrets, Sealed Secrets, ein Vault), erstellen Sie dieselben Schlüssel damit. Committen Sie niemals ein Secret-Manifest mit Werten.

3. Deployment und Service​

human-plugin.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: human-plugin
namespace: human-plugin
spec:
replicas: 2
selector:
matchLabels: { app: human-plugin }
template:
metadata:
labels: { app: human-plugin }
spec:
terminationGracePeriodSeconds: 60
imagePullSecrets:
- name: unico-registry
containers:
- name: human-plugin
image: pkg.unico.run/human-plugin-api:latest
imagePullPolicy: Always
ports:
- { name: http, containerPort: 8080 }
envFrom:
- secretRef: { name: human-plugin }
resources:
requests: { cpu: "1", memory: 1Gi }
limits: { cpu: "1", memory: 1Gi }
readinessProbe:
httpGet: { path: /health/ready, port: http }
timeoutSeconds: 5
livenessProbe:
httpGet: { path: /health/live, port: http }
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: human-plugin
namespace: human-plugin
spec:
selector: { app: human-plugin }
ports:
- { name: http, port: 8080, targetPort: http }
kubectl apply -f human-plugin.yaml
kubectl -n human-plugin rollout status deployment/human-plugin
  • replicas: 2: Die Replikas teilen sich die Datenbank, Sie können also so viele betreiben, wie Sie benötigen. Zwei halten Human Plugin verfügbar, während eines neu startet.
  • terminationGracePeriodSeconds: 60: Human Plugin wartet beim Stoppen bis zu 55 Sekunden auf laufende Anfragen. Der Kubernetes-Standard von 30 Sekunden kann ein create abbrechen.
  • imagePullPolicy: Always: Mit dem Tag latest lädt jeder neue Pod das aktuellste Release.
  • Probes: Readiness hält Datenverkehr von einem Replikat fern, bis seine Datenbank antwortet, und timeoutSeconds: 5 lässt sie fehlschlagen, wenn die Datenbank nicht mehr antwortet. Siehe Health und Monitoring.
  • Ressourcen: Die obigen Werte sind das Minimum pro Replikat. Siehe Hardwareanforderungen.

4. Zugriff einschränken​

Ihr Back-End erreicht Human Plugin unter http://human-plugin.human-plugin.svc:8080. Human Plugin hat keine eigene Authentifizierung, daher gilt:

  • Stellen Sie den Service nicht über einen Ingress, einen LoadBalancer oder einen NodePort bereit;
  • erlauben Sie mit einer NetworkPolicy nur den Namespace Ihres Back-Ends.
network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: human-plugin-allow-backend
namespace: human-plugin
spec:
podSelector:
matchLabels: { app: human-plugin }
policyTypes: [Ingress]
ingress:
- from:
- namespaceSelector:
matchLabels: { kubernetes.io/metadata.name: <your back-end namespace> }
ports:
- { port: 8080 }

Human Plugin selbst benötigt ausgehendes HTTPS zu Unico und Zugriff auf Ihre Datenbank. Siehe Netzwerk und Sicherheit.

5. Validieren​

kubectl -n human-plugin port-forward svc/human-plugin 8080:8080

Prüfen Sie in einem anderen Terminal die Readiness und führen Sie die create-Anfrage aus dem Quickstart gegen http://127.0.0.1:8080 aus:

curl --fail http://127.0.0.1:8080/health/ready

Logs​

kubectl -n human-plugin logs deploy/human-plugin --since=10m

Aktualisieren​

kubectl -n human-plugin rollout restart deployment/human-plugin

Die neuen Pods laden das neueste Image und ersetzen die alten nacheinander, sobald sie bereit sind. Siehe Betrieb.