feat(ops): k8s

This commit is contained in:
zacanger 2019-10-07 12:20:03 -06:00
parent 753fa8829e
commit ab139995bd
4 changed files with 177 additions and 1 deletions

27
README.md vendored
View file

@ -27,7 +27,7 @@ Front Page|Post
- Open source, [AGPL License](/LICENSE). - Open source, [AGPL License](/LICENSE).
- Self hostable, easy to deploy. - Self hostable, easy to deploy.
- Comes with [Docker](#docker), [Ansible](#ansible). - Comes with [Docker](#docker), [Ansible](#ansible), [Kubernetes](#kubernetes).
- Live-updating Comment threads. - Live-updating Comment threads.
- Full vote scores `(+/-)` like old reddit. - Full vote scores `(+/-)` like old reddit.
- Moderation abilities. - Moderation abilities.
@ -112,6 +112,31 @@ nano inventory # enter your server, domain, contact email
ansible-playbook lemmy.yml --become 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 ## Develop
### Docker Development ### Docker Development

48
docker/k8s/db.yml vendored Normal file
View file

@ -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

46
docker/k8s/lemmy.yml vendored Normal file
View file

@ -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

57
docker/k8s/pictshare.yml vendored Normal file
View file

@ -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