blumeops/argocd/manifests/tailscale-operator
Erich Blume 32d5927838 Add ArgoCD self-management and app-of-apps pattern
- Add argocd CLI to Brewfile
- Create argocd.yaml for ArgoCD self-management (manual sync)
- Create apps.yaml app-of-apps root (auto-sync for Application resources)
- Convert tailscale-operator to kustomize
- Update READMEs with bootstrap steps and ArgoCD CLI commands
- Change all workload Applications to manual sync policy

App-of-apps auto-syncs to pick up new Application manifests, but child
apps require manual sync for actual workload deployments.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 07:54:04 -08:00
..
dnsconfig.yaml Migrate Tailscale operator to ArgoCD management (Phase 1 Step 5) 2026-01-19 07:12:51 -08:00
egress-forge.yaml Migrate Tailscale operator to ArgoCD management (Phase 1 Step 5) 2026-01-19 07:12:51 -08:00
kustomization.yaml Add ArgoCD self-management and app-of-apps pattern 2026-01-19 07:54:04 -08:00
operator.yaml Add Tailscale operator manifests (Phase 1 Step 3) 2026-01-18 18:33:29 -08:00
proxyclass.yaml Add ProxyClass for CRI-O image compatibility 2026-01-18 18:50:27 -08:00
README.md Add ArgoCD self-management and app-of-apps pattern 2026-01-19 07:54:04 -08:00
secret.yaml.tpl Add Tailscale operator manifests (Phase 1 Step 3) 2026-01-18 18:33:29 -08:00

Tailscale Kubernetes Operator

Manifests for the Tailscale Kubernetes Operator, managed via ArgoCD.

Source

Prerequisites

  1. OAuth client in Tailscale admin console with:
    • Devices: Core (Read & Write) - tag: tag:k8s-operator
    • Auth Keys: Read & Write
    • Services: Write
  2. ACL with tag:k8s-operator owning tag:k8s (so operator can tag resources it creates)

Manual Bootstrap (Before ArgoCD)

Tailscale operator must be deployed before ArgoCD since ArgoCD uses Tailscale for ingress.

# 1. Create namespace
kubectl create namespace tailscale

# 2. Apply OAuth secret (uses 1Password)
op inject -i argocd/manifests/tailscale-operator/secret.yaml.tpl | kubectl apply -f -

# 3. Apply manifests via kustomize
kubectl apply -k argocd/manifests/tailscale-operator/

Ongoing Management (After ArgoCD)

Once ArgoCD is running, the operator is managed by the tailscale-operator ArgoCD Application. ArgoCD pulls manifests from forge and applies them automatically.

ArgoCD CLI Commands

# Check application status
argocd app get tailscale-operator

# Trigger a sync (pull latest from forge and apply)
argocd app sync tailscale-operator

# Preview what would change without applying
argocd app diff tailscale-operator

# View deployment history
argocd app history tailscale-operator

# Hard refresh (clear cache and re-fetch from git)
argocd app get tailscale-operator --hard-refresh

Verification

# Check operator pod is running
kubectl get pods -n tailscale

# Check operator logs
kubectl logs -n tailscale -l app.kubernetes.io/name=operator

Files

File Description
kustomization.yaml Kustomize configuration for all manifests
operator.yaml Operator deployment, CRDs, RBAC (secret removed)
proxyclass.yaml ProxyClass with fully-qualified images for CRI-O
dnsconfig.yaml DNSConfig for cluster-to-tailnet name resolution
egress-forge.yaml Egress proxy for accessing forge on indri
secret.yaml.tpl 1Password template for OAuth credentials (manual)
README.md This file

Notes

  • TODO: The OAuth secret (operator-oauth) is not managed by ArgoCD and must be applied manually. Future improvement: integrate with a secrets operator (e.g., External Secrets).
  • Services using the Tailscale LoadBalancer must reference the ProxyClass:
    annotations:
      tailscale.com/proxy-class: "default"
    
  • The egress proxy for forge targets indri.tail8d86e.ts.net directly (not forge.tail8d86e.ts.net) because Tailscale Serve hostnames are virtual and only work via the Tailscale client.