INTEGRITY Документация

Kubernetes

Kubernetes это инструмент оркестрации контейнеров, который используется для развёртывания приложений на физических или виртуальных машинах, масштабирования развёртывания в соответствии с нагрузкой и выпуска обновлений без простоя. Кластер Kubernetes, или среда, в которой работают экземпляры приложения, соединён внутренней частной сетью. Вы можете установить cloudflared демон внутри кластера Kubernetes, чтобы подключить приложения внутри кластера к Cloudflare.

В этом руководстве рассказано, как сделать Kubernetes service доступным из общедоступного интернета с помощью управляемый удалённо Cloudflare Tunnel. В рамках этого примера мы развернём простое веб-приложение вместе с cloudflared в Google Kubernetes Engine (GKE). Те же принципы применимы к любой другой среде Kubernetes (например, minikube, kubeadm, или облачный сервис Kubernetes), где cloudflared может подключаться к сети Cloudflare.

Архитектура

Схема, показывающая, как пользователь подключается к сервисам Kubernetes через Cloudflare Tunnel

Как показано на схеме, мы рекомендуем настроить cloudflared как соседний развёртывание к развёртываниям приложения. Наличие отдельного развёртывания Kubernetes для cloudflared позволяет масштабировать cloudflared независимо от приложения. В cloudflared развертывания вы можете запустить несколько реплик работающих на одном и том же Cloudflare Tunnel: не нужно создавать отдельный туннель для каждого cloudflared под. Каждый cloudflared реплика / под может обращаться ко всем сервисам Kubernetes в кластере.

После подключения кластера к Cloudflare вы можете настроить маршруты Cloudflare Tunnel, чтобы управлять тем, как cloudflared будет проксировать трафик к службам внутри кластера. Например, вы можете опубликовать определённые приложения Kubernetes в интернете, ограничив доступ к другим приложениям только для внутренних пользователей Cloudflare One Client.

Предварительные требования

Чтобы выполнить следующую процедуру, вам потребуется:

1. Создайте GKE-кластер

Чтобы создать новый кластер Kubernetes в Google Cloud:

  1. Откройте Google Cloud и перейдите в Kubernetes Engine.

  2. В Кластеры, выберите Создание.

  3. Назовите кластер. В этом примере мы назовём его cloudflare-tunnel.

  4. (Необязательно) Выберите нужный регион и другие параметры кластера. В этом примере мы используем параметры по умолчанию.

  5. Выберите Создание.

  6. Чтобы подключиться к кластеру:

    1. Выберите меню с тремя точками.
    2. Выберите Подключить.
    3. Выберите Запустить в Cloud Shell и откройте терминал в браузере.
    4. Выберите Авторизовать.
    5. Нажмите Enter и запустите предзаполненный gcloud команда.
    6. (Рекомендуется) В меню Cloud Shell выберите Открыть редактор чтобы запустить встроенную 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. Создайте поды для веб-приложения

Под представляет собой экземпляр запущенного процесса в кластере. В этом примере мы развернём httpbin приложение с двумя подами и сделайте поды доступными внутри кластера по адресу httpbin-service:80.

  1. Создайте папку для файлов манифестов Kubernetes:

    mkdir tunnel-example
  2. Перейдите в каталог:

    cd tunnel-example
  3. В tunnel-example каталоге создайте новый файл с именем httpbin.yaml. Этот файл определяет развёртывание Kubernetes для приложения httpbin.

    httpbin.yaml
    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 service, который позволяет другим приложениям в кластере (например, cloudflared) для доступа к набору подов httpbin.

    httpbinsvc.yaml
    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, перейдите в Сеть > Tunnels.

  2. Выберите Создать туннель.

  3. Введите имя туннеля (например, gke-tunnel).

  4. Выберите Create Tunnel.

  5. Выберите операционную систему и нажмите Docker.

    Приложения необходимо упаковать в образ контейнера, прежде чем их можно будет запустить в Kubernetes. Поэтому мы будем использовать cloudflared Образ контейнера Docker для развёртывания туннеля в Kubernetes.

  6. Вместо того чтобы выполнять команду установки, скопируйте только значение токена а не всю команду. Значение токена имеет вид eyJhIjoiNWFiNGU5Z... Токен понадобится для файла манифеста Kubernetes.

Оставьте вкладку браузера с Cloudflare Tunnel открытой, пока мы разбираемся с развёртыванием в Kubernetes.

4. Сохраните токен туннеля

cloudflared использует токен туннеля для запуска Cloudflare Tunnel с удалённым управлением. Вы можете хранить токен туннеля в Kubernetes secret.

  1. В GKE Cloud Shell создайте tunnel-token.yaml файл со следующим содержимым. Обязательно замените <YOUR_TUNNEL_TOKEN> с токеном вашего туннеля (eyJhIjoiNWFiNGU5Z...).

    tunnel-token.yaml
    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. Создайте поды для cloudflared

Чтобы запустить Cloudflare Tunnel в Kubernetes:

  1. Создайте развёртывание Kubernetes для Cloudflare Tunnel с удалённым управлением:

    tunnel.yaml
    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 образ на двух подах и запустите туннель с помощью команды 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

Вы должны увидеть два cloudflared пода и два httpbin подов с Running статус. Если ваш 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, перейдите к Сеть > Tunnels и выберите свой туннель.

  2. На Маршруты вкладке выберите Добавить маршрут > Опубликованное приложение.

  3. Введите имя хоста приложения (например, httpbin.<your-domain>.com).

  4. В разделе Сервис, введите http://httpbin-service. httpbin-service является именем службы Kubernetes, определённой в httpbinsvc.yaml.

  5. Выберите Добавить маршрут.

8. Проверьте подключение

Чтобы протестировать, откройте новую вкладку браузера и перейдите в httpbin.<your-domain>.com. Вы должны увидеть домашнюю страницу httpbin.

При желании вы можете создание приложения Access чтобы управлять тем, кто может получить доступ к сервису.