# lokistack 平台:中断预算 + 备份定时任务 # # 为什么单副本还要 PDB: # PDB minAvailable: 0 不保护"不中断",它的作用是让**节点排空(drain)**时 # 集群知道"这个工作负载可以被驱逐,但请一次性驱逐完,别卡住维护流程", # 并让 `kubectl drain` 正确等待 Pod 重建。没有 PDB 时 drain 会直接删 Pod, # 配合 Recreate 策略可能出现"旧 Pod 已删、新 Pod 还没起"的空窗无人知晓。 # # ⚠️ 不要改成 minAvailable: 1 —— replicas 恒为 1,那会让 drain 永远失败。 apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: lokistack namespace: log spec: minAvailable: 0 selector: matchLabels: app: lokistack --- # 每日自动备份(导出 tar.gz 到 PVC 的 backups/ 目录,保留最近 7 份)。 # # 为什么要 CronJob 而不是靠平台自己: # 平台进程挂了就没人备份,备份必须由 K8s 托管、独立于应用生命周期。 # 备份内容:DB + kubeconfigs/ + known_hosts/,不含明文密钥。 # 恢复:kubectl -n log exec deploy/lokistack -- /app/lokistack restore <文件> # 或页面「系统 → 备份与恢复」上传。 apiVersion: batch/v1 kind: CronJob metadata: name: lokistack-backup namespace: log spec: schedule: "30 3 * * *" # 每天 03:30 concurrencyPolicy: Forbid successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 3 jobTemplate: spec: backoffLimit: 2 template: spec: restartPolicy: OnFailure securityContext: runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 containers: - name: backup image: lghost/lokistack:latest imagePullPolicy: Always command: ["/bin/sh", "-c"] args: - | set -e mkdir -p /app/data/backups TS=$(date +%Y%m%d-%H%M%S) OUT=/app/data/backups/lokistack-$TS.tar.gz # 用平台自带命令导出(保证 manifest / 密钥指纹口径一致) /app/lokistack backup --output "$OUT" || { echo "备份失败"; exit 1; } echo "已生成 $OUT ($(du -h "$OUT" | cut -f1))" # 只保留最近 7 份 ls -1t /app/data/backups/lokistack-*.tar.gz 2>/dev/null | tail -n +8 | xargs -r rm -f ls -1t /app/data/backups/lokistack-*.tar.gz | head -3 volumeMounts: - name: data mountPath: /app/data resources: requests: {cpu: 50m, memory: 64Mi} limits: {cpu: 500m, memory: 512Mi} volumes: - name: data persistentVolumeClaim: claimName: lokistack-data