保持相同的应用约定
将有权使用的源码构建为自己的镜像,推送到集群可访问的镜像仓库。在 MEMOS_DATA 位置挂载持久卷,明确设置 MEMOS_PORT,并让 Service 转发到该端口。HTTP /healthz 可用于检查监听服务是否运行。在管理员账号创建完成前,不要公开首次初始化入口。
存储与更新策略
SQLite 应使用一个应用副本,并选择适合单写入者的持久卷;不要把本地数据库当成共享多写入者部署。使用网络数据库时,增加副本前应先在自己的环境验证滚动更新、数据库升级和并发访问。数据库本身不包含本地附件文件。挂载到 /etc/secrets 的文件需要符合部署配置格式,修改后重启 Pod。
验证清单
本次文档构建没有验证 Helm Chart 或实际集群安装。上线前,请测试镜像拉取、卷写入、密钥挂载、代理转发、优雅退出,以及在独立命名空间中的恢复流程。
单写入者 SQLite 模板
前提:kubectl 已连接目标集群,有默认 StorageClass,具备创建这些资源的权限,并已将授权源码构建到可访问的镜像仓库。把下面的镜像替换为自己的固定标签或摘要;私有仓库需要时另配 imagePullSecrets。保存为 memos.yaml。模板使用单副本、Recreate 更新策略、持久卷和 ClusterIP Service,适合从私有环境开始验证,不代表已测试的高可用方案。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: memos-data
labels: {app: memos}
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: memos
labels: {app: memos}
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels: {app: memos}
template:
metadata:
labels: {app: memos}
spec:
containers:
- name: memos
image: registry.example.com/your-team/memos:YOUR_COMMIT
ports:
- containerPort: 5230
env:
- {name: MEMOS_PORT, value: "5230"}
- {name: MEMOS_DATA, value: /var/opt/memos}
readinessProbe:
httpGet: {path: /healthz, port: 5230}
periodSeconds: 5
volumeMounts:
- {name: data, mountPath: /var/opt/memos}
volumes:
- name: data
persistentVolumeClaim: {claimName: memos-data}
---
apiVersion: v1
kind: Service
metadata:
name: memos
labels: {app: memos}
spec:
type: ClusterIP
selector: {app: memos}
ports:
- {port: 5230, targetPort: 5230}
私有启动并完成初始化
先在当前上下文选择独立命名空间。检查变更后应用配置,再把 Service 转发到本机回环地址。打开 http://127.0.0.1:5230,完成首次账号创建并保存一条测试笔记。就绪探针只说明健康检查可响应,不能证明登录、持久化或权限正确。验证通过前保持 Service 私有。
kubectl diff -f memos.yaml
kubectl apply -f memos.yaml
kubectl rollout status deployment/memos --timeout=180s
kubectl get pods,pvc,service -l app=memos
kubectl get pvc memos-data
kubectl port-forward --address 127.0.0.1 service/memos 5230:5230定位启动卡住的原因
ImagePullBackOff 应检查镜像名称与仓库访问;PVC 处于 Pending 应检查存储分配;进程反复退出则查看应用日志、配置和卷权限。打包入口默认先以 root 准备属主,再切换到 UID/GID 10001。如果集群策略要求容器从第一条指令开始就是非 root,需要提前准备可写卷并审核 securityContext,不要直接用 chmod 777 解决。ReadWriteOnce 是挂载访问模式,并不保证所有控制器操作都不会产生重叠写入者。此 SQLite 模板不要扩到多个副本。调整前阅读 Kubernetes 更新行为。
kubectl describe pod -l app=memos
kubectl describe pvc memos-data
kubectl logs deployment/memos --tail=100