cluster-k3s
Template for creating a k3s cluster with k3sup, Flux and SOPS
This template will bootstrap the nodes you want with the following components
- k3s
- flux
- metallb
- flannel
:memo: Prerequisites
:computer: Nodes
Bare metal or VMs with a modern operating system like Ubuntu, Debian or CentOS.
:wrench: Tools
| Tool | Purpose | Required |
|---|---|---|
| k3sup | Tool to install k3s on your nodes | ✅ |
| flux | Operator that manages your k8s cluster based on your Git repository | ✅ |
| kustomize | Template-free way to customize application configuration | ✅ |
| SOPS | Encrypts k8s secrets with GnuPG | ✅ |
| GnuPG | Encrypts and signs your data | ✅ |
| pinentry | Allows GnuPG to read passphrases and PIN numbers | ✅ |
| direnv | Exports env vars based on present working directory | ❌ |
| pre-commit | Keeps formatting consistency across your files | ❌ |
:rocket: Installation
Very first step will be to create a new repository by clicking the Use this template button on this page.
:key: Setting up GnuPG keys
- Create a Personal GPG Key, password protected, and export the fingerprint
export GPG_TTY=$(tty)
export PERONAL_KEY_NAME="First name Last name (location) <email>"
gpg --batch --full-generate-key <<EOF
Key-Type: 1
Key-Length: 4096
Subkey-Type: 1
Subkey-Length: 4096
Expire-Date: 0
Name-Real: ${PERONAL_KEY_NAME}
EOF
gpg --list-secret-keys "${PERONAL_KEY_NAME}"
# pub rsa4096 2021-03-11 [SC]
# 772154FFF783DE317KLCA0EC77149AC618D75581
# uid [ultimate] k8s@home (Macbook) <k8s-at-home@gmail.com>
# sub rsa4096 2021-03-11 [E]
export PERSONAL_KEY_FP=772154FFF783DE317KLCA0EC77149AC618D75581
- Create a Flux GPG Key and export the fingerprint
export GPG_TTY=$(tty)
export FLUX_KEY_NAME="Cluster name (Flux) <email>"
gpg --batch --full-generate-key <<EOF
%no-protection
Key-Type: 1
Key-Length: 4096
Subkey-Type: 1
Subkey-Length: 4096
Expire-Date: 0
Name-Real: ${KEY_NAME}
EOF
gpg --list-secret-keys "${FLUX_KEY_NAME}"
# pub rsa4096 2021-03-11 [SC]
# AB675CE4CC64251G3S9AE1DAA88ARRTY2C009E2D
# uid [ultimate] Home cluster (Flux) <k8s-at-home@gmail.com>
# sub rsa4096 2021-03-11 [E]
export FLUX_KEY_FP=AB675CE4CC64251G3S9AE1DAA88ARRTY2C009E2D
:sailboat: Installing k3s with k3sup
-
Ensure you are able to SSH into you nodes with using your private ssh key. This is how k3sup is able to connect to your remote node.
-
Install the master node
k3sup install \
--host=169.254.1.1 \
--user=k8s-at-home \
--k3s-version=v1.20.5+k3s1 \
--k3s-extra-args="--disable servicelb --disable traefik"
- Join a worker node(s) (optional)
k3sup join \
--host=169.254.1.2 \
--server-host=169.254.1.1 \
--k3s-version=v1.20.5+k3s1 \
--user=k8s-at-home
- Verify nodes are online
kubectl --kubeconfig=./kubeconfig get nodes
# NAME STATUS ROLES AGE VERSION
# k8s-master-a Ready control-plane,master 4d14h v1.20.5+k3s1
# k8s-worker-a Ready worker 4d14h v1.20.5+k3s1
GitOps with Flux
- Pre-create the namespace
kubectl --kubeconfig=./kubeconfig create namespace flux-system --dry-run=client -o yaml | kubectl apply -f -
- Add the Flux GPG key in-order for Flux to decrypt SOPS secrets
gpg --export-secret-keys --armor "${FLUX_KEY_FP}" |
kubectl --kubeconfig=./kubeconfig create secret generic sops-gpg \
--namespace=flux-system \
--from-file=sops.asc=/dev/stdin
- Update files using
envsubstor by updating them manually
export BOOTSTRAP_GITHUB_REPOSITORY="k8s-at-home/home-cluster"
export BOOTSTRAP_DOMAIN="k8s-at-home.com"
export BOOTSTRAP_METALLB_LB_RANGE="169.254.1.10-169.254.1.20"
envsubst < ./.sops.yaml
envsubst < ./cluster/cluster-secrets.yaml
envsubst < ./cluster/cluster-settings.yaml
envsubst < ./cluster/base/flux-system/gotk-sync.yaml
-
Verify all the above files have the correct information present
-
Encrypt
cluster-settings.yamlwith SOPS
sops --encrypt --in-place ./cluster/base/cluster-secrets.yaml
-
Verify this file is encrypted with SOPS
-
Push you changes to git
git add -A
git commit -m "initial commit"
git push
- Install Flux
kubectl --kubeconfig=./kubeconfig --kustomize=./cluster/base/flux-system
Post installation
pre-commit
pre-commit install-hooks
:handshake: Thanks
A lot of inspiration for my cluster came from the people that have shared their clusters over at awesome-home-kubernetes