Commit Graph
17 Commits
Author SHA1 Message Date
cyberops7 081c11fb40 K3S-Deploy: strip trailing blank line from kube-vip manifest
The end-of-file-fixer pre-commit hook (CI) requires a single trailing
newline; the kube-vip manifest had a blank line at EOF.
2026-07-15 22:56:14 -06:00
cyberops7 c436d29182 K3S-Deploy: harden HA bring-up and expand README caveats
Add a post-join control-plane readiness gate so a half-succeeded server
join on a degraded etcd can no longer pass as success. Retry the MetalLB
IPAddressPool/L2Advertisement applies to ride out the validating-webhook
startup race. Narrow the k3sup cleanup glob, quiet the final k3sup ready
tip, and clarify two comments.

README: add networking caveats (VIP/LB outside the DHCP pool, same-subnet
ARP/L2, interface naming), certName key placement, a post-run verification
section, machine-count/admin-box notes, and fix the RAW_BASE description.
2026-07-15 22:26:45 -06:00
cyberops7 49313239f4 K3S-Deploy: join via the VIP, not master1; harden per k8s review
- join all nodes to --server-ip $vip (the readiness-gated VIP) so no single
  master is the registration SPOF; drop the dead --server-user on joins
  (a --node-token is already supplied, so k3sup doesn't SSH the server)
- add --tls-san=$vip to every server's args (not just master1's install) so
  master2/3 declare the VIP SAN uniformly
- pin --flannel-iface/--node-ip on workers too (correct on multi-NIC nodes)
- filter k3sup's repeated 'slicervm.com' promo tip on install/join (sed, so
  pipefail still surfaces a real failure)
- guard 'kubectl expose' with || true so a re-run doesn't abort on AlreadyExists

Re-validated on the 6-VM Multipass e2e: 5 nodes Ready, VIP serves the API,
MetalLB LoadBalancer reachable.
2026-07-07 22:55:48 -06:00
cyberops7 fd3d414edb K3S-Deploy: rename readme.md -> README.md; align options table
- match the global README.md convention; update the reference in k3s.sh
- pad the options table so it reads cleanly in raw and rendered views,
  kept under the 80-col markdownlint limit
2026-07-05 23:29:24 -06:00
cyberops7 6f2f77e785 K3S-Deploy: expand README 'what changed' (MetalLB single manifest, k3sup node-token/ready, non-blinking output, VIP readiness) 2026-07-05 23:20:16 -06:00
cyberops7 8a33841883 K3S-Deploy: fix k3sup install and kube-vip placement (from e2e)
Found running the deploy end-to-end on a multi-node cluster:
- k3sup: get.k3sup.dev leaves an arch-suffixed binary (k3sup-arm64) when
  run unprivileged; install whichever binary it produced, not a literal
  'k3sup' that may not exist.
- kube-vip: scp landed the manifest in the ssh user's home, but the mv
  ran as root (sudo bash -s) where ~ is /root; scp to /tmp and mv from
  the absolute path instead.
2026-07-05 22:34:13 -06:00
cyberops7 7e24e445aa K3S-Deploy: anchor VIP kubeconfig rewrite; add VIP readiness check
- rewrite only the server URL (https://master1:6443 -> VIP) instead of a
  global regex substitution whose dots could over-match cert data
- poll the VIP /readyz after repointing the kubeconfig, so a broken
  kube-vip fails early with a clear message instead of downstream
2026-07-05 22:06:27 -06:00
cyberops7 b64a35faa9 K3S-Deploy: rewrite README (prereqs, config, what changed from the video) 2026-07-05 21:36:59 -06:00
cyberops7 8d71dcdf5d K3S-Deploy: guard final summary and pre-flight read against set -e
- fall back ready_nodes=0 if kubectl fails, so the summary still prints
- tolerate EOF on the pre-flight prompt so it aborts cleanly
2026-07-05 21:33:57 -06:00
cyberops7 7ec8404797 K3S-Deploy: rewrite deploy script
- pin k3s v1.35.6+k3s1 (channel alternative documented), MetalLB v0.16.0
- kube-vip v1.2.1 control-plane VIP placed on all masters; kubeconfig -> VIP
- drop redundant kube-vip cloud-provider; single MetalLB native manifest
- k3sup node-token (fetched once) + k3sup ready
- set -euo pipefail, ssh-keyscan known_hosts (no ~/.ssh/config clobber),
  per-node NTP + apt-guarded prereqs, arch-aware kubectl, re-run safe
- pre-flight config summary + [y/N] gate (ASSUME_YES bypass)
- non-blinking step/info/ok/warn/err output; RAW_BASE override for testing

Closes #40 #62 #68 #78 #80 #159 #162; supersedes #66 #89 #145
2026-07-05 21:28:35 -06:00
cyberops7 72d4344b78 K3S-Deploy: REPLACE_LBRANGE token; tidy L2Advertisement name 2026-07-05 21:19:51 -06:00
cyberops7 8bad8db978 K3S-Deploy: regenerate kube-vip with --inCluster for k3s
The kubeadm default mounts /etc/kubernetes/admin.conf, which does not
exist on k3s. --inCluster uses the kube-vip ServiceAccount (provided by
the applied rbac.yaml) instead, which is the correct mode for k3s.
2026-07-05 21:18:24 -06:00
cyberops7 ee2ea92389 K3S-Deploy: regenerate kube-vip manifest for v1.2.1
Regenerated from ghcr.io/kube-vip/kube-vip:v1.2.1 (env schema changed
since 0.x: vip_cidr->vip_subnet, dropped vip_ddns/svc_*, added
dhcp_mode/dns_mode/vip_nodename). Uses REPLACE_INTERFACE/REPLACE_VIP tokens.
2026-07-05 21:13:01 -06:00
cyberops7andGitHub 8de0775282 Fix RKE2 MetalLB L2Advertisement to honor custom lb_pool_name (#135) (#168)
* Fix RKE2 MetalLB L2Advertisement to honor custom lb_pool_name (#135)

The apply-manifests role rendered the IPAddressPool from a template using
lb_pool_name, but applied the L2Advertisement from a hardcoded remote file
where the pool name was baked in as 'first-pool'. Setting lb_pool_name to
anything else left the L2Advertisement pointing at a non-existent pool, so
MetalLB assigned LoadBalancer IPs but never advertised them (services got an
external IP but were unreachable).

Template the L2Advertisement locally from lb_pool_name, mirroring the
IPAddressPool pattern, so both manifests always reference the same pool.

* Add explicit become: true to apply-manifests kubectl tasks

These tasks set become_user without a task-level become, tripping
ansible-lint's partial-become rule. become is already enabled globally via
ansible_become in group_vars/all.yaml, so the tasks already escalate to the
ansible user — but that is invisible to the linter (and to anyone reading the
task in isolation). Make it explicit with become: true alongside become_user.

Behavior-neutral: verified with ansible-playbook -vvv that the escalation
target is unchanged (sudo -u ansible; chown ansible on the temp files), so
kubectl still runs as the ansible user that owns ~/.kube/config.
2026-07-02 00:34:00 -06:00
cyberops7andGitHub fc18bfe3d7 fix: correct misspelled docker-compose filename in Tailscale-Client (#167)
Rename docker-compose,yaml (comma) to docker-compose.yaml (dot) so the
Tailscale client compose file follows the standard naming convention.

Fixes #43
2026-07-01 21:33:06 -06:00
cyberops7 d86eb06702 traefik v3 requires updating the CRDs API group version 2024-05-02 21:27:05 -06:00
cyberops7 9ca2135eb5 Adding Ingress TLS notes to README 2024-01-25 21:59:02 -07:00