Skip to main content

TailscaleTailnet API Reference

The TailscaleTailnet resource defines the configuration and credentials for connecting to a specific Tailscale network (tailnet).

Overview

TailscaleTailnet allows you to:

  • Configure OAuth credentials for Tailscale API access
  • Define tailnet-specific settings and policies
  • Manage device registration and networking options
  • Set up access control lists (ACLs) and security policies

API Version

apiVersion: gateway.tailscale.com/v1alpha1
kind: TailscaleTailnet

Basic Example

apiVersion: gateway.tailscale.com/v1alpha1
kind: TailscaleTailnet
metadata:
name: company-tailnet
namespace: tailscale-gateway-system
spec:
tailnet: "company.ts.net"
oauth:
clientIdRef:
name: "tailscale-oauth"
key: "client-id"
clientSecretRef:
name: "tailscale-oauth"
key: "client-secret"

configuration:
devices:
ephemeral: false
preauth: true
keyExpiry: "90d"

Specification

TailscaleTailnetSpec

FieldTypeRequiredDescription
tailnetstringYesThe Tailscale tailnet domain (e.g., "company.ts.net")
oauthOAuthConfigYesOAuth configuration for API access
configurationTailnetConfigurationNoTailnet-specific configuration settings
observabilityObservabilityConfigNoMonitoring and logging configuration

OAuthConfig

FieldTypeRequiredDescription
clientIdRefSecretKeySelectorYesReference to OAuth client ID in Kubernetes secret
clientSecretRefSecretKeySelectorYesReference to OAuth client secret in Kubernetes secret
scopes[]stringNoOAuth scopes (default: ["device:create", "device:read", "device:write"])

TailnetConfiguration

FieldTypeRequiredDescription
devicesDeviceConfigNoDevice registration and management settings
accessControlAccessControlConfigNoACL and security policy configuration
networkingNetworkingConfigNoNetwork-specific settings

DeviceConfig

FieldTypeRequiredDescription
ephemeralboolNoCreate ephemeral devices (default: false)
preauthboolNoEnable device pre-authorization (default: true)
keyExpirystringNoDevice key expiry duration (default: "90d")
machineAuthboolNoEnable machine-to-machine authentication (default: true)
requireApprovalboolNoRequire manual device approval (default: false)
advertiseRoutes[]stringNoSubnet routes to advertise
tags[]stringNoDefault tags to apply to devices

AccessControlConfig

FieldTypeRequiredDescription
defaultActionstringNoDefault ACL action: "allow" or "deny" (default: "deny")
rules[]ACLRuleNoAccess control rules
groupsmap[string][]stringNoUser groups definition
tagOwnersmap[string][]stringNoTag ownership mapping

NetworkingConfig

FieldTypeRequiredDescription
magicDNSboolNoEnable Magic DNS (default: true)
dnsSettingsDNSConfigNoDNS configuration
exitNodes[]stringNoAvailable exit nodes

Usage Examples

Production Tailnet Configuration

apiVersion: gateway.tailscale.com/v1alpha1
kind: TailscaleTailnet
metadata:
name: prod-tailnet
namespace: tailscale-gateway-system
spec:
tailnet: "prod.company.ts.net"

oauth:
clientIdRef:
name: "prod-tailscale-oauth"
key: "client-id"
clientSecretRef:
name: "prod-tailscale-oauth"
key: "client-secret"
scopes:
- "device:create"
- "device:read"
- "device:write"
- "tailnet:read"

configuration:
devices:
ephemeral: false
preauth: true
keyExpiry: "90d"
machineAuth: true
requireApproval: false
advertiseRoutes:
- "10.0.0.0/8"
- "172.16.0.0/12"
tags:
- "tag:k8s-gateway"
- "tag:prod-cluster"

accessControl:
defaultAction: "deny"
rules:
# Allow production servers to communicate
- source: ["tag:prod-server"]
destination: ["tag:prod-server:*"]
action: "allow"

# Allow developers to access specific services
- source: ["group:developers"]
destination: ["tag:prod-server:80,443,8080"]
action: "allow"

# Deny access to sensitive databases
- source: ["*"]
destination: ["tag:database:5432,3306"]
action: "deny"

groups:
developers: ["alice@company.com", "bob@company.com"]
admins: ["admin@company.com"]
devops: ["devops@company.com"]

tagOwners:
"tag:prod-server": ["group:admins", "group:devops"]
"tag:database": ["group:admins"]
"tag:k8s-gateway": ["group:devops"]

networking:
magicDNS: true
dnsSettings:
globalNameservers:
- "1.1.1.1"
- "8.8.8.8"
searchDomains:
- "company.com"
- "internal.company.com"
exitNodes:
- "exit-node-us-east"
- "exit-node-eu-west"

observability:
logLevel: "info"
auditLogging: true
metrics:
enabled: true
interval: "30s"

Development Tailnet Configuration

apiVersion: gateway.tailscale.com/v1alpha1
kind: TailscaleTailnet
metadata:
name: dev-tailnet
namespace: tailscale-gateway-system
spec:
tailnet: "dev.company.ts.net"

oauth:
clientIdRef:
name: "dev-tailscale-oauth"
key: "client-id"
clientSecretRef:
name: "dev-tailscale-oauth"
key: "client-secret"

configuration:
devices:
ephemeral: true # Temporary devices for development
preauth: true
keyExpiry: "30d" # Shorter expiry for dev
requireApproval: false
tags:
- "tag:dev-cluster"
- "tag:k8s-gateway"

accessControl:
defaultAction: "allow" # More permissive for development
rules:
# Still block access to production resources
- source: ["tag:dev-cluster"]
destination: ["tag:prod-server:*"]
action: "deny"

groups:
developers: ["dev@company.com"]

tagOwners:
"tag:dev-cluster": ["group:developers"]

networking:
magicDNS: true
dnsSettings:
globalNameservers:
- "8.8.8.8"
searchDomains:
- "dev.company.com"

observability:
logLevel: "debug" # More verbose logging for development
auditLogging: false
metrics:
enabled: true
interval: "60s"

Multi-Region Tailnet

apiVersion: gateway.tailscale.com/v1alpha1
kind: TailscaleTailnet
metadata:
name: global-tailnet
namespace: tailscale-gateway-system
spec:
tailnet: "global.company.ts.net"

oauth:
clientIdRef:
name: "global-tailscale-oauth"
key: "client-id"
clientSecretRef:
name: "global-tailscale-oauth"
key: "client-secret"

configuration:
devices:
ephemeral: false
preauth: true
keyExpiry: "180d" # Longer expiry for global deployment
advertiseRoutes:
- "10.0.0.0/8"
- "172.16.0.0/12"
- "192.168.0.0/16"
tags:
- "tag:global-gateway"
- "tag:multi-region"

accessControl:
defaultAction: "deny"
rules:
# Regional access patterns
- source: ["tag:us-east"]
destination: ["tag:us-east:*", "tag:global-service:*"]
action: "allow"

- source: ["tag:eu-west"]
destination: ["tag:eu-west:*", "tag:global-service:*"]
action: "allow"

# Cross-region for specific services
- source: ["tag:api-gateway"]
destination: ["tag:database:5432", "tag:cache:6379"]
action: "allow"

groups:
us-engineers: ["us-dev@company.com"]
eu-engineers: ["eu-dev@company.com"]
global-admins: ["admin@company.com"]

tagOwners:
"tag:us-east": ["group:us-engineers", "group:global-admins"]
"tag:eu-west": ["group:eu-engineers", "group:global-admins"]
"tag:global-service": ["group:global-admins"]

networking:
magicDNS: true
dnsSettings:
globalNameservers:
- "1.1.1.1"
- "8.8.8.8"
searchDomains:
- "company.com"
- "us-east.company.com"
- "eu-west.company.com"
exitNodes:
- "us-east-exit"
- "eu-west-exit"
- "ap-south-exit"

Secure Enterprise Configuration

apiVersion: gateway.tailscale.com/v1alpha1
kind: TailscaleTailnet
metadata:
name: enterprise-tailnet
namespace: tailscale-gateway-system
spec:
tailnet: "enterprise.company.ts.net"

oauth:
clientIdRef:
name: "enterprise-tailscale-oauth"
key: "client-id"
clientSecretRef:
name: "enterprise-tailscale-oauth"
key: "client-secret"
scopes:
- "device:create"
- "device:read"
- "device:write"
- "tailnet:read"
- "acl:read"
- "acl:write"

configuration:
devices:
ephemeral: false
preauth: false # Require manual approval for security
keyExpiry: "30d" # Frequent key rotation
machineAuth: true
requireApproval: true
advertiseRoutes:
- "10.100.0.0/16" # Restricted network range
tags:
- "tag:enterprise-gateway"
- "tag:security-monitored"

accessControl:
defaultAction: "deny"
rules:
# Strict least-privilege access
- source: ["tag:web-tier"]
destination: ["tag:app-tier:8080"]
action: "allow"

- source: ["tag:app-tier"]
destination: ["tag:db-tier:5432"]
action: "allow"

# Admin access with restrictions
- source: ["group:security-admins"]
destination: ["tag:enterprise-gateway:22,443"]
action: "allow"

# Audit all database access
- source: ["*"]
destination: ["tag:db-tier:*"]
action: "audit"

groups:
security-admins: ["security@company.com"]
web-developers: ["web-dev@company.com"]
app-developers: ["app-dev@company.com"]
dba-team: ["dba@company.com"]

tagOwners:
"tag:enterprise-gateway": ["group:security-admins"]
"tag:web-tier": ["group:web-developers", "group:security-admins"]
"tag:app-tier": ["group:app-developers", "group:security-admins"]
"tag:db-tier": ["group:dba-team", "group:security-admins"]

networking:
magicDNS: true
dnsSettings:
globalNameservers:
- "10.100.1.1" # Internal DNS servers
- "10.100.1.2"
searchDomains:
- "internal.company.com"
- "secure.company.com"

observability:
logLevel: "info"
auditLogging: true
metrics:
enabled: true
interval: "15s" # Frequent metrics for security monitoring

# Security monitoring integration
securityMonitoring:
enabled: true
siemIntegration:
endpoint: "https://siem.company.com/api/events"
apiKey:
secretRef:
name: "siem-credentials"
key: "api-key"

Status

The TailscaleTailnet resource provides detailed status information:

status:
conditions:
- type: "Ready"
status: "True"
reason: "TailnetConnected"
message: "Successfully connected to tailnet"
- type: "Authenticated"
status: "True"
reason: "OAuthValid"
message: "OAuth credentials are valid"

tailnetInfo:
name: "company.ts.net"
organization: "Company Inc"
plan: "Enterprise"
deviceCount: 45
userCount: 23

connectionInfo:
lastConnected: "2024-01-15T10:30:00Z"
apiEndpoint: "https://api.tailscale.com"
oauthStatus: "Valid"

deviceRegistration:
registeredDevices: 3
activeDevices: 3
expiredDevices: 0

Best Practices

1. Security Configuration

# Always use least-privilege access
accessControl:
defaultAction: "deny"
rules:
- source: ["group:specific-users"]
destination: ["tag:specific-service:specific-port"]
action: "allow"

2. Key Management

# Regular key rotation
devices:
keyExpiry: "30d" # Monthly rotation for production
requireApproval: true # Manual approval for security

3. Network Segmentation

# Use specific network ranges
devices:
advertiseRoutes:
- "10.100.0.0/16" # Specific to this deployment

4. Monitoring and Auditing

observability:
auditLogging: true
metrics:
enabled: true
interval: "30s"

Troubleshooting

Common Issues

1. OAuth Authentication Failures

# Check secret exists and has correct keys
kubectl get secret tailscale-oauth -o yaml

# Verify OAuth scopes
kubectl describe tailscaletailnet company-tailnet

2. Device Registration Issues

# Check device status
kubectl get tailscaletailnet company-tailnet -o yaml

# Check operator logs
kubectl logs -n tailscale-gateway-system deployment/tailscale-gateway-operator

3. ACL Configuration Problems

# Validate ACL syntax
tailscale acl validate

# Check effective ACLs
tailscale acl get