← Cloudflare One / cloudflare-one / networks / connectors / cloudflare-tunnel / deployment-guides
Kubernetes
Kubernetes ↗ это инструмент оркестрации контейнеров, который используется для развёртывания приложений на физических или виртуальных машинах, масштабирования развёртывания в соответствии с нагрузкой и выпуска обновлений без простоя. Кластер Kubernetes, или среда, в которой работают экземпляры приложения, соединён внутренней частной сетью. Вы можете установить cloudflared демон внутри кластера Kubernetes, чтобы подключить приложения внутри кластера к Cloudflare.
В этом руководстве рассказано, как сделать Kubernetes service доступным из общедоступного интернета с помощью управляемый удалённо Cloudflare Tunnel. В рамках этого примера мы развернём простое веб-приложение вместе с cloudflared в Google Kubernetes Engine (GKE). Те же принципы применимы к любой другой среде Kubernetes (например, minikube, kubeadm, или облачный сервис Kubernetes), где cloudflared может подключаться к сети Cloudflare.
Архитектура
Как показано на схеме, мы рекомендуем настроить cloudflared как соседний развёртывание ↗ к развёртываниям приложения. Наличие отдельного развёртывания Kubernetes для cloudflared позволяет масштабировать cloudflared независимо от приложения. В cloudflared развертывания вы можете запустить несколько реплик работающих на одном и том же Cloudflare Tunnel: не нужно создавать отдельный туннель для каждого cloudflared под. Каждый cloudflared реплика / под может обращаться ко всем сервисам Kubernetes в кластере.
После подключения кластера к Cloudflare вы можете настроить маршруты Cloudflare Tunnel, чтобы управлять тем, как cloudflared будет проксировать трафик к службам внутри кластера. Например, вы можете опубликовать определённые приложения Kubernetes в интернете, ограничив доступ к другим приложениям только для внутренних пользователей Cloudflare One Client.
Предварительные требования
Чтобы выполнить следующую процедуру, вам потребуется:
1. Создайте GKE-кластер
Чтобы создать новый кластер Kubernetes в Google Cloud:
-
Откройте Google Cloud ↗ и перейдите в Kubernetes Engine.
-
В Кластеры, выберите Создание.
-
Назовите кластер. В этом примере мы назовём его
cloudflare-tunnel. -
(Необязательно) Выберите нужный регион и другие параметры кластера. В этом примере мы используем параметры по умолчанию.
-
Выберите Создание.
-
Чтобы подключиться к кластеру:
- Выберите меню с тремя точками.
- Выберите Подключить.
- Выберите Запустить в Cloud Shell и откройте терминал в браузере.
- Выберите Авторизовать.
- Нажмите
Enterи запустите предзаполненныйgcloudкоманда. - (Рекомендуется) В меню Cloud Shell выберите Открыть редактор чтобы запустить встроенную 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. Создайте поды для веб-приложения
Под представляет собой экземпляр запущенного процесса в кластере. В этом примере мы развернём httpbin ↗ приложение с двумя подами и сделайте поды доступными внутри кластера по адресу httpbin-service:80.
-
Создайте папку для файлов манифестов Kubernetes:
mkdir tunnel-example -
Перейдите в каталог:
cd tunnel-example -
В
tunnel-exampleкаталоге создайте новый файл с именемhttpbin.yaml. Этот файл определяет развёртывание Kubernetes для приложения httpbin.httpbin.yamlapiVersion: 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 service, который позволяет другим приложениям в кластере (например,cloudflared) для доступа к набору подов httpbin.httpbinsvc.yamlapiVersion: 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, перейдите в Сеть > Tunnels.
Выберите Создать туннель.
Введите имя туннеля (например,
gke-tunnel).Выберите Create Tunnel.
Выберите операционную систему и нажмите Docker.
Приложения необходимо упаковать в образ контейнера, прежде чем их можно будет запустить в Kubernetes. Поэтому мы будем использовать
cloudflaredОбраз контейнера Docker для развёртывания туннеля в Kubernetes.Вместо того чтобы выполнять команду установки, скопируйте только значение токена а не всю команду. Значение токена имеет вид
eyJhIjoiNWFiNGU5Z...Токен понадобится для файла манифеста Kubernetes.
Оставьте вкладку браузера с Cloudflare Tunnel открытой, пока мы разбираемся с развёртыванием в Kubernetes.
4. Сохраните токен туннеля
cloudflared использует токен туннеля для запуска Cloudflare Tunnel с удалённым управлением. Вы можете хранить токен туннеля в Kubernetes secret ↗.
-
В GKE Cloud Shell создайте
tunnel-token.yamlфайл со следующим содержимым. Обязательно замените<YOUR_TUNNEL_TOKEN>с токеном вашего туннеля (eyJhIjoiNWFiNGU5Z...).tunnel-token.yamlapiVersion: 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. Создайте поды для cloudflared
Чтобы запустить Cloudflare Tunnel в Kubernetes:
-
Создайте развёртывание Kubernetes для Cloudflare Tunnel с удалённым управлением:
tunnel.yamlapiVersion: 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образ на двух подах и запустите туннель с помощью команды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
Вы должны увидеть два cloudflared пода и два httpbin подов с Running статус. Если ваш 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, перейдите к Сеть > Tunnels и выберите свой туннель.
На Маршруты вкладке выберите Добавить маршрут > Опубликованное приложение.
Введите имя хоста приложения (например,
httpbin.<your-domain>.com).В разделе Сервис, введите
http://httpbin-service.httpbin-serviceявляется именем службы Kubernetes, определённой вhttpbinsvc.yaml.Выберите Добавить маршрут.
8. Проверьте подключение
Чтобы протестировать, откройте новую вкладку браузера и перейдите в httpbin.<your-domain>.com. Вы должны увидеть домашнюю страницу httpbin.
При желании вы можете создание приложения Access чтобы управлять тем, кто может получить доступ к сервису.