מדריך קלאודפלייר בעברית

תיעוד 176

Kubernetes

Kubernetes ↗︎ הוא כלי לתזמור קונטיינרים שמשמש לפריסת יישומים על מכונות פיזיות או וירטואליות, להרחבת הפריסה לפי דרישות התעבורה, ולדחיפת עדכונים בלי השבתה. אשכול Kubernetes, או הסביבה, שבה רצות מופעי היישום מחובר פנימית דרך רשת פרטית. אפשר להתקין את הדמון cloudflared בתוך אשכול Kubernetes כדי לחבר יישומים בתוך האשכול אל Cloudflare.

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

#מנהרות שמנוהלות מקומית

אם אתם מחפשים להגדיר מנהרה שמנוהלת מקומית ב-Kubernetes, עיינו בקוד הדוגמה ב-GitHub ↗︎.

#ארכיטקטורה

תרשים שמראה איך משתמש מתחבר לשירותי Kubernetes דרך Cloudflare Tunnel

כפי שמוצג בתרשים, אנחנו ממליצים להגדיר את 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:

  1. פתחו את Google Cloud ↗︎ ועברו אל Kubernetes Engine.

  2. ב-Clusters, בחרו Create.

  3. תנו שם לאשכול. בדוגמה הזו נקרא לו cloudflare-tunnel.

  4. (אופציונלי) בחרו את האזור הרצוי ומפרטי אשכול אחרים. בדוגמה הזו נשתמש במפרטי ברירת המחדל.

  5. בחרו Create.

  6. כדי להתחבר לאשכול:

    1. בחרו את תפריט שלוש הנקודות.
    2. בחרו Connect.
    3. בחרו Run in Cloud Shell כדי לפתוח מסוף בדפדפן.
    4. בחרו Authorize.
    5. לחצו על Enter כדי להריץ את פקודת gcloud שמולאה מראש.
    6. (מומלץ) בתפריט Cloud Shell, בחרו Open Editor כדי להפעיל את ה-IDE המובנה.
  7. במסוף Cloud Shell, הריצו את הפקודה הבאה כדי לבדוק את מצב האשכול:

    kubectl get all
    NAME                 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.

  1. צרו תיקייה לקובצי המניפסט של Kubernetes:

    mkdir tunnel-example
  2. עברו אל התיקייה:

    cd tunnel-example
  3. בתיקייה 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
  4. צרו קובץ חדש בשם 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
  5. השתמשו בפקודה הבאה כדי להריץ את היישום בתוך האשכול:

    kubectl create -f httpbin.yaml -f httpbinsvc.yaml
  6. בדקו את מצב הפריסה:

    kubectl get all
    NAME                                     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:

  1. בלוח הבקרה של Cloudflare, עברו אל Networking > Tunnels.

  2. בחרו Create a tunnel.

  3. הזינו שם למנהרה (לדוגמה, gke-tunnel).

  4. בחרו Create Tunnel.

  5. בחרו את מערכת ההפעלה שלכם ובחרו Docker.

    יישומים חייבים להיארז לתוך תמונת קונטיינר לפני שאפשר להריץ אותם ב-Kubernetes. לכן נשתמש בתמונת קונטיינר Docker של cloudflared כדי לפרוס את המנהרה ב-Kubernetes.

  6. במקום להריץ את פקודת ההתקנה, העתיקו רק את ערך הטוקן ולא את כל הפקודה. ערך הטוקן הוא בצורה eyJhIjoiNWFiNGU5Z.... תצטרכו את הטוקן לקובץ המניפסט של Kubernetes.

השאירו את לשונית הדפדפן של Cloudflare Tunnel פתוחה בזמן שנתמקד בפריסת Kubernetes.

#4. שמירת טוקן המנהרה

cloudflared משתמש בטוקן מנהרה כדי להריץ Cloudflare Tunnel שמנוהל מרחוק. אפשר לשמור את טוקן המנהרה ב-Kubernetes secret ↗︎.

  1. ב-GKE Cloud Shell, צרו קובץ tunnel-token.yaml עם התוכן הבא. הקפידו להחליף את <YOUR_TUNNEL_TOKEN> בטוקן המנהרה שלכם (eyJhIjoiNWFiNGU5Z...).

    apiVersion: v1
    kind: Secret
    metadata:
      name: tunnel-token
    stringData:
      token: <YOUR_TUNNEL_TOKEN>
  2. צרו את ה-secret:

    kubectl create -f tunnel-token.yaml
  3. בדקו את ה-secret שנוצר:

    kubectl get secrets
    NAME        TYPE     DATA   AGE
    tunnel-token   Opaque   1      100s

#5. יצירת pods עבור cloudflared

כדי להריץ את Cloudflare Tunnel ב-Kubernetes:

  1. צרו 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
  2. פרסו את cloudflared לאשכול:

    kubectl create -f tunnel.yaml

    Kubernetes יתקין את תמונת cloudflared על שני pods ויריץ את המנהרה באמצעות הפקודה cloudflared tunnel --no-autoupdate --loglevel info --metrics 0.0.0.0:2000 run. cloudflared יצרוך את טוקן המנהרה ממשתנה הסביבה TUNNEL_TOKEN.

  3. בדקו את מצב האשכול:

    kubectl get all
    NAME                                          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-85l5w
2025-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 דרך המנהרה.

  1. בלוח הבקרה של Cloudflare, עברו אל Networking > Tunnels ובחרו את המנהרה שלכם.
  2. בלשונית Routes, בחרו Add route > Published application.
  3. הזינו שם מארח ליישום (לדוגמה, httpbin.<your-domain>.com).
  4. תחת Service, הזינו http://httpbin-service. httpbin-service הוא שם שירות Kubernetes שמוגדר בקובץ httpbinsvc.yaml.
  5. בחרו Add route.

#8. בדיקת החיבור

לבדיקה, פתחו לשונית דפדפן חדשה ועברו אל httpbin.<your-domain>.com. אמורה להופיע דף הבית של httpbin.

אפשר להוסיף, לפי בחירה, את Cloudflare Access כדי לשלוט מי יכול לגשת אל השירות.