Проблема, с которой сталкивается каждый DevOps-инженер
3 часа ночи. Прод упал. Нужно срочно разбираться.
Что вы делаете?
$ export AWS_PROFILE=production
$ kubectx production-cluster
$ kubectl config set-context --current --namespace=api
$ ssh -f -N -L 5432:db.prod:5432 bastion.prod
$ export VAULT_ADDR=https://vault.prod
$ # ... стоп, а какой профиль сейчас активен?
6+ команд. Каждый. Раз.
И это при условии, что вы их все правильно помните. Одна неверная команда в три ночи — и вы только что задеплоили не в тот кластер. Или хуже: случайно изменили прод с активными dev-кредами.
Почему kubectx недостаточно
Не поймите неправильно — kubectx отлично справляется со своей задачей. Но он решает лишь одну часть головоломки: контексты Kubernetes (Kubernetes contexts).
А что насчёт:
-
Учётных данных AWS/GCP/Azure?
-
SSH-туннелей до баз данных?
-
VPN-соединений?
-
Переменных окружения?
-
Токенов Vault?
-
Конфигураций пользователя Git?
-
Профилей браузера для SSO?
В итоге вы по-прежнему жонглируете 7+ разными инструментами и надеетесь, что они все остаются синхронизированными.
Знакомьтесь: ctx — одна команда для всего окружения
ctx рассматривает всё ваше DevOps-окружение как единый переключаемый контекст (switchable context):
$ ctx use production
⚠ Switching to PRODUCTION environment: production
Type 'yes' to confirm: yes
✓ AWS profile: production (us-east-1)
✓ Kubernetes: prod-cluster/default
✓ VPN connected: wireguard (wg0)
✓ Tunnel postgres: localhost:5432 → db.prod:5432
✓ Tunnel redis: localhost:6379 → cache.prod:6379
✓ Browser: Chrome (Production Profile)
✓ Environment variables loaded
✓ Secrets loaded from Vault
[ctx: production] $
Одна команда. Всё переключается.
Сравнение с другими инструментами
Посмотрим, как разные инструменты справляются с типичной мультиоблачной, многосредовой конфигурацией:
| Функция | kubectx | direnv | aws-vault | ctx |
|---|---|---|---|---|
Контекст Kubernetes |
✅ |
❌ |
❌ |
✅ |
Мультиоблако (AWS/GCP/Azure) |
❌ |
❌ |
Только AWS |
✅ |
Переменные окружения |
❌ |
✅ |
❌ |
✅ |
SSH-туннели |
❌ |
❌ |
❌ |
✅ |
Управление VPN |
❌ |
❌ |
❌ |
✅ |
Защита production |
❌ |
❌ |
❌ |
✅ |
Авто-получение K8s-кредов |
❌ |
❌ |
❌ |
✅ |
Наследование контекстов |
❌ |
❌ |
❌ |
✅ |
Интерполяция переменных |
❌ |
✅ |
❌ |
✅ |
Управление секретами |
❌ |
❌ |
❌ |
✅ |
Профили браузера |
❌ |
❌ |
❌ |
✅ |
Быстрые ссылки на URL |
❌ |
❌ |
❌ |
✅ |
Чем ctx отличается от остальных
1. Защита production (потому что вы в три ночи — опасный человек)
$ ctx use production
⚠ Switching to PRODUCTION environment: production
Type 'yes' to confirm: yes
✓ Context 'production' is now active.
⚠ You are now in PRODUCTION environment.
Вы должны сознательно хотеть попасть в прод. Больше никаких «ой, не тот кластер».
Тип окружения production требует явного подтверждения. Никаких флагов, никаких коротких путей — просто введите «yes», чтобы подтвердить, что вы действительно хотите получить доступ к производственной среде.
2. Автоматическое получение учётных данных Kubernetes от облачных провайдеров
ctx автоматически получает K8s-учётные данные при переключении контекстов:
# Конфиг контекста
kubernetes:
context: my-cluster
namespace: default
eks:
cluster: my-cluster
region: us-west-2
При переключении ctx автоматически выполняет нужную команду:
-
EKS:
aws eks update-kubeconfig --name <cluster> --region <region> -
GKE:
gcloud container clusters get-credentials <cluster> --zone <zone> --project <project> -
AKS:
az aks get-credentials --name <cluster> --resource-group <rg>
Больше никакого ручного обновления кредов. Всё работает само.
3. Наследование контекстов и интерполяция переменных для DRY-конфигов
Управляете 50 похожими кластерами? Объедините наследование с переменными:
# base-acme.yaml (абстрактная база)
name: acme-base
abstract: true
cloud: acme
kubernetes:
context: "acme-${CLUSTER_NAME}-cluster"
kubeconfig: "~/clusters/acme/${CLUSTER_NAME}/config"
env:
API_URL: "https://api.${CLUSTER_NAME}.acme.com"
CLUSTER: "${CLUSTER_NAME}"
# daisy.yaml (наследует базу + задаёт переменную)
name: daisy
extends: acme-base
env:
CLUSTER_NAME: daisy
# eve.yaml (наследует базу + задаёт переменную)
name: eve
extends: acme-base
env:
CLUSTER_NAME: eve
Два кластера. 8 строк суммарно. Переменные раскрываются после слияния при наследовании, поэтому можно ссылаться на них прямо в базовом конфиге.
4. SSH-туннели через бастион с автоматическим переподключением
Туннели, которые реально держатся, — все идут через ваш бастионный хост:
ssh:
bastion:
host: bastion.example.com
user: deploy # по умолчанию $USER, если не задан
port: 22
tunnels:
- name: postgres
remote_host: db.internal
remote_port: 5432
local_port: 5432
timeout: 10s # настраиваемый таймаут
- name: redis
remote_host: cache.internal
remote_port: 6379
local_port: 6379
Все туннели идут через бастион. ctx управляет жизненным циклом SSH-соединения. При переключении контекста старые туннели корректно завершаются. Никаких осиротевших SSH-процессов.
$ ctx tunnel list
Active tunnels for context 'staging':
postgres: localhost:5432 → db.internal:5432 (PID: 12345)
redis: localhost:6379 → cache.internal:6379 (PID: 12346)
$ ctx tunnel down postgres
✓ Tunnel 'postgres' stopped
$ ctx tunnel up postgres
✓ Tunnel 'postgres' started
Если локальный порт уже занят, ctx обнаружит конфликт и сообщит об этом.
5. Секреты из множества хранилищ
Получайте секреты из любого поддерживаемого менеджера:
secrets:
# Bitwarden
bitwarden:
DB_PASSWORD: "Production DB#password"
API_KEY: "Production API Key"
# 1Password
onepassword:
SMTP_PASSWORD: "SendGrid#password"
# HashiCorp Vault
vault:
CONSUL_TOKEN: "operations/consul#http_token"
NOMAD_TOKEN: "operations/nomad#token"
# AWS Secrets Manager
aws_secrets_manager:
DATADOG_API_KEY: "prod/datadog#api_key"
# AWS SSM Parameter Store
aws_ssm:
DATABASE_URL: "/prod/database/url"
# GCP Secret Manager
gcp_secret_manager:
SENTRY_DSN: "prod-sentry-dsn"
# Конфиги хранилищ
bitwarden:
auto_login: true
vault:
address: https://vault.prod.internal
namespace: operations
При переключении контекста ctx получает все настроенные секреты и экспортирует их как переменные окружения. Никаких захардкоженных кредов.
Все хранилища секретов поддерживают автоматическую аутентификацию:
-
Bitwarden: автовход с поддержкой SSO (org_identifier)
-
1Password: биометрическая/системная аутентификация
-
Vault: управление токенами с авторефрешем
-
AWS: SSO, интеграция с aws-vault
-
GCP: аутентификация через gcloud с SSO
-
Azure: аутентификация через az CLI с SSO
6. Поддержка VPN (OpenVPN, WireGuard, Tailscale)
Автоматическое подключение к VPN при переключении контекста:
# OpenVPN
vpn:
openvpn:
config: /etc/openvpn/production.ovpn
auth_file: /etc/openvpn/auth.txt
# WireGuard
vpn:
wireguard:
interface: wg0
config: /etc/wireguard/prod.conf
# Tailscale
vpn:
tailscale:
network: prod-network
# Произвольная команда
vpn:
command: /usr/local/bin/connect-prod-vpn.sh
VPN подключается автоматически при активации контекста и отключается при его деактивации.
7. Профили браузера (Chrome и Firefox)
Запускайте нужный профиль браузера для каждого контекста:
browser:
type: chrome
profile: Production Profile # имя профиля Chrome
# Или Firefox
browser:
type: firefox
profile: work-prod # имя профиля Firefox
Идеально для SSO-сценариев. Каждый контекст может иметь свой профиль браузера с сохранёнными кредами, куками и сессиями.
$ ctx open https://console.aws.amazon.com
# Открывает URL в Chrome с профилем "Production Profile"
8. Поддержка нескольких облаков
Бесшовное переключение между AWS, GCP и Azure:
# Контекст AWS
aws:
profile: myapp-prod
region: us-east-1
sso: true
# Контекст GCP
gcp:
project: myapp-prod
region: us-central1
zone: us-central1-a
# Контекст Azure
azure:
subscription: myapp-prod
tenant: 12345-abcde
resource_group: production
Один интерфейс. Множество облаков.
9. Быстрые ссылки на контекстно-зависимые URL
Храните часто используемые URL для каждого контекста:
urls:
dashboard: https://grafana.prod.internal/d/prod-overview
logs: https://kibana.prod.internal/app/logs
console: https://console.aws.amazon.com
docs: https://docs.prod.internal
Быстрый доступ к ним:
$ ctx open dashboard
# Открывает https://grafana.prod.internal/d/prod-overview в браузере контекста
$ ctx open logs
# Открывает https://kibana.prod.internal/app/logs
Идеально для организации всех ссылок на прод в одном месте с учётом контекста.
10. Разумные значения по умолчанию
Не указали пользователя SSH? ctx возьмёт системного пользователя — так же, как это делает сам SSH:
ssh:
bastion:
host: bastion.internal
# user: по умолчанию $USER
port: 22
Команды могут делиться базовыми контекстами без захардкоженных имён пользователей. Каждый автоматически использует своё имя.
Примеры из реальной жизни
Переключение между несколькими окружениями
$ ctx list
NAME ENVIRONMENT CLOUD ORCHESTRATION
myapp-dev development aws kubernetes
myapp-staging staging aws kubernetes
myapp-prod production aws kubernetes
$ ctx use myapp-staging
✓ Context 'staging' is now active
$ ctx use myapp-prod
⚠ Type 'yes' to confirm: yes
✓ Context 'production' is now active
Консультант с несколькими клиентами
Ведёте 10 клиентов с разными облаками, кластерами и инструментами?
$ ctx list
NAME ENVIRONMENT CLOUD ORCHESTRATION
client-a-prod production aws kubernetes
client-b-prod production gcp kubernetes
client-c-staging staging azure nomad
$ ctx use client-b-prod
⚠ Type 'yes' to confirm: yes
✓ GCP project: client-b-production
✓ GKE cluster: prod-cluster-eu
✓ VPN connected
Никакой путаницы. Никаких ошибок.
Реагирование на инцидент в 3 ночи
[03:42] ALERT: Production API down!
[03:43] $ ctx use api-prod
[03:43] ⚠ Type 'yes' to confirm: yes
[03:43] ✓ AWS profile: production
[03:43] ✓ Kubernetes: prod-cluster/api
[03:43] ✓ VPN connected
[03:43] ✓ Tunnels connected
[03:43] ✓ Secrets loaded
[03:44] $ kubectl get pods
[03:44] # Отладка и исправление...
[03:56] $ kubectl apply -f hotfix.yaml
[03:56] ✓ Incident resolved
[03:57] $ ctx deactivate
[03:57] ✓ Safely exited production
Под давлением. Без ошибок. Быстро.
Как это работает
ctx — это единый бинарник на Go без каких-либо зависимостей. Он читает YAML-конфиги из ~/.config/ctx/contexts/:
name: myapp-prod
description: "MyApp Production"
environment: production
aws:
profile: prod
region: us-west-2
kubernetes:
context: prod-cluster
namespace: default
eks:
cluster: prod-cluster
region: us-west-2
ssh:
bastion:
host: bastion.prod.internal
user: deploy
tunnels:
- name: postgres
remote_host: db.internal
remote_port: 5432
local_port: 5432
vpn:
wireguard:
interface: wg0
config: /etc/wireguard/prod.conf
browser:
type: chrome
profile: Production
urls:
dashboard: https://grafana.prod.internal
console: https://console.aws.amazon.com
logs: https://kibana.prod.internal
secrets:
vault:
NOMAD_TOKEN: "operations/nomad#token"
env:
API_URL: https://api.prod.example.com
LOG_LEVEL: info
Когда вы запускаете ctx use myapp-prod, инструмент:
-
Получает K8s-учётные данные от AWS (если настроено)
-
Переключает профиль AWS
-
Переключает контекст и namespace Kubernetes
-
Подключает VPN
-
Устанавливает SSH-соединение с бастионом
-
Запускает SSH-туннели через бастион
-
Получает секреты из Vault/Bitwarden/и т.д.
-
Экспортирует переменные окружения
-
Активирует быстрые ссылки на URL
-
Обновляет приглашение командной строки
Одна команда. Всё переключается.
Начало работы
Установка
# macOS / Linux
curl -fsSL https://github.com/vlebo/ctx/releases/latest/download/install.sh | sh
Интеграция с оболочкой
Добавьте в ~/.zshrc или ~/.bashrc:
eval "$(ctx shell-hook zsh)" # для Zsh
eval "$(ctx shell-hook bash)" # для Bash
Создайте первый контекст
ctx init my-dev
Или создайте ~/.config/ctx/contexts/my-dev.yaml вручную:
name: my-dev
environment: development
aws:
profile: dev
region: us-west-2
kubernetes:
context: dev-cluster
namespace: default
env:
API_URL: https://api.dev.example.com
Переключитесь
ctx use my-dev
Всё готово.
ctx против всех остальных
| Набор инструментов | Необходимо команд | Защита production | Командное использование |
|---|---|---|---|
kubectx + aws-vault + свои скрипты |
6+ команд |
❌ Нет |
❌ Нет |
direnv + kubectx + aws-vault |
3–4 команды |
❌ Нет |
⚠️ Только Git |
ctx |
1 команда |
✅ Да |
✅ Да (скоро) |
ctx не просто заменяет один инструмент — он заменяет весь ваш рабочий процесс переключения контекстов.
Коротко о главном
ctx объединяет:
-
✅ Интерполяцию переменных (
${VAR}в конфигах) -
✅ Авто-получение K8s-кредов из EKS/GKE/AKS
-
✅ Дополнительный параметр cloud для нестандартных провайдеров
-
✅ Наследование контекстов для устранения дублирования
-
✅ Защиту production-окружений
-
✅ Поддержку нескольких облаков (AWS/GCP/Azure) с SSO
-
✅ Управление VPN (OpenVPN/WireGuard/Tailscale)
-
✅ SSH-туннели через бастион
-
✅ Секреты из 6 хранилищ с автоаутентификацией
-
✅ Переключение профилей браузера (Chrome/Firefox)
-
✅ Быстрые ссылки на дашборды и консоли
-
✅ Настройку пользователя Git
Что дальше?
Дорожная карта на 2026 год:
-
Q2 2026:
-
✅ Наследование контекстов и интерполяция переменных
-
✅ Авто-получение K8s-кредов
-
🚧 Zsh-плагин с автодополнением
-
🚧 Интеграция с GitHub Actions
-
-
Q3 2026:
-
ctx-cloud для командного обмена контекстами
-
Веб-интерфейс для управления контекстами
-
Интеграция с Docker context
-
Плагинная система для кастомных интеграций
-
Скоро: ctx-cloud
Командный обмен контекстами и централизованное управление:
$ ctx cloud login https://ctx-cloud-url
$ ctx cloud sync production
✓ Context 'production' synced
Возможности:
-
Командный обмен контекстами
-
Журналы аудита
-
Веб-интерфейс
-
Интеграция SAML/SSO
-
Централизованное управление секретами
Бета — в Q3 2026. Активная разработка идёт прямо сейчас. Поставьте звезду репозиторию, чтобы не пропустить обновления!
Попробуйте прямо сейчас
curl -fsSL https://github.com/vlebo/ctx/releases/latest/download/install.sh | sh
-
GitHub: github.com/vlebo/ctx
-
Документация: vlebo.github.io/ctx
-
Лицензия: MIT
-
Язык: Go
-
Зависимости: отсутствуют
Пробовали ctx? Как вы сейчас переключаете контексты? Расскажите в комментариях!
Оказалось полезным? ⭐ Поставьте звезду репозиторию: github.com/vlebo/ctx