文档部署

Rust · 0.1.0

Kubernetes 部署

在集群中落实容器的存储和配置约定。

保持相同的应用约定

将有权使用的源码构建为自己的镜像,推送到集群可访问的镜像仓库。在 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