For users familiar with Docker but new to Kubernetes
This guide helps you deploy a GitOps-managed Kubernetes cluster using:
- Talos Linux - Immutable OS for Kubernetes nodes
- Flux - GitOps for automatic application deployment
- 1Password - Secret management
- Task - Automation commands
- 3+ nodes running Talos Linux
- 1Password CLI (
op) installed and signed in - Tools installed:
task,talosctl,kubectl(usetask workstation:brewto install)
# Generate new secrets and store in 1Password
task talos:gen-secrets# Apply configs to each node (use your actual node IPs)
task talos:apply-config NODE=10.0.5.215 INSECURE=true
task talos:apply-config NODE=10.0.5.220 INSECURE=true
task talos:apply-config NODE=10.0.5.100 INSECURE=true# Bootstrap on any control plane node
task bootstrap:talos-cluster NODE=10.0.5.215
# Deploy applications with GitOps
task bootstrap:appsThat's it! Your cluster is now running with all applications automatically deployed via Flux.
If you're coming from Docker, here's how this relates:
- Talos = Like a minimal Linux distro optimized for containers
- Kubernetes = Like Docker Compose but for multiple servers
- Flux = Automatically deploys apps when you change YAML files in Git
- 1Password Connect = Safely injects secrets into containers
# See all nodes
kubectl get nodes
# See all running applications
kubectl get pods -A
# Check GitOps status
flux get kustomizations# Auto-fixes 1Password Connect and syncs all secrets
task k8s:sync-secrets# Mount a persistent volume to debug storage issues
task k8s:browse-pvc CLAIM=pvc-name# Create snapshot of an application's data
task volsync:snapshot APP=plex
# Restore from backup
task volsync:restore APP=plex PREVIOUS=snapshot-nameNote: Backups go to S3-compatible storage (SeaweedFS). You may need to adjust S3 endpoints/credentials for your setup.
Symptom: Apps showing "secret not found" errors
Solution: task k8s:sync-secrets - This auto-detects and fixes 1Password Connect issues
Symptom: Pods stuck in "Pending" or "ImagePullBackOff"
Check: kubectl describe pod <pod-name> -n <namespace>
Common fixes:
- Storage issues:
task k8s:browse-pvc CLAIM=<name> - Secret issues:
task k8s:sync-secrets
Symptom: Node showing "NotReady"
Check: kubectl describe node <node-name>
Solution: Often network or storage related - see CLUSTER-TROUBLESHOOTING.md
kubernetes/- All your applications defined as codetalos/static-configs/- Node configurations (currently static due to mixed hardware)bootstrap/- Initial cluster setupCLAUDE.md- Detailed command reference
Note on Node Configurations: This setup currently uses static YAML configs per node due to diverse hardware types (EQ12, P520 workstation, etc.). The original design used minijinja templates for dynamic generation, but maintaining templates for mixed hardware became complex. Future plans include returning to template-based configs once the hardware is standardized, as static configs create maintenance overhead when updating shared settings like certificate SANs.
- Customize applications: Edit YAML files in
kubernetes/apps/ - Add secrets: Store API keys in 1Password vault "homelab"
- Monitor: Visit your cluster's status page at https://your-domain/status
The beauty of GitOps is that any changes you make to the kubernetes/ folder will automatically deploy to your cluster within minutes!