Використання SOCKS5-проксі для доступу до Kubernetes API

СТАН ФУНКЦІОНАЛУ: Kubernetes v1.24 [stable]

Ця сторінка показує, як використовувати SOCKS5-проксі для доступу до API віддаленого кластера Kubernetes. Це корисно, коли кластер, до якого ви хочете отримати доступ, не відкриває свій API безпосередньо в інтернет.

Перш ніж ви розпочнете

Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

Версія вашого Kubernetes сервера має бути не старішою ніж v1.24. Для перевірки версії введіть kubectl version.

Вам потрібне програмне забезпечення для SSH-клієнта (інструмент ssh) і сервіс SSH, що працює на віддаленому сервері. Ви повинні мати можливість увійти до сервісу SSH на віддаленому сервері.

Контекст завдання

На схемі 1 представлено, що ви збираєтесь досягти в цьому завданні.

  • У вас є компʼютер-клієнт, який називається локальним у подальших кроках, з якого ви будете створювати запити для спілкування з Kubernetes API.
  • Сервер Kubernetes/API розміщений на віддаленому сервері.
  • Ви будете використовувати програмне забезпечення SSH-клієнта і сервера для створення безпечного SOCKS5-тунелю між локальним і віддаленим сервером. HTTPS-трафік між клієнтом і Kubernetes API буде проходити через SOCKS5-тунель, який сам тунелюється через SSH.

graph LR; subgraph local[Локальний клієнтський компʼютер] client([клієнт])-. локальний
трафік .-> local_ssh[Локальний SSH
SOCKS5 проксі]; end local_ssh[SSH
SOCKS5
проксі]-- SSH-тунель -->sshd subgraph remote[Віддалений сервер] sshd[SSH
сервер]-- локальний трафік -->service1; end client([клієнт])-. проксійований HTTPS-трафік
проходить через проксі .->service1[Kubernetes API]; classDef plain fill:#ddd,stroke:#fff,stroke-width:4px,color:#000; classDef k8s fill:#326ce5,stroke:#fff,stroke-width:4px,color:#fff; classDef cluster fill:#fff,stroke:#bbb,stroke-width:2px,color:#326ce5; class ingress,service1,service2,pod1,pod2,pod3,pod4 k8s; class client plain; class cluster cluster;
Схема 1. Компоненти уроку про SOCKS5

Використання ssh для створення SOCKS5-проксі

Наступна команда запускає SOCKS5-проксі між вашим клієнтським компʼютером і віддаленим SOCKS-сервером:

# SSH-тунель продовжує працювати у фоновому режимі після виконання цієї команди
ssh -D 1080 -q -N username@kubernetes-remote-server.example

SOCKS5-проксі дозволяє вам підключатися до сервера API вашого кластера на основі наступної конфігурації:

  • -D 1080: відкриває SOCKS-проксі на локальному порту :1080.
  • -q: тихий режим. Приглушує більшість попереджень і діагностичних повідомлень.
  • -N: не виконувати віддалені команди. Корисно для простого пересилання портів.
  • username@kubernetes-remote-server.example: віддалений SSH-сервер, за яким працює кластер Kubernetes (наприклад, bastion host).

Конфігурація клієнта

Щоб отримати доступ до сервера Kubernetes API через проксі, вам потрібно вказати kubectl надсилати запити через створений раніше SOCKS проксі. Зробіть це або налаштуванням відповідної змінної середовища, або через атрибут proxy-url у файлі kubeconfig. Використання змінної середовища:

export HTTPS_PROXY=socks5://localhost:1080

Щоб завжди використовувати це налаштування в конкретному контексті kubectl, вкажіть атрибут proxy-url у відповідному записі cluster у файлі ~/.kube/config. Наприклад:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LRMEMMW2 # скорочено для читабельності
    server: https://<API_SERVER_IP_ADDRESS>:6443  # сервер "Kubernetes API", тобто IP-адреса kubernetes-remote-server.example
    proxy-url: socks5://localhost:1080   # "SSH SOCKS5 проксі" на діаграмі вище
  name: default
contexts:
- context:
    cluster: default
    user: default
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
  user:
    client-certificate-data: LS0tLS1CR== # скорочено для читабельності
    client-key-data: LS0tLS1CRUdJT=      # скорочено для читабельності

Після створення тунелю через команду ssh, зазначену вище, і визначення змінної середовища або атрибуту proxy-url, ви можете взаємодіяти з вашим кластером через цей проксі. Наприклад:

kubectl get pods
NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE
kube-system   coredns-85cb69466-klwq8                  1/1     Running     0          5m46s

Очищення

Зупиніть процес пересилання портів ssh, натиснувши CTRL+C у терміналі, де він працює.

Введіть unset https_proxy у терміналі, щоб припинити пересилання HTTP-трафіку через проксі.

Додаткові матеріали

Змінено August 06, 2024 at 5:35 PM PST: upstream sync (dae4f254c1)