feat(ops): k8s
This commit is contained in:
parent
d6915a09da
commit
fdad8ee086
4 changed files with 177 additions and 1 deletions
27
README.md
vendored
27
README.md
vendored
|
@ -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
|
||||
|
|
48
docker/k8s/db.yml
vendored
Normal file
48
docker/k8s/db.yml
vendored
Normal 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
46
docker/k8s/lemmy.yml
vendored
Normal 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
57
docker/k8s/pictshare.yml
vendored
Normal 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
|
Reference in a new issue