SiamCafe.net Blog
Technology
Incident.io Interview Preparation | SiamCafe Blog
2026-05-06· อ. บอม — SiamCafe.net· 10,965 คำ

Tailscale Mesh ????????? Service Mesh ?????????????????????

Tailscale ???????????? mesh VPN ?????????????????????????????? WireGuard protocol ??????????????? devices ????????? services ????????????????????????????????????????????????????????????????????????????????????????????? encrypted tunnel ?????????????????????????????? configure firewall rules ???????????? port forwarding ????????? concept ????????? Tailnet (private network) ?????????????????? nodes ????????????????????????????????????????????? peer-to-peer

Service Mesh ????????????????????????????????? (Istio, Linkerd) ?????????????????????????????? Kubernetes cluster ?????????????????? traffic routing, load balancing, mTLS ????????????????????? pods Tailscale Mesh ??????????????????????????? environments ????????? ?????????????????? cloud, on-premise, edge devices, developer laptops ?????????????????????????????????

????????? Tailscale ???????????? service mesh ??????????????? ????????????????????? connectivity ???????????? environments (multi-cloud, hybrid), ????????????????????? VPN ???????????????????????????????????????????????????, ???????????? connect developers ????????? internal services, ????????????????????? zero-config networking ????????????????????? services

????????????????????? Tailscale Mesh Network

Setup Tailscale ?????????????????? service connectivity

# === Tailscale Mesh Network Setup ===

# 1. Install Tailscale on Linux Servers
cat > install_tailscale.sh << 'BASH'
#!/bin/bash
# Install on Ubuntu/Debian
curl -fsSL https://tailscale.com/install.sh | sh

# Authenticate and join tailnet
sudo tailscale up --authkey=tskey-auth-xxxxx --hostname=api-server-01

# Enable IP forwarding (for subnet routing)
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

# Advertise subnet routes
sudo tailscale up --advertise-routes=10.0.0.0/24,10.0.1.0/24

# Enable as exit node (optional)
sudo tailscale up --advertise-exit-node

# Check status
tailscale status
tailscale ip -4
BASH

# 2. Docker Compose with Tailscale
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
  tailscale:
    image: tailscale/tailscale:latest
    container_name: ts-sidecar
    hostname: api-service
    environment:
      - TS_AUTHKEY=tskey-auth-xxxxx
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_USERSPACE=false
      - TS_EXTRA_ARGS=--advertise-tags=tag:api
    volumes:
      - tailscale-state:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - net_admin
      - sys_module
    restart: unless-stopped

  api:
    image: myapp/api:latest
    network_mode: "service:tailscale"
    depends_on:
      - tailscale
    environment:
      - DATABASE_URL=postgres://db-server:5432/mydb
      - REDIS_URL=redis://cache-server:6379

  db:
    image: postgres:16
    network_mode: "service:tailscale"
    depends_on:
      - tailscale

volumes:
  tailscale-state:
EOF

# 3. Headscale (Self-hosted control server)
cat > headscale-config.yaml << 'EOF'
server_url: https://headscale.example.com:443
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
grpc_listen_addr: 0.0.0.0:50443
private_key_path: /var/lib/headscale/private.key
noise:
  private_key_path: /var/lib/headscale/noise_private.key
ip_prefixes:
  - 100.64.0.0/10
  - fd7a:115c:a1e0::/48
derp:
  server:
    enabled: true
    region_id: 999
    stun_listen_addr: "0.0.0.0:3478"
dns_config:
  nameservers:
    - 1.1.1.1
  magic_dns: true
  base_domain: mesh.local
EOF

echo "Tailscale mesh configured"

????????? Tailscale ????????? Kubernetes

Deploy Tailscale ?????? Kubernetes cluster

# === Tailscale Kubernetes Integration ===

# 1. Tailscale Operator
cat > tailscale-operator.yaml << 'EOF'
# Install Tailscale Kubernetes Operator
apiVersion: v1
kind: Secret
metadata:
  name: tailscale-operator
  namespace: tailscale
type: Opaque
stringData:
  client_id: "k8s-operator-client-id"
  client_secret: "tskey-client-xxxxx"
---
# Tailscale Operator Helm values
# helm repo add tailscale https://pkgs.tailscale.com/helmcharts
# helm install tailscale-operator tailscale/tailscale-operator \
#   --namespace tailscale --create-namespace \
#   --set oauth.clientId=xxx --set oauth.clientSecret=xxx
EOF

# 2. Expose Service via Tailscale
cat > expose-service.yaml << 'EOF'
apiVersion: v1
kind: Service
metadata:
  name: api-service
  namespace: production
  annotations:
    tailscale.com/expose: "true"
    tailscale.com/hostname: "k8s-api"
    tailscale.com/tags: "tag:k8s,tag:api"
spec:
  selector:
    app: api
  ports:
    - port: 8080
      targetPort: 8080
  type: ClusterIP
---
# Ingress via Tailscale
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    tailscale.com/funnel: "true"
spec:
  ingressClassName: tailscale
  rules:
    - host: api
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 8080
  tls:
    - hosts:
        - api
EOF

# 3. Tailscale Sidecar Pattern
cat > sidecar-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-with-tailscale
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: myapp/api:latest
          ports:
            - containerPort: 8080
        - name: tailscale
          image: tailscale/tailscale:latest
          env:
            - name: TS_AUTHKEY
              valueFrom:
                secretKeyRef:
                  name: tailscale-auth
                  key: authkey
            - name: TS_KUBE_SECRET
              value: "tailscale-api-state"
            - name: TS_USERSPACE
              value: "true"
          securityContext:
            runAsUser: 1000
            runAsGroup: 1000
EOF

kubectl apply -f expose-service.yaml
echo "Kubernetes Tailscale integration ready"

Service Discovery ????????? Routing

MagicDNS ????????? service discovery

#!/usr/bin/env python3
# service_discovery.py ??? Tailscale Service Discovery
import json
import logging
from typing import Dict, List

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("discovery")

class TailscaleServiceDiscovery:
    """Service discovery via Tailscale MagicDNS"""
    
    def __init__(self):
        self.services = {}
    
    def register_service(self, name, tailscale_ip, port, tags=None):
        self.services[name] = {
            "name": name,
            "tailscale_ip": tailscale_ip,
            "magic_dns": f"{name}.tail-xxxxx.ts.net",
            "port": port,
            "tags": tags or [],
            "status": "healthy",
        }
    
    def discover(self, tag=None):
        """Discover services by tag"""
        if tag:
            return {k: v for k, v in self.services.items() if tag in v["tags"]}
        return self.services
    
    def get_endpoint(self, service_name):
        """Get service endpoint via MagicDNS"""
        svc = self.services.get(service_name)
        if not svc:
            return None
        return f"http://{svc['magic_dns']}:{svc['port']}"
    
    def network_topology(self):
        return {
            "environments": {
                "aws_production": {
                    "services": ["api-server", "worker-01", "worker-02"],
                    "subnet": "10.0.0.0/24",
                    "region": "ap-southeast-1",
                },
                "gcp_staging": {
                    "services": ["staging-api", "staging-db"],
                    "subnet": "10.1.0.0/24",
                    "region": "asia-southeast1",
                },
                "on_premise": {
                    "services": ["legacy-db", "file-server"],
                    "subnet": "192.168.1.0/24",
                    "location": "Bangkok office",
                },
                "developer_laptops": {
                    "services": ["dev-john", "dev-jane"],
                    "note": "Direct access to all environments via Tailscale",
                },
            },
            "connectivity": "All nodes connected via WireGuard tunnels, MagicDNS for name resolution",
        }

discovery = TailscaleServiceDiscovery()
discovery.register_service("api-server", "100.64.0.1", 8080, ["api", "production"])
discovery.register_service("db-server", "100.64.0.2", 5432, ["database", "production"])
discovery.register_service("cache-server", "100.64.0.3", 6379, ["cache", "production"])
discovery.register_service("staging-api", "100.64.0.10", 8080, ["api", "staging"])

# Discover production services
prod = discovery.discover("production")
print("Production Services:")
for name, svc in prod.items():
    endpoint = discovery.get_endpoint(name)
    print(f"  {name}: {endpoint}")

topo = discovery.network_topology()
print("\nNetwork Topology:")
for env, info in topo["environments"].items():
    print(f"  {env}: {info.get('services', [])}")

ACL ????????? Security Policies

Access Control Lists ?????????????????? Tailscale mesh

# === Tailscale ACL Configuration ===

cat > tailscale_acl.json << 'EOF'
{
  "tagOwners": {
    "tag:api": ["group:backend-team"],
    "tag:database": ["group:dba-team"],
    "tag:monitoring": ["group:sre-team"],
    "tag:k8s": ["group:platform-team"],
    "tag:dev": ["group:developers"]
  },
  
  "groups": {
    "group:backend-team": ["user1@example.com", "user2@example.com"],
    "group:dba-team": ["dba1@example.com"],
    "group:sre-team": ["sre1@example.com", "sre2@example.com"],
    "group:platform-team": ["platform1@example.com"],
    "group:developers": ["dev1@example.com", "dev2@example.com", "dev3@example.com"]
  },
  
  "acls": [
    {
      "action": "accept",
      "src": ["tag:api"],
      "dst": ["tag:database:5432"],
      "comment": "API servers can access database on port 5432"
    },
    {
      "action": "accept",
      "src": ["tag:api"],
      "dst": ["tag:api:6379"],
      "comment": "API servers can access Redis cache"
    },
    {
      "action": "accept",
      "src": ["tag:monitoring"],
      "dst": ["*:9090", "*:9100"],
      "comment": "Monitoring can scrape metrics from all nodes"
    },
    {
      "action": "accept",
      "src": ["group:developers"],
      "dst": ["tag:dev:*"],
      "comment": "Developers can access dev-tagged services"
    },
    {
      "action": "accept",
      "src": ["group:sre-team"],
      "dst": ["*:22", "*:443"],
      "comment": "SRE can SSH and HTTPS to all nodes"
    },
    {
      "action": "accept",
      "src": ["group:developers"],
      "dst": ["tag:api:8080"],
      "comment": "Developers can access API on port 8080 only"
    }
  ],
  
  "ssh": [
    {
      "action": "accept",
      "src": ["group:sre-team"],
      "dst": ["tag:k8s"],
      "users": ["root", "ubuntu"]
    },
    {
      "action": "accept",
      "src": ["group:developers"],
      "dst": ["tag:dev"],
      "users": ["developer"]
    }
  ],
  
  "tests": [
    {
      "src": "tag:api",
      "accept": ["tag:database:5432"],
      "deny": ["tag:database:22"]
    },
    {
      "src": "group:developers",
      "accept": ["tag:dev:8080"],
      "deny": ["tag:database:5432"]
    }
  ]
}
EOF

# Validate ACL
# tailscale acl validate tailscale_acl.json

# Apply via API
cat > apply_acl.sh << 'BASH'
#!/bin/bash
TAILSCALE_API_KEY=""
TAILNET="example.com"

curl -X POST "https://api.tailscale.com/api/v2/tailnet/$TAILNET/acl" \
  -H "Authorization: Bearer $TAILSCALE_API_KEY" \
  -H "Content-Type: application/json" \
  -d @tailscale_acl.json

echo "ACL applied"
BASH

echo "ACL and security policies configured"

Monitoring ????????? Troubleshooting

???????????????????????????????????????????????????

#!/usr/bin/env python3
# tailscale_monitor.py ??? Tailscale Mesh Monitoring
import json
import logging
from typing import Dict, List

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("monitor")

class TailscaleMonitor:
    def __init__(self):
        pass
    
    def health_check(self):
        return {
            "nodes": [
                {"name": "api-server-01", "status": "online", "latency_ms": 2.1, "last_seen": "now", "direct": True},
                {"name": "api-server-02", "status": "online", "latency_ms": 2.3, "last_seen": "now", "direct": True},
                {"name": "db-server", "status": "online", "latency_ms": 3.5, "last_seen": "now", "direct": True},
                {"name": "staging-api", "status": "online", "latency_ms": 45.2, "last_seen": "2m ago", "direct": False},
                {"name": "dev-john", "status": "offline", "latency_ms": None, "last_seen": "3h ago", "direct": False},
            ],
            "mesh_health": {
                "total_nodes": 12,
                "online": 11,
                "offline": 1,
                "direct_connections": 8,
                "relayed_connections": 3,
            },
        }
    
    def troubleshooting_commands(self):
        return {
            "check_status": "tailscale status",
            "check_connectivity": "tailscale ping ",
            "check_network": "tailscale netcheck",
            "debug_logs": "tailscale bugreport",
            "check_dns": "tailscale dns status",
            "check_routes": "tailscale status --json | jq '.Peer[] | {name: .HostName, routes: .PrimaryRoutes}'",
            "force_reconnect": "sudo tailscale down && sudo tailscale up",
            "check_firewall": "tailscale debug portmap",
        }
    
    def common_issues(self):
        return {
            "high_latency": {
                "cause": "Connection relayed through DERP server instead of direct",
                "fix": "Check firewall allows UDP 41641, enable port mapping (UPnP/NAT-PMP)",
                "debug": "tailscale ping  ??? check if direct or relay",
            },
            "node_offline": {
                "cause": "Tailscale daemon stopped or auth expired",
                "fix": "Restart tailscaled, re-authenticate with tailscale up",
                "debug": "systemctl status tailscaled",
            },
            "dns_not_resolving": {
                "cause": "MagicDNS not enabled or DNS conflict",
                "fix": "Enable MagicDNS in admin console, check /etc/resolv.conf",
                "debug": "tailscale dns status, dig .tail-xxxxx.ts.net",
            },
            "subnet_unreachable": {
                "cause": "Subnet routes not approved or IP forwarding disabled",
                "fix": "Approve routes in admin console, enable ip_forward in sysctl",
                "debug": "tailscale status ??? check if routes are advertised",
            },
        }

monitor = TailscaleMonitor()
health = monitor.health_check()
print("Tailscale Mesh Health:")
mesh = health["mesh_health"]
print(f"  Nodes: {mesh['online']}/{mesh['total_nodes']} online")
print(f"  Direct: {mesh['direct_connections']}, Relayed: {mesh['relayed_connections']}")

print("\nNode Status:")
for node in health["nodes"]:
    status = "UP" if node["status"] == "online" else "DOWN"
    conn = "direct" if node.get("direct") else "relay"
    latency = f"{node['latency_ms']}ms" if node["latency_ms"] else "N/A"
    print(f"  [{status}] {node['name']}: {latency} ({conn})")

issues = monitor.common_issues()
print("\nCommon Issues:")
for name, info in issues.items():
    print(f"  {name}: {info['cause']}")

FAQ ??????????????????????????????????????????

Q: Tailscale ????????? Istio/Linkerd ???????????????????????????????????????????

A: Tailscale ???????????? mesh VPN (network layer) ?????????????????? nodes ???????????? environments ????????? (cloud, on-prem, laptops) ????????? WireGuard encryption ?????? point-to-point tunnels ???????????????????????????????????? setup ????????????????????? Kubernetes ??????????????? cross-environment connectivity Istio/Linkerd ???????????? service mesh (application layer) ?????????????????????????????? Kubernetes cluster ?????? advanced features (traffic management, circuit breaking, canary deployments, observability) ????????? sidecar proxy (Envoy/linkerd2-proxy) ????????????????????????????????? ??????????????? complex microservices ?????? K8s ??????????????????????????????????????? Tailscale ?????????????????? clusters ????????? external services, Istio/Linkerd ?????????????????? traffic ??????????????? cluster

Q: Tailscale ????????????????????????????????????????

A: ?????????????????????????????? Tailscale ????????? WireGuard protocol ??????????????????????????????????????? audit ????????? peer-review ?????????????????????????????????????????? Encryption ChaCha20-Poly1305 (state-of-the-art), Key exchange Curve25519, Authentication ???????????? identity provider (Google, Microsoft, Okta), ACLs ???????????????????????? node ??????????????????????????? node ??????????????????, Peer-to-peer connections ????????????????????? Tailscale server (??????????????????????????????????????? third party), Zero trust model ????????? connection ???????????? authenticate Control plane (coordination server) ??????????????????????????? metadata (public keys, ACLs) ??????????????????????????????????????? traffic ?????????????????????????????? self-host control plane ????????? Headscale (open source)

Q: Headscale ????????? Tailscale SaaS ??????????????????????????????????

A: Tailscale SaaS ?????????????????????????????? ????????????????????? maintain server, free tier 100 devices 3 users, Personal plan $0 (1 user), Team $6/user/month ??????????????? teams ?????????????????????????????? self-host, ????????????????????? enterprise features (SSO, audit logs) Headscale open source self-hosted ????????? ???????????????????????? devices/users, ???????????? maintain server ?????????, ??????????????? GUI (????????? CLI) ?????? community tools ???????????? headscale-ui ??????????????? organizations ????????????????????? full control ?????????????????????????????? third-party dependency, compliance ?????????????????????????????? external services ??????????????? ??????????????????????????? Tailscale SaaS (free tier) ??????????????? scale ??????????????????????????????????????? compliance requirements ???????????? migrate ?????? Headscale

Q: Tailscale ?????????????????? traditional VPN ???????????????????

A: ????????? ?????????????????????????????????????????????????????? Traditional VPN (OpenVPN, IPSec) ?????? single point of failure (VPN concentrator), hub-and-spoke topology (traffic ???????????????????????? VPN server), complex configuration, performance bottleneck ????????? VPN server Tailscale ????????? mesh topology (peer-to-peer), ??????????????? single point of failure, distributed connections, performance ?????????????????? (direct connections), setup ????????????????????? (1 command) ?????????????????? remote access ????????? Tailscale ????????? OpenVPN ?????????????????? ??????????????????????????????????????????????????? ???????????????????????? ????????????????????????????????? ?????????????????? site-to-site VPN ????????? subnet routing ????????? Tailscale ????????? IPSec tunnels ?????????

📖 บทความที่เกี่ยวข้อง

Vue Nuxt Server Interview Preparationอ่านบทความ → Ansible Vault Interview Preparationอ่านบทความ → SSE Security Interview Preparationอ่านบทความ → Whisper Speech Interview Preparationอ่านบทความ → Stencil.js Interview Preparationอ่านบทความ →

📚 ดูบทความทั้งหมด →