skills/tailscale-k8s-ingress-https/SKILL.md
Set up HTTPS on a Kubernetes service via the Tailscale Ingress controller. Use when: (1) switching from a Tailscale LoadBalancer Service to Tailscale Ingress for TLS termination, (2) HTTPS connections timeout despite 'tailscale serve status' showing 'https://', (3) port 443 gives 'tlsv1 alert internal error' on raw IP but times out with correct SNI hostname, (4) harbor-tls or similar secret was not created after Ingress creation. Covers initial cert provisioning, backend ClusterIP wiring, and DNS propagation behavior.
npx skillsauth add aldengolab/lorist tailscale-k8s-ingress-httpsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When creating a Tailscale Ingress with a tls: stanza, the proxy pod starts
and tailscale serve status shows https:// — but HTTPS connections either
return tlsv1 alert internal error (raw IP, no SNI) or time out (correct
hostname). The TLS secret is not created automatically on first deploy.
ingressClassName: tailscale availableingressClassName: tailscale and tls: stanzatailscale serve status shows https://<hostname>.ts.net (tailnet only)tlsv1 alert internal error; hostname port 443: timeoutapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: <service>
namespace: <namespace>
annotations:
tailscale.com/hostname: <short-hostname>
spec:
ingressClassName: tailscale
defaultBackend:
service:
name: <existing-clusterip-service>
port:
number: 80
tls:
- hosts:
- <short-hostname> # just the short name, not the full FQDN
secretName: <service>-tls
The backend stays plain HTTP — the Tailscale proxy terminates TLS.
After the proxy pod (ts-<service>-<hash>-0) starts, exec in and run
tailscale cert once:
# Find proxy pod
kubectl get pods -n tailscale | grep <service>
# Provision cert (use full FQDN)
kubectl exec -n tailscale <proxy-pod> -- \
tailscale cert <hostname>.<tailnet>.ts.net
# Expected output:
# Wrote public cert to <hostname>.<tailnet>.ts.net.crt
# Wrote private key to <hostname>.<tailnet>.ts.net.key
HTTPS works immediately after this — no restart needed.
kubectl exec -n tailscale <proxy-pod> -- tailscale serve status
# https://<hostname>.ts.net (tailnet only)
# |-- / proxy http://<clusterip>:<port>/
curl -sI https://<hostname>.<tailnet>.ts.net
# HTTP/2 200
curl -sI https://... returns HTTP/2 200(tailnet only) is expected — the service is only accessible to tailnet
peers, not via public Funnel. Correct for internal services.tlsv1 alert internal error means the
server is alive but no cert. Correct-SNI → timeout means the server is alive
but waiting on cert provisioning. Both point to the same root cause.tailscale cert exec is a one-time bootstrap only.expose.tls.enabled: false stays). The Tailscale proxy is the TLS terminator.development
Build a UEFI Secure Boot PXE netboot server for Ubuntu autoinstall. Use when: designing or implementing network boot infrastructure for automated Ubuntu provisioning with Secure Boot enabled. Covers the complete chain: signed shim+GRUB selection, TFTP layout, kernel parameters, autoinstall config requirements, and post-install bootstrapping scripts. Also applicable when debugging an existing PXE setup that uses the wrong GRUB binary or config paths.
development
Design pattern for running a persistent PXE/TFTP server that safely coexists with already-installed nodes. Use when: building PXE infrastructure that should stay always-on, designing automated bare-metal provisioning in GitOps/Kubernetes environments, or any PXE setup where UEFI boot order has network boot first. Eliminates boot loops without requiring UEFI firmware changes.
development
This skill governs all prose output — Claude's own responses, documentation, PR descriptions, commit messages, README content, comments, and any text the user asks to draft or edit. It should also be used when the user asks to "review my writing", "edit this for clarity", "make this clearer", "simplify this text", "rewrite this", "check my prose", "tighten this up", or "make this more concise". Based on George Orwell's "Politics and the English Language" (1946).
development
Debug Kubernetes pods using hostNetwork: true that crash with "Address already in use" or "failed to create listening socket for port N". Use when: (1) a hostNetwork pod container is in CrashLoopBackOff and logs show a port bind failure, (2) the port works fine in non-hostNetwork pods but fails with hostNetwork, (3) you need to identify which host-level process holds a port from within Kubernetes (no SSH). Covers /proc/net/udp inspection and kubectl debug node with nsenter.