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

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->








  <div class="feature-state-notice feature-stable">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.24 [stable]</code>
    </div>
  



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

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

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
 
 Версія вашого Kubernetes сервера має бути не старішою ніж v1.24.
  <p>Для перевірки версії введіть  <code>kubectl version</code>.</p>


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

<!-- steps -->

## Контекст завдання {#task-context}


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>У цьому прикладі трафік тунелюється за допомогою SSH, де SSH-клієнт і сервер виступають як SOCKS-проксі. Ви можете також використовувати будь-які інші види <a href="https://en.wikipedia.org/wiki/SOCKS#SOCKS5">SOCKS5</a> проксі.</div>


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

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


<figure>
<div class="mermaid">
    
graph LR;

  subgraph local[Локальний клієнтський компʼютер]
  client([клієнт])-. локальний <br> трафік .->  local_ssh[Локальний SSH <br> SOCKS5 проксі];
  end
  local_ssh[SSH <br>SOCKS5 <br> проксі]-- SSH-тунель -->sshd
  
  subgraph remote[Віддалений сервер]
  sshd[SSH <br> сервер]-- локальний трафік -->service1;
  end
  client([клієнт])-. проксійований HTTPS-трафік <br> проходить через проксі .->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;

</div>
</figure>

<noscript>
  <div class="alert alert-secondary callout" role="note">
    <em class="javascript-required">Вам потрібно <a href="https://www.enable-javascript.com/">увімкнути</a> JavaScript, щоб переглядати цей вміст</em>
  </div>
</noscript>

Схема 1. Компоненти уроку про SOCKS5

## Використання ssh для створення SOCKS5-проксі {#using-ssh-to-create-a-socks5-proxy}

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

```shell
# 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).

## Конфігурація клієнта {#client-configuration}

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

```shell
export HTTPS_PROXY=socks5://localhost:1080
```

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

```yaml
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`, ви можете взаємодіяти з вашим кластером через цей проксі. Наприклад:

```shell
kubectl get pods
```

```console
NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE
kube-system   coredns-85cb69466-klwq8                  1/1     Running     0          5m46s
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4><ul>
<li>
<p>До версії <code>kubectl</code> 1.24 більшість команд <code>kubectl</code> працювали з використанням socks-проксі, за винятком <code>kubectl exec</code>.</p>
</li>
<li>
<p><code>kubectl</code> підтримує як змінні середовища <code>HTTPS_PROXY</code>, так і <code>https_proxy</code>. Вони використовуються іншими програмами, які підтримують SOCKS, такими як <code>curl</code>. Тому в деяких випадках краще визначити змінну середовища в командному рядку:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">HTTPS_PROXY</span><span class="o">=</span>socks5://localhost:1080 kubectl get pods
</span></span></code></pre></div></li>
<li>
<p>При використанні <code>proxy-url</code> проксі використовується лише для відповідного контексту <code>kubectl</code>, тоді як змінна середовища вплине на всі контексти.</p>
</li>
<li>
<p>Імʼя хосту сервера k8s API можна додатково захистити від витоку DNS, використовуючи протокольну назву <code>socks5h</code> замість більш відомого протоколу <code>socks5</code>, показаного вище. У цьому випадку <code>kubectl</code> попросить проксі-сервер (наприклад, ssh bastion) виконати розвʼязання доменного імені сервера k8s API замість його розвʼязання у системі, яка запускає <code>kubectl</code>. Зауважте також, що з <code>socks5h</code> URL сервера k8s API, як-от <code>https://localhost:6443/api</code>, не стосується вашого локального клієнтського компʼютера. Натомість він стосується <code>localhost</code>, відомого на проксі-сервері (наприклад, ssh bastion).</p>
</li>
</ul>
</div>


## Очищення {#clean-up}

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

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

## Додаткові матеріали {#further-reading}

* [Віддалений клієнт OpenSSH](https://man.openbsd.org/ssh)
