תיעוד 176
Kubernetes
Kubernetes ↗︎ הוא כלי לתזמור קונטיינרים שמשמש לפריסת יישומים על מכונות פיזיות או וירטואליות, להרחבת הפריסה לפי דרישות התעבורה, ולדחיפת עדכונים בלי השבתה. אשכול Kubernetes, או הסביבה, שבה רצות מופעי היישום מחובר פנימית דרך רשת פרטית. אפשר להתקין את הדמון cloudflared בתוך אשכול Kubernetes כדי לחבר יישומים בתוך האשכול אל Cloudflare.
המדריך הזה מכסה איך לחשוף שירות Kubernetes לאינטרנט הציבורי באמצעות Cloudflare Tunnel שמנוהל מרחוק. לצורך הדוגמה הזו נפרוס יישום אינטרנט בסיסי לצד cloudflared ב-Google Kubernetes Engine (GKE). אותם עקרונות חלים על כל סביבת Kubernetes אחרת (כמו minikube, kubeadm, או שירות Kubernetes מבוסס ענן) שבה cloudflared יכול להתחבר לרשת של Cloudflare.
#מנהרות שמנוהלות מקומית
אם אתם מחפשים להגדיר מנהרה שמנוהלת מקומית ב-Kubernetes, עיינו בקוד הדוגמה ב-GitHub ↗︎.
#ארכיטקטורה

כפי שמוצג בתרשים, אנחנו ממליצים להגדיר את cloudflared כ-deployment ↗︎ סמוך לפריסות היישום. Deployment נפרד של Kubernetes עבור cloudflared מאפשר לכם להרחיב את cloudflared בנפרד מהיישום. ב-deployment של cloudflared אפשר להפעיל כמה replicas שמריצים את אותו Cloudflare Tunnel: אין צורך לבנות מנהרה ייעודית לכל pod של cloudflared. כל replica או pod של cloudflared יכול להגיע לכל שירותי Kubernetes באשכול.
הערה
אנחנו לא ממליצים להשתמש ב-cloudflared בהגדרות autoscaling, כי צמצום (הסרת replicas) ישבור חיבורי משתמש קיימים לאותו replica. בנוסף, cloudflared לא מאזן עומסים בין replicas. replicas מיועדים אך ורק לזמינות גבוהה. כדי לאזן עומסים לתעבורה אל הצמתים שלכם, אפשר להשתמש ב-Cloudflare Load Balancer או במאזן עומסים של צד שלישי.
אחרי שהאשכול מחובר ל-Cloudflare, אפשר להגדיר נתיבי Cloudflare Tunnel כדי לשלוט איך cloudflared יתווך תעבורה אל שירותים בתוך האשכול. לדוגמה, ייתכן שתרצו לפרסם יישומי Kubernetes מסוימים לאינטרנט ולהגביל יישומים אחרים למשתמשי Cloudflare One Client פנימיים.
#דרישות מוקדמות
כדי להשלים את ההליך הבא תצטרכו:
#1. יצירת אשכול GKE
כדי ליצור אשכול Kubernetes חדש ב-Google Cloud:
פתחו את Google Cloud ↗︎ ועברו אל Kubernetes Engine.
ב-Clusters, בחרו Create.
תנו שם לאשכול. בדוגמה הזו נקרא לו
cloudflare-tunnel.(אופציונלי) בחרו את האזור הרצוי ומפרטי אשכול אחרים. בדוגמה הזו נשתמש במפרטי ברירת המחדל.
בחרו Create.
כדי להתחבר לאשכול:
- בחרו את תפריט שלוש הנקודות.
- בחרו Connect.
- בחרו Run in Cloud Shell כדי לפתוח מסוף בדפדפן.
- בחרו Authorize.
- לחצו על
Enterכדי להריץ את פקודתgcloudשמולאה מראש. - (מומלץ) בתפריט Cloud Shell, בחרו Open Editor כדי להפעיל את ה-IDE המובנה.
במסוף Cloud Shell, הריצו את הפקודה הבאה כדי לבדוק את מצב האשכול:
kubectl get allNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 15m
#2. יצירת pods ליישום האינטרנט
pod מייצג מופע של תהליך רץ באשכול. בדוגמה הזו נפרוס את יישום httpbin ↗︎ עם שני pods, ונאפשר גישה אל ה-pods בתוך האשכול בכתובת httpbin-service:80.
צרו תיקייה לקובצי המניפסט של Kubernetes:
mkdir tunnel-exampleעברו אל התיקייה:
cd tunnel-exampleבתיקייה
tunnel-example, צרו קובץ חדש בשםhttpbin.yaml. הקובץ הזה מגדיר את ה-deployment של Kubernetes עבור יישום httpbin.apiVersion: apps/v1 kind: Deployment metadata: name: httpbin-deployment namespace: default spec: replicas: 2 selector: matchLabels: app: httpbin template: metadata: labels: app: httpbin spec: containers: - name: httpbin image: kennethreitz/httpbin:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80צרו קובץ חדש בשם
httpbinsvc.yaml. הקובץ הזה מגדיר שירות Kubernetes שמאפשר ליישומים אחרים באשכול (כמוcloudflared) לגשת אל קבוצת ה-pods של httpbin.apiVersion: v1 kind: Service metadata: name: httpbin-service namespace: default spec: type: LoadBalancer selector: app: httpbin ports: - port: 80 targetPort: 80השתמשו בפקודה הבאה כדי להריץ את היישום בתוך האשכול:
kubectl create -f httpbin.yaml -f httpbinsvc.yamlבדקו את מצב הפריסה:
kubectl get allNAME READY STATUS RESTARTS AGE pod/httpbin-deployment-bc6689c5d-b5ftk 1/1 Running 0 79s pod/httpbin-deployment-bc6689c5d-cbd9m 1/1 Running 0 79s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/httpbin-service LoadBalancer 34.118.225.147 34.75.201.60 80:31967/TCP 79s service/kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 24h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/httpbin-deployment 2/2 2 2 79s NAME DESIRED CURRENT READY AGE replicaset.apps/httpbin-deployment-bc6689c5d 2 2 2 79s
#3. יצירת מנהרה
כדי ליצור Cloudflare Tunnel:
בלוח הבקרה של Cloudflare, עברו אל Networking > Tunnels.
בחרו Create a tunnel.
הזינו שם למנהרה (לדוגמה,
gke-tunnel).בחרו Create Tunnel.
בחרו את מערכת ההפעלה שלכם ובחרו Docker.
יישומים חייבים להיארז לתוך תמונת קונטיינר לפני שאפשר להריץ אותם ב-Kubernetes. לכן נשתמש בתמונת קונטיינר Docker של
cloudflaredכדי לפרוס את המנהרה ב-Kubernetes.במקום להריץ את פקודת ההתקנה, העתיקו רק את ערך הטוקן ולא את כל הפקודה. ערך הטוקן הוא בצורה
eyJhIjoiNWFiNGU5Z.... תצטרכו את הטוקן לקובץ המניפסט של Kubernetes.
השאירו את לשונית הדפדפן של Cloudflare Tunnel פתוחה בזמן שנתמקד בפריסת Kubernetes.
#4. שמירת טוקן המנהרה
cloudflared משתמש בטוקן מנהרה כדי להריץ Cloudflare Tunnel שמנוהל מרחוק. אפשר לשמור את טוקן המנהרה ב-Kubernetes secret ↗︎.
ב-GKE Cloud Shell, צרו קובץ
tunnel-token.yamlעם התוכן הבא. הקפידו להחליף את<YOUR_TUNNEL_TOKEN>בטוקן המנהרה שלכם (eyJhIjoiNWFiNGU5Z...).apiVersion: v1 kind: Secret metadata: name: tunnel-token stringData: token: <YOUR_TUNNEL_TOKEN>צרו את ה-secret:
kubectl create -f tunnel-token.yamlבדקו את ה-secret שנוצר:
kubectl get secretsNAME TYPE DATA AGE tunnel-token Opaque 1 100s
#5. יצירת pods עבור cloudflared
כדי להריץ את Cloudflare Tunnel ב-Kubernetes:
צרו deployment של Kubernetes עבור Cloudflare Tunnel שמנוהל מרחוק:
apiVersion: apps/v1 kind: Deployment metadata: name: cloudflared-deployment namespace: default spec: replicas: 2 selector: matchLabels: pod: cloudflared template: metadata: labels: pod: cloudflared spec: securityContext: sysctls: # Allows ICMP traffic (ping, traceroute) to resources behind cloudflared. - name: net.ipv4.ping_group_range value: "65532 65532" containers: - image: cloudflare/cloudflared:latest name: cloudflared env: # Defines an environment variable for the tunnel token. - name: TUNNEL_TOKEN valueFrom: secretKeyRef: name: tunnel-token key: token command: # Configures tunnel run parameters - cloudflared - tunnel - --no-autoupdate - --loglevel - info - --metrics - 0.0.0.0:2000 - run livenessProbe: httpGet: # Cloudflared has a /ready endpoint which returns 200 if and only if # it has an active connection to Cloudflare's network. path: /ready port: 2000 failureThreshold: 1 initialDelaySeconds: 10 periodSeconds: 10פרסו את
cloudflaredלאשכול:kubectl create -f tunnel.yamlKubernetes יתקין את תמונת
cloudflaredעל שני pods ויריץ את המנהרה באמצעות הפקודהcloudflared tunnel --no-autoupdate --loglevel info --metrics 0.0.0.0:2000 run.cloudflaredיצרוך את טוקן המנהרה ממשתנה הסביבהTUNNEL_TOKEN.בדקו את מצב האשכול:
kubectl get allNAME READY STATUS RESTARTS AGE pod/cloudflared-deployment-6d5f9f9666-85l5w 1/1 Running 0 21s pod/cloudflared-deployment-6d5f9f9666-wb96x 1/1 Running 0 21s pod/httpbin-deployment-bc6689c5d-b5ftk 1/1 Running 0 3m36s pod/httpbin-deployment-bc6689c5d-cbd9m 1/1 Running 0 3m36s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/httpbin-service LoadBalancer 34.118.225.147 34.75.201.60 80:31967/TCP 3m36s service/kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 24h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/cloudflared-deployment 2/2 2 2 22s deployment.apps/httpbin-deployment 2/2 2 2 3m37s NAME DESIRED CURRENT READY AGE replicaset.apps/cloudflared-deployment-6d5f9f9666 2 2 2 22s replicaset.apps/httpbin-deployment-bc6689c5d 2 2 2 3m37s
אמורים להופיע שני pods של cloudflared ושני pods של httpbin עם סטטוס Running. אם ה-pods של cloudflared ממשיכים להתאתחל, בדקו את תחביר command בקובץ tunnel.yaml וודאו שפרמטרי ההרצה של המנהרה נמצאים בסדר הנכון.
#6. אימות מצב המנהרה
כדי להדפיס לוגים עבור מופע cloudflared:
kubectl logs pod/cloudflared-deployment-6d5f9f9666-85l5w2025-06-11T22:00:47Z INF Starting tunnel tunnelID=64c359b6-e111-40ec-a3a9-199c2a656613
2025-06-11T22:00:47Z INF Version 2025.6.0 (Checksum 72f233bb55199093961bf099ad62d491db58819df34b071ab231f622deff33ce)
2025-06-11T22:00:47Z INF GOOS: linux, GOVersion: go1.24.2, GoArch: amd64
2025-06-11T22:00:47Z INF Settings: map[loglevel:debug metrics:0.0.0.0:2000 no-autoupdate:true token:*****]
2025-06-11T22:00:47Z INF Generated Connector ID: aff7c4a0-85a3-4ac9-8475-1e0aa1af8d94
2025-06-11T22:00:47Z DBG Fetched protocol: quic
2025-06-11T22:00:47Z INF Initial protocol quic
...#7. הוספת נתיב מנהרה
עכשיו, כשהמנהרה פועלת, אפשר לנתב את שירות httpbin דרך המנהרה.
- בלוח הבקרה של Cloudflare, עברו אל Networking > Tunnels ובחרו את המנהרה שלכם.
- בלשונית Routes, בחרו Add route > Published application.
- הזינו שם מארח ליישום (לדוגמה,
httpbin.<your-domain>.com). - תחת Service, הזינו
http://httpbin-service.httpbin-serviceהוא שם שירות Kubernetes שמוגדר בקובץhttpbinsvc.yaml. - בחרו Add route.
#8. בדיקת החיבור
לבדיקה, פתחו לשונית דפדפן חדשה ועברו אל httpbin.<your-domain>.com. אמורה להופיע דף הבית של httpbin.
אפשר להוסיף, לפי בחירה, את Cloudflare Access כדי לשלוט מי יכול לגשת אל השירות.