# Setup with Kubernetes (K8s) - Seafile Admin Manual
Author: seafile

Skip to content

# Setup with Kubernetes

This manual explains how to deploy and run Seafile Server on a Linux server using Kubernetes (k8s thereafter).

## Gettings started

The two volumes for persisting data, `/opt/seafile-data` and `/opt/seafile-mysql`, are still adopted in this manual. What's more, all k8s YAML files will be placed in `/opt/seafile-k8s-yaml`. It is not recommended to change these paths. If you do, account for it when following these instructions.

## Install kubectl and k8s control plane

The two tools, kubectl and a k8s control plane tool (i.e., kubeadm), are required and can be installed with official installation guide.

Note that if it is a multi-node deployment, k8s control plane needs to be installed on each node. After installation, you need to start the k8s control plane service on each node and refer to the k8s official manual for creating a cluster. Since this manual still uses the same image as docker deployment, we need to add the following repository to k8s:

    kubectl create secret docker-registry regcred --docker-server=docker.seadrive.org/seafileltd --docker-username=seafile --docker-password=zjkmid6rQibdZ=uJMuWS

## YAML

Seafile mainly involves three different services, namely database service, cache service and seafile service. Since these three services do not have a direct dependency relationship, we need to separate them from the entire docker-compose.yml (in this manual, we use Seafile 11 PRO) and divide them into three pods. For each pod, we need to define a series of YAML files for k8s to read, and we will store these YAMLs in `/opt/seafile-k8s-yaml`. This series of YAML mainly includes Deployment for pod management and creation, Service for exposing services to the external network, PersistentVolume for defining the location of a volume used for persistent storage on the host and Persistentvolumeclaim for declaring the use of persistent storage in the container. For futher configuration details, you can refer the official documents.

### mariadb

#### mariadb-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mariadb
    spec:
      selector:
        matchLabels:
          app: mariadb
      replicas: 1
      template:
        metadata:
          labels:
            app: mariadb
        spec:
          containers:
            - name: mariadb
              image: mariadb:10.11
              env:
                - name: MARIADB_ROOT_PASSWORD
                  value: "db_dev"
                - name: MARIADB_AUTO_UPGRADE
                  value: "true"
              ports:
                - containerPort: 3306
              volumeMounts:
                - name: mariadb-data
                  mountPath: /var/lib/mysql
          volumes:
            - name: mariadb-data
              persistentVolumeClaim:
                claimName: mariadb-data

Please replease `MARIADB_ROOT_PASSWORD` to your own mariadb password. In the above Deployment configuration file, no restart policy for the pod is specified. The default restart policy is Always. If you need to modify it, add the following to the spec attribute:

    restartPolicy: OnFailure

    #Note:
    #    Always: always restart (include normal exit)
    #    OnFailure: restart only with unexpected exit
    #    Never: do not restart

#### mariadb-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mariadb
    spec:
      selector:
        app: mariadb
      ports:
        - protocol: TCP
          port: 3306
          targetPort: 3306

#### mariadb-persistentvolume.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mariadb-data
    spec:
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: /opt/seafile-mysql/db

#### mariadb-persistentvolumeclaim.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mariadb-data
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi

### memcached

#### memcached-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: memcached
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: memcached
      template:
        metadata:
          labels:
            app: memcached
        spec:
          containers:
            - name: memcached
              image: memcached:1.6.18
              args: ["-m", "256"]
              ports:
                - containerPort: 11211

#### memcached-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: memcached
    spec:
      selector:
        app: memcached
      ports:
        - protocol: TCP
          port: 11211
          targetPort: 11211

### Seafile

#### seafile-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: seafile
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: seafile
      template:
        metadata:
          labels:
            app: seafile
        spec:
          containers:
            - name: seafile
              #        image: seafileltd/seafile-mc:9.0.10
              #        image: seafileltd/seafile-mc:11.0-latest
              image: docker.seadrive.org/seafileltd/seafile-pro-mc:11.0-latest
              env:
                - name: DB_HOST
                  value: "mariadb"
                - name: DB_ROOT_PASSWD
                  value: "db_dev" #db's password
                - name: TIME_ZONE
                  value: "Europe/Berlin"
                - name: SEAFILE_ADMIN_EMAIL
                  value: "admin@seafile.com" #admin email
                - name: SEAFILE_ADMIN_PASSWORD
                  value: "admin_password" #admin password
                - name: SEAFILE_SERVER_LETSENCRYPT
                  value: "false"
                - name: SEAFILE_SERVER_HOSTNAME
                  value: "you_seafile_domain" #hostname
              ports:
                - containerPort: 80
              #        - containerPort: 443
              #          name:  seafile-secure
              volumeMounts:
                - name: seafile-data
                  mountPath: /shared
          volumes:
            - name: seafile-data
              persistentVolumeClaim:
                claimName: seafile-data
          restartPolicy: Always
          # to get image from protected repository
          imagePullSecrets:
            - name: regcred

Please replease the above configurations, such as database root password, admin in seafile.

#### seafile-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: seafile
    spec:
      selector:
        app: seafile
      type: LoadBalancer
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30000

#### seafile-persistentvolume.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: seafile-data
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: /opt/seafile-data

#### seafile-persistentvolumeclaim.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: seafile-data
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi

## Deploy pods

You can use following command to deploy pods:

    kubectl apply -f /opt/seafile-k8s-yaml/

## Container management

Similar to docker installation, you can also manage containers through some kubectl commands. For example, you can use the following command to check whether the relevant resources are started successfully and whether the relevant services can be accessed normally. First, execute the following command and remember the pod name with `seafile-` as the prefix (such as seafile-748b695648-d6l4g)

    kubectl get pods

You can check a status of a pod by

    kubectl logs seafile-748b695648-d6l4g

and enter a container by

    kubectl exec -it seafile-748b695648-d6l4g --  bash

If you modify some configurations in `/opt/seafile-data/conf` and need to restart the container, the following command can be refered:

    kubectl delete deployments --all
    kubectl apply -f /opt/seafile-k8s-yaml/