เนื้อหา

เปิดเว็บเซอร์วิสสู่ชาวโลกด้วย K3S + Cloudflare Tunnel

หากเรามี home lab หรือ service ที่อยู่ใน k3s/k8s อยากเปิดให้ชาวโลกได้เข้ามาใช้งาน แต่ไม่มี public IP จะทำอย่างไรได้นะ ยิ่งในโลกที่ทุกวันนี้ ISP แจก IP แบบ Carrier-grade NAT หรือเรียกติดปากกันว่า large-scale NAT (LSN) ทำให้จะใช้ DDNS ก็ลำบากอัปเดต IP กันอีก จึงเป็นที่มาของพระเอกในบทความนี้ครับ

cloudflare tunnel คืออะไร

/posts/cloudflare/tunnel_k3s/img/Access_Diagram.webp
Access Diagram
Cloudflare tunnel ตามชื่อเลยคือการสร้าง tunnel จากเราเข้าไปที่ cloudflare network ทำให้ cloudflare กลายมาเป็นหน้าด่านให้ระหว่างเราและโลกภายนอก

สร้าง cloudflare tunnel

เราต้องมีโดเมนที่ผูกไว้กับ cloudflare ก่อนอย่างน้อยหนึ่งชื่อนะครับ

เริ่มต้นจากเปิดใช้งานที่ https://one.dash.cloudflare.com/ แล้วเข้าเมนู Access > Tunnels > Create a tunnel

/posts/cloudflare/tunnel_k3s/img/create_tunnel.webp
create_tunnel

ตั้งชื่อ Tunnel

/posts/cloudflare/tunnel_k3s/img/naming_tunnel.webp
naming_tunnel

เอาค่า tunnel token เพื่อไปใส่ใน kube secret ตอน deploy

/posts/cloudflare/tunnel_k3s/img/tunnel_token.webp
tunnel_token

deploy cloudflare tunnel บน k3s/k8s

สร้างไฟล์ cloudflared-daemonset.yml หน้าตาประมาณนี้ โดยเอาค่า tunnel token ไปแปลงเป็น base64 แล้วใส่ไว้ใน secret ชื่อ cf_tunnel_token

จากนั้น deploy ด้วย

kubectl apply -f cloudflared-daemonset.yml

expose service สู่โลกภายนอก

เช็คสถานะใน cloudflare one dashboard ว่า tunnel เราเชื่อมต่อได้แล้ว

/posts/cloudflare/tunnel_k3s/img/tunnel_config.webp
tunnel_config

เสมือนว่าได้ kube-proxy + load balancer กันเลยทีเดียว

/posts/cloudflare/tunnel_k3s/img/kube_proxy.webp
kube_proxy

แล้วเราก็สามารถทำ reverse proxy เข้าไปหา servic ใน cluster เราได้เลยในเช่น service_name.namespace เช่น https ไปที่ rancher บน namspace cattle-system จะได้ตามภาพ

/posts/cloudflare/tunnel_k3s/img/ingress.webp
ingress
กรณีที่ service ใช้งาน self sign SSL เราต้องตั้งให้ cloudflare skip verify ไปด้วยครับ
/posts/cloudflare/tunnel_k3s/img/tls_skip_verify.webp
tls_skip_verify

ทดสอบเข้า service

/posts/cloudflare/tunnel_k3s/img/rancher.webp
rancher
/posts/cloudflare/tunnel_k3s/img/daemonset.webp
daemonset