跳转至

思源笔记 k8s 部署

1. 前置条件

  • 一个能运作的 k8s 集群
  • 相关容器镜像上传到镜像仓库
  • k8s 配置好私有镜像仓库凭证
  • k8s 上至少有一个 default storage class

2. 创建 pvc 来提供持久化存储

首先创建 pvc 来为思源笔记提供持久化存储:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: siyuan-pandoc-monitor
  namespace: siyuan-pandoc
  labels:
    app: siyuan-pandoc-monitor
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

3. 创建 deployment 来部署 pod

然后使用此 yaml 部署 deployment:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: siyuan-pandoc-monitor
  name: siyuan-pandoc-monitor
  namespace: siyuan-pandoc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: siyuan-pandoc-monitor
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: siyuan-pandoc-monitor
    spec:
      containers:
        - args:
            - -c
            - /opt/siyuan/kernel --workspace=/siyuan/workspace
          command:
            - /bin/sh
          env:
            - name: SIYUAN_ACCESS_AUTH_CODE_BYPASS
              value: "true"
          image: 192.168.100.12:8082/siyuan-pandoc:v3.0.9
          imagePullPolicy: IfNotPresent
          name: siyuan-pandoc-monitor
          ports:
            - containerPort: 6806
              name: web
              protocol: TCP
          volumeMounts:
            - mountPath: /siyuan/workspace
              name: siyuan-pandoc-monitor
      imagePullSecrets:
        - name: nexus-regcred
      securityContext:
        fsGroup: 1000
      tolerations:
        - effect: NoExecute
          key: node.kubernetes.io/not-ready
          operator: Exists
          tolerationSeconds: 10
        - effect: NoExecute
          key: node.kubernetes.io/unreachable
          operator: Exists
          tolerationSeconds: 10
      volumes:
        - name: siyuan-pandoc-monitor
          persistentVolumeClaim:
            claimName: siyuan-pandoc-monitor

特别需要注意,思源笔记只能单 pod 运行,第一个 pod 启动后,会给笔记的目录加锁,第二个 pod 启动的时候看到目录被加锁就会启动报错,因此只能部署 1 个 pod ,而且需要将 strategy.type 设置为 Recreate ,否则 rollout restart deployment 的时候,会先创建一个新的 pod ,新 pod 会永远 CrashLoopbackOff 。修改之后 rollout restart 时会先把 pod 杀掉然后启动新的 pod 。同时, k8s 默认设置下,如果节点宕机, pod 会忍耐节点 5 分钟才会迁移,这在单 pod 部署的情况下宕机会出现 5 分钟服务不可用,需要修改 tolerations 那里来将这个 5 分钟缩短为 10 秒。

4. 创建 service 来暴露服务

最后需要将思源笔记服务暴露,创建 service :

---
apiVersion: v1
kind: Service
metadata:
  name: siyuan-pandoc-monitor
  namespace: siyuan-pandoc
  labels:
    app: siyuan-pandoc-monitor
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 6806
      name: web
  selector:
    app: siyuan-pandoc-monitor

如果思源笔记在集群访问就可以,可以将 spec.type 修改为 ClusterIP