# ☸️ Kubernetes-туннель — временный доступ к кластеру по одной ссылке

October 5, 2026 · 4 min read

Знакомая ситуация: подрядчику нужно посмотреть логи в staging-кластере, коллеге из соседней команды — помочь с отладкой, а API-сервер кластера закрыт от интернета. Дальше обычно выбирают между «завести человеку VPN и учётку» и «скинуть свой kubeconfig» — и оба варианта плохие.

В tuna-cli 0.36 появился новый тип туннеля — **Kubernetes**. Одна команда, и гость получает ссылку на готовый kubeconfig, с которым работает обычный `kubectl`:

```shell
tuna kubernetes --context=staging --service-account=shop/debug --preset=debug --ttl=4h

```

## Как это работает

Клиент читает ваш локальный kubeconfig, поднимает к API-серверу reverse-proxy и публикует его через HTTP-туннель с валидным TLS-сертификатом. Гость получает одноразовую ссылку:

```shell
curl -sfO https://<адрес туннеля>/tuna/<секрет>/kubeconfig.yaml
KUBECONFIG=./kubeconfig.yaml kubectl get pods

```

В скачанном kubeconfig лежит **гостевой токен**, а не ваши учётные данные. Прокси проверяет этот токен и подставляет вместо него настоящие креды — они никогда не покидают вашу машину. Остановили туннель — доступ пропал, отзывать нечего.

Через туннель работает всё, к чему привыкли пользователи `kubectl`: `get`, `list`, `watch`, `logs`, `exec` с stdin, `port-forward`, `pods/proxy` и запись — `scale`, `create`, `delete`. По сути, это такой auth-прокси к Kubernetes API, который поднимается одной командой и живёт ровно столько, сколько нужно.

## Права гостя — под вашим контролем

Первый уровень защиты — **RBAC**. По умолчанию гость работает с вашими правами, и клиент честно об этом предупреждает. Правильнее создать для гостя сервисный аккаунт с минимальными правами и передать его во флаге `--service-account`: токен для него клиент выпустит сам через TokenRequest API и будет продлевать каждый час.

Второй уровень — **ограничения самого туннеля**. Они работают поверх RBAC и могут только сужать права:

| Флаг                                 | Что делает                                                        |
| ------------------------------------ | ----------------------------------------------------------------- |
| `--namespace=shop`                   | Только один namespace, без кластерных ресурсов и `-A`             |
| `--read-only`                        | Только чтение: без `exec`, `attach` и `port-forward`, но с логами |
| `--no-delete`                        | Всё, кроме удаления                                               |
| `--deny-resource=secrets,configmaps` | Запрет на конкретные ресурсы                                      |
| `--deny-subresource=exec,attach`     | Запрет на субресурсы                                              |

Чтобы не собирать ограничения вручную, есть пресеты:

| Пресет     | Что разрешено                                                            |
| ---------- | ------------------------------------------------------------------------ |
| `view`     | Только чтение, без `secrets`, `exec`, `attach`, `port-forward` и `proxy` |
| `observer` | Только чтение подов и их логов                                           |
| `debug`    | Всё, кроме удаления                                                      |
| `open`     | Без дополнительных ограничений                                           |

Пресеты и флаги суммируются и не ослабляют друг друга: `--preset=debug --read-only` даёт только чтение.

## Срок действия и одноразовые ссылки

* `--ttl=4h` — через четыре часа `kubectl` гостя получит `this access has expired, ask for a new link`;
* `--download-limit` — сколько раз можно скачать kubeconfig, по умолчанию **один**. Если гость при первой же попытке получил `410`, значит, конфиг до него забрал кто-то другой: остановите туннель и выдайте новую ссылку.

Гостевые токены живут только в памяти процесса: после перезапуска клиента старые ссылки перестают работать.

## Всё под наблюдением

Туннель запускается в новом [терминальном интерфейсе](https://tuna.am/en/docs/tunnels/tui.md): в шапке — сервисный аккаунт, namespace, ограничения и срок действия доступа, ниже — лента запросов гостя. Те же запросы видны в [инспекторе](https://tuna.am/en/docs/tunnels/http/inspect.md) как обычные HTTP-запросы, так что всегда понятно, что именно делал гость в кластере.

## Кому пригодится

* **Подрядчикам и аутсорсу** — дать доступ к staging на время работ, без заведения учёток в облаке.
* **Поддержке и дежурным** — быстро пустить коллегу посмотреть логи и поды, в режиме `observer`.
* **Демо и обучению** — показать кластер на воркшопе с `--read-only` и коротким `--ttl`.
* **Локальным кластерам** — kind, minikube или k3s на ноутбуке становятся доступны коллеге без проброса портов.

Если нужен постоянный адрес, используйте зарезервированный поддомен (`--subdomain=k8s-staging`) или свой домен, а туннель можно запустить [как сервис](https://tuna.am/en/docs/tunnels/guides/service.md).

Kubernetes-туннель доступен по [подписке](https://tuna.am/#pricing) начиная с **tuna-cli 0.36.0**, у команды есть короткий алиас `tuna k8s`. Все флаги и подробности — в [документации](https://tuna.am/en/docs/tunnels/kubernetes.md).

## Leave feedback

If you enjoy using Tuna, or on the contrary you are not happy with something, please [leave feedback](https://my.tuna.am/?show_feedback=1).

![](/blog/img/2024-08-22/feedback.gif)

## Help

We value our users and carefully review every request. If you have any problems with tuna, please contact us in one of the following ways:

* [Email](mailto:info@tuna.am)
* [Telegram community](https://telegram.me/+Kgbtt0_gJwI5ZmEy)

**Tags:**

* [release](https://tuna.am/en/blog/tags/release)
* [tuna](https://tuna.am/en/blog/tags/tuna)
* [cli](https://tuna.am/en/blog/tags/cli)
* [kubernetes](https://tuna.am/en/blog/tags/kubernetes)
