mirror of
https://github.com/KevinMidboe/kazan.git
synced 2025-10-29 09:40:14 +00:00
Init README with adding node, plugins, storage & traefik ingress
This commit is contained in:
194
README.md
Normal file
194
README.md
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
# Kazan - Kubernetes cluster
|
||||||
|
|
||||||
|
On prem self-hosted kubernetes cluster running on [microk8s](https://microk8s.io/docs).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [Adding nodes](#adding-nodes)
|
||||||
|
- [Plugins](#plugins)
|
||||||
|
- [MetalLB](#metallb)
|
||||||
|
- [Helm](#helm)
|
||||||
|
- [Persistent Storage](#persistent-storage)
|
||||||
|
- [Ingress](#ingress)
|
||||||
|
- [Configuration](#configuration)
|
||||||
|
- [Deployment](#deployment)
|
||||||
|
|
||||||
|
# Adding nodes
|
||||||
|
|
||||||
|
## Provision and install microk8s
|
||||||
|
If this is first or additional node to be used for kubernetes we want to run base server configuration using playbook, replacing `KUBERNETES_HOST`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible-playbook plays/base_server_setup.yml -i schleppe.ini -l KUBERNETES_HOST
|
||||||
|
```
|
||||||
|
|
||||||
|
Install microk8s using snap:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo snap install microk8s --classic --channel=1.27/stable
|
||||||
|
```
|
||||||
|
|
||||||
|
## Joining cluster
|
||||||
|
|
||||||
|
From a existing node run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
microk8s.add-node
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy the output and join using command similar to the following on the new kubernetes node:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
microk8s join kazan.schleppe:25000/60e891acfc38556ea569cd15d5e025a1/91a7ab376757
|
||||||
|
```
|
||||||
|
|
||||||
|
# Plugins
|
||||||
|
|
||||||
|
## MetalLB
|
||||||
|
|
||||||
|
MetallLB hooks into Kubernetes cluster and provides a network load-balancer implementation.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
microk8s.enable metallb:10.0.0.150-10.0.0.154
|
||||||
|
```
|
||||||
|
|
||||||
|
## Helm
|
||||||
|
|
||||||
|
Use helm charts to easier install managed systems and applications.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
microk8s.enable helm
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Persistent storage
|
||||||
|
|
||||||
|
To create a persistent volume claim (PVC) we need to first define a storage class. To not solve the issue of HA stoarge, a single NFS host is used. Setup expects a linux server service export path: `/srv/nfs`.
|
||||||
|
|
||||||
|
## Setup/Deployment
|
||||||
|
|
||||||
|
Define storage class pointing to NFS server:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kubectl apply -f storage-nfs/storageClass.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> PVC resources will reference `spec.storageClassName: nfs-csi`
|
||||||
|
|
||||||
|
# Ingress
|
||||||
|
|
||||||
|
Traefik is configured as default ingress, enabling dynamic configuration & SSL generation.
|
||||||
|
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Make sure that persistent storage is configured. Traefik is configured to expect `nfs-csi` storageClass already exists, follow steps above.
|
||||||
|
|
||||||
|
### Disable nginx ingress
|
||||||
|
|
||||||
|
Microk8s uses nginx as default ingress controller. We wish to replace this with traefik. Do disable plugin run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
microk8s.disable ingress
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure cloudflare certificate resolver
|
||||||
|
|
||||||
|
Add to `additionalArguments`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- --certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare
|
||||||
|
- --certificatesresolvers.cloudflare.acme.email=YOUR_EMAIL_HERE
|
||||||
|
- --certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1
|
||||||
|
- --certificatesresolvers.cloudflare.acme.storage=/ssl-certs/acme-cloudflare.json
|
||||||
|
```
|
||||||
|
|
||||||
|
It is important that persistent storage is configured and a `acme-cloudflare.json` file is manually touched and it's permissions updated. From the nfs server run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /srv/nfs/PVC_VOLUME_NAME_HERE
|
||||||
|
sudo touch acme-cloudflare.json
|
||||||
|
sudo chown 65532:65532 acme-cloudflare.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure cloudflare credentials secret
|
||||||
|
|
||||||
|
Add to `env`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: CF_API_EMAIL
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
key: email
|
||||||
|
name: cloudflare-credentials
|
||||||
|
- name: CF_API_KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
key: apiKey
|
||||||
|
name: cloudflare-credentials
|
||||||
|
```
|
||||||
|
|
||||||
|
Update following values from example secret file (`ingress-traefik/cloudflare-credentials.yml`):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
email: YOUR_CLOUDFLARE_EMAIL
|
||||||
|
apiKey: YOUR_CLOUDFLARE_API_KEY
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a scoped api key for only only domain or use global api key.
|
||||||
|
|
||||||
|
|
||||||
|
Create secret object:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f ingress-traefik/cloudflare-credentials.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure persistent storage
|
||||||
|
|
||||||
|
Define persistent storage:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
name: ssl-certs
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
size: 1Gi
|
||||||
|
storageClass: nfs-csi
|
||||||
|
path: /ssl-certs
|
||||||
|
```
|
||||||
|
|
||||||
|
Define security context for all pods to not run as root, but as user & group `65532`. This solves NFS permissions in that we can ensure traefik has permissions to `acme-cloudflare.json` by setting file permissions to user & group: `65532`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
securityContext:
|
||||||
|
capabilities:
|
||||||
|
drop: [ALL]
|
||||||
|
readOnlyRootFilesystem: false
|
||||||
|
runAsGroup: 65532
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 65532
|
||||||
|
|
||||||
|
podSecurityContext:
|
||||||
|
fsGroup: 65532
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
### 1. Add the Helm Repository and Update
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add traefik https://traefik.github.io/charts
|
||||||
|
helm repo update
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Install Traefik with Helm
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install traefik traefik/traefik -n traefik --values=ingress-traefik/values.yml
|
||||||
|
```
|
||||||
|
|
||||||
BIN
assets/cube.gif
Normal file
BIN
assets/cube.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.2 MiB |
Reference in New Issue
Block a user