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.
Multi-node deployment
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=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 12 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
.
Note
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_password"
- 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.
Tip
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: seafileltd/seafile-pro-mc:12.0-latest
env:
- name: DB_HOST
value: "mariadb"
- name: DB_ROOT_PASSWD
value: "db_password" #db's password
- name: TIME_ZONE
value: "Europe/Berlin"
- name: INIT_SEAFILE_ADMIN_EMAIL
value: "admin@seafile.com" #admin email
- name: INIT_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
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/