feat: improve docs and cluster dir
This commit is contained in:
15 files changed
+3049
-10
No files matched your search
@@ -2,3 +2,5 @@
|
||||
creation_rules:
|
||||
- encrypted_regex: '((?i)(pass|secret($|[^N])|key|token|^data$|^stringData))'
|
||||
pgp: >-
|
||||
$FLUX_KEY_FP,
|
||||
$PERSONAL_KEY_FP
|
||||
@@ -17,20 +17,166 @@ Bare metal or VMs with a modern operating system like Ubuntu, Debian or CentOS.
|
||||
|
||||
### :wrench: Tools
|
||||
|
||||
| Tool | Purpose | Required |
|
||||
|--------------------------------------------------------|---------------------------------------------------------------------|:--------:|
|
||||
| [k3sup](https://github.com/alexellis/k3sup) | Tool to install k3s on your nodes | ✅ |
|
||||
| [flux](https://toolkit.fluxcd.io/) | Operator that manages your k8s cluster based on your Git repository | ✅ |
|
||||
| [SOPS](https://github.com/mozilla/sops) | Encrypts k8s secrets with GnuPG | ✅ |
|
||||
| [GnuPG](https://gnupg.org/) | Encrypts and signs your data | ✅ |
|
||||
| [direnv](https://github.com/direnv/direnv) | Exports env vars based on present working directory | ❌ |
|
||||
| [pre-commit](https://github.com/pre-commit/pre-commit) | Keeps formatting consistency across your files | ❌ |
|
||||
| Tool | Purpose | Required |
|
||||
|--------------------------------------------------------------------|---------------------------------------------------------------------|:--------:|
|
||||
| [k3sup](https://github.com/alexellis/k3sup) | Tool to install k3s on your nodes | ✅ |
|
||||
| [flux](https://toolkit.fluxcd.io/) | Operator that manages your k8s cluster based on your Git repository | ✅ |
|
||||
| [kustomize](https://kustomize.io/) | Template-free way to customize application configuration | ✅ |
|
||||
| [SOPS](https://github.com/mozilla/sops) | Encrypts k8s secrets with GnuPG | ✅ |
|
||||
| [GnuPG](https://gnupg.org/) | Encrypts and signs your data | ✅ |
|
||||
| [pinentry](https://gnupg.org/related_software/pinentry/index.html) | Allows GnuPG to read passphrases and PIN numbers | ✅ |
|
||||
| [direnv](https://github.com/direnv/direnv) | Exports env vars based on present working directory | ❌ |
|
||||
| [pre-commit](https://github.com/pre-commit/pre-commit) | Keeps formatting consistency across your files | ❌ |
|
||||
|
||||
## :rocket: Installation
|
||||
|
||||
### :sailboat: k3sup
|
||||
Very first step will be to create a new repository by clicking the **Use this template** button on this page.
|
||||
|
||||
Bootstrap your nodes with k3s using k3sup
|
||||
### :key: Setting up GnuPG keys
|
||||
|
||||
1. Create a Personal GPG Key, password protected, and export the fingerprint
|
||||
|
||||
```sh
|
||||
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
|
||||
```
|
||||
|
||||
2. Create a Flux GPG Key and export the fingerprint
|
||||
|
||||
```sh
|
||||
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
|
||||
|
||||
1. 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.
|
||||
|
||||
2. Install the master node
|
||||
|
||||
```sh
|
||||
k3sup install \
|
||||
--host=169.254.1.1 \
|
||||
--user=k8s-at-home \
|
||||
--k3s-version=v1.20.5+k3s1 \
|
||||
--k3s-extra-args="--disable servicelb --disable traefik"
|
||||
```
|
||||
|
||||
3. Join a worker node(s) (optional)
|
||||
|
||||
```sh
|
||||
k3sup join \
|
||||
--host=169.254.1.2 \
|
||||
--server-host=169.254.1.1 \
|
||||
--k3s-version=v1.20.5+k3s1 \
|
||||
--user=k8s-at-home
|
||||
```
|
||||
|
||||
4. Verify nodes are online
|
||||
|
||||
```sh
|
||||
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
|
||||
|
||||
1. Pre-create the namespace
|
||||
|
||||
```sh
|
||||
kubectl --kubeconfig=./kubeconfig create namespace flux-system --dry-run=client -o yaml | kubectl apply -f -
|
||||
```
|
||||
|
||||
1. Add the Flux GPG key in-order for Flux to decrypt SOPS secrets
|
||||
|
||||
```sh
|
||||
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
|
||||
```
|
||||
|
||||
3. Update files using `envsubst` or by updating them manually
|
||||
|
||||
```sh
|
||||
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
|
||||
```
|
||||
|
||||
4. **Verify** all the above files have the correct information present
|
||||
|
||||
5. Encrypt `cluster-settings.yaml` with SOPS
|
||||
|
||||
```sh
|
||||
sops --encrypt --in-place ./cluster/base/cluster-secrets.yaml
|
||||
```
|
||||
|
||||
6. **Verify** this file **is encrypted** with SOPS
|
||||
|
||||
7. Push you changes to git
|
||||
|
||||
```sh
|
||||
git add -A
|
||||
git commit -m "initial commit"
|
||||
git push
|
||||
```
|
||||
|
||||
8. Install Flux
|
||||
|
||||
```sh
|
||||
kubectl --kubeconfig=./kubeconfig --kustomize=./cluster/base/flux-system
|
||||
```
|
||||
|
||||
## Post installation
|
||||
|
||||
### pre-commit
|
||||
|
||||
```sh
|
||||
pre-commit install-hooks
|
||||
```
|
||||
|
||||
## :handshake: Thanks
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
|
||||
kind: Kustomization
|
||||
metadata:
|
||||
name: apps
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 10m0s
|
||||
dependsOn:
|
||||
- name: core
|
||||
path: ./cluster/apps
|
||||
prune: true
|
||||
sourceRef:
|
||||
kind: GitRepository
|
||||
name: flux-system
|
||||
decryption:
|
||||
provider: sops
|
||||
secretRef:
|
||||
name: sops-gpg
|
||||
postBuild:
|
||||
substitute: {}
|
||||
substituteFrom:
|
||||
- kind: ConfigMap
|
||||
name: cluster-settings
|
||||
- kind: Secret
|
||||
name: cluster-secrets
|
||||
@@ -0,0 +1,8 @@
|
||||
# yamllint disable
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: cluster-secrets
|
||||
namespace: flux-system
|
||||
stringData:
|
||||
SECRET_DOMAIN: $BOOTSTRAP_DOMAIN
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: cluster-settings
|
||||
namespace: flux-system
|
||||
data:
|
||||
METALLB_LB_RANGE: $BOOTSTRAP_METALLB_LB_RANGE
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
|
||||
kind: Kustomization
|
||||
metadata:
|
||||
name: core
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 10m0s
|
||||
path: ./cluster/core
|
||||
prune: false
|
||||
sourceRef:
|
||||
kind: GitRepository
|
||||
name: flux-system
|
||||
decryption:
|
||||
provider: sops
|
||||
secretRef:
|
||||
name: sops-gpg
|
||||
postBuild:
|
||||
substitute: {}
|
||||
substituteFrom:
|
||||
- kind: ConfigMap
|
||||
name: cluster-settings
|
||||
- kind: Secret
|
||||
name: cluster-secrets
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1beta1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: bitnami-charts
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 30m
|
||||
url: https://charts.bitnami.com/bitnami
|
||||
timeout: 2m
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1beta1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: ingress-nginx-charts
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 30m
|
||||
url: https://kubernetes.github.io/ingress-nginx
|
||||
timeout: 2m
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1beta1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: jetstack-charts
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 30m
|
||||
url: https://charts.jetstack.io/
|
||||
timeout: 2m
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1beta1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: k8s-at-home-charts
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 30m
|
||||
url: https://k8s-at-home.com/charts/
|
||||
timeout: 2m
|
||||
@@ -0,0 +1,7 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- bitnami-charts.yaml
|
||||
- ingress-nginx-charts.yaml
|
||||
- jetstack-charts.yaml
|
||||
- k8s-at-home-charts.yaml
|
||||
@@ -0,0 +1,4 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- helm
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,31 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1beta1
|
||||
kind: GitRepository
|
||||
metadata:
|
||||
name: flux-system
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 1m0s
|
||||
ref:
|
||||
branch: main
|
||||
secretRef:
|
||||
name: flux-system
|
||||
url: ssh://git@github.com/$BOOTSTRAP_GITHUB_REPOSITORY
|
||||
---
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
|
||||
kind: Kustomization
|
||||
metadata:
|
||||
name: flux-system
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 10m0s
|
||||
path: ./cluster/base
|
||||
prune: true
|
||||
sourceRef:
|
||||
kind: GitRepository
|
||||
name: flux-system
|
||||
validation: client
|
||||
decryption:
|
||||
provider: sops
|
||||
secretRef:
|
||||
name: sops-gpg
|
||||
@@ -0,0 +1,6 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- gotk-components.yaml
|
||||
- gotk-sync.yaml
|
||||
- charts
|
||||
Reference in new issue
Block a user