From: zacanger Date: Mon, 7 Oct 2019 18:20:03 +0000 (-0600) Subject: feat(ops): k8s X-Git-Url: http://these/git/%24%7BgetStaticDir%28%29%7D/styles/%7BmarkdownHelpUrl%7D?a=commitdiff_plain;h=ab139995bd77effaa50289a68b0222cbf0c2c988;p=lemmy.git feat(ops): k8s --- diff --git a/README.md b/README.md index 5e7d879c..afa345c1 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Front Page|Post - Open source, [AGPL License](/LICENSE). - Self hostable, easy to deploy. - - Comes with [Docker](#docker), [Ansible](#ansible). + - Comes with [Docker](#docker), [Ansible](#ansible), [Kubernetes](#kubernetes). - Live-updating Comment threads. - Full vote scores `(+/-)` like old reddit. - Moderation abilities. @@ -112,6 +112,31 @@ nano inventory # enter your server, domain, contact email ansible-playbook lemmy.yml --become ``` +### Kubernetes + +You'll need to have an existing Kubernetes cluster and [storage class](https://kubernetes.io/docs/concepts/storage/storage-classes/). +Setting this up will vary depending on your provider. +To try it locally, you can use [MicroK8s](https://microk8s.io/) or [Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/). + +Once you have a working cluster, edit the environment variables and volume sizes in `docker/k8s/*.yml`. +You may also want to change the service types to use `LoadBalancer`s depending on where you're running your cluster (add `type: LoadBalancer` to `ports)`, or `NodePort`s. +By default they will use `ClusterIP`s, which will allow access only within the cluster. See the [docs](https://kubernetes.io/docs/concepts/services-networking/service/) for more on networking in Kubernetes. + +**Important** Running a database in Kubernetes will work, but is generally not recommended. +If you're deploying on any of the common cloud providers, you should consider using their managed database service instead (RDS, Cloud SQL, Azure Databse, etc.). + +Now you can deploy: + +```bash +# Add `-n foo` if you want to deploy into a specific namespace `foo`; +# otherwise your resources will be created in the `default` namespace. +kubectl apply -f docker/k8s/db.yml +kubectl apply -f docker/k8s/pictshare.yml +kubectl apply -f docker/k8s/lemmy.yml +``` + +If you used a `LoadBalancer`, you should see it in your cloud provider's console. + ## Develop ### Docker Development diff --git a/docker/k8s/db.yml b/docker/k8s/db.yml new file mode 100644 index 00000000..4b78a8c5 --- /dev/null +++ b/docker/k8s/db.yml @@ -0,0 +1,48 @@ +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + labels: + lemmy.service: db + name: db +spec: + replicas: 1 + strategy: + type: Recreate + template: + metadata: + labels: + lemmy.service: db + spec: + containers: + - env: + - name: POSTGRES_DB + value: lemmy + - name: POSTGRES_PASSWORD + # example: very-good-password + value: CHANGE_ME + - name: POSTGRES_USER + value: lemmy + image: postgres:12-alpine + name: db + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: db + restartPolicy: Always + volumes: + - name: db + persistentVolumeClaim: + claimName: db +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + lemmy.service: db + name: db +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi diff --git a/docker/k8s/lemmy.yml b/docker/k8s/lemmy.yml new file mode 100644 index 00000000..f05b172e --- /dev/null +++ b/docker/k8s/lemmy.yml @@ -0,0 +1,46 @@ +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + labels: + lemmy.service: lemmy + name: lemmy +spec: + replicas: 1 + template: + metadata: + labels: + lemmy.service: lemmy + spec: + containers: + - env: + - name: DATABASE_URL + # example: 'postgres://lemmy:password@db:5432/lemmy' + value: CHANGE_ME + - name: HOSTNAME + # example: 'lemmy.example.com' + value: CHANGE_ME + - name: JWT_SECRET + # example: 'very-super-good-secret' + value: CHANGE_ME + - name: LEMMY_FRONT_END_DIR + value: /app/dist + image: dessalines/lemmy:v0.2.0.1 + name: lemmy + ports: + - containerPort: 8536 + restartPolicy: Always +--- +apiVersion: v1 +kind: Service +metadata: + labels: + lemmy.service: lemmy + name: lemmy +spec: + ports: + - name: "8536" + port: 8536 + targetPort: 8536 + selector: + lemmy.service: lemmy diff --git a/docker/k8s/pictshare.yml b/docker/k8s/pictshare.yml new file mode 100644 index 00000000..1209e83e --- /dev/null +++ b/docker/k8s/pictshare.yml @@ -0,0 +1,57 @@ +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + labels: + lemmy.service: pictshare + name: pictshare +spec: + replicas: 1 + strategy: + type: Recreate + template: + metadata: + labels: + lemmy.service: pictshare + spec: + containers: + - image: hascheksolutions/pictshare:latest + name: pictshare + ports: + - containerPort: 80 + volumeMounts: + - mountPath: /usr/share/nginx/html/data + name: pictshare + restartPolicy: Always + volumes: + - name: pictshare + persistentVolumeClaim: + claimName: pictshare +--- +apiVersion: v1 +kind: Service +metadata: + labels: + lemmy.service: pictshare + name: pictshare +spec: + ports: + - name: "8537" + port: 8537 + targetPort: 80 + selector: + lemmy.service: pictshare +status: +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + lemmy.service: pictshare + name: pictshare +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi