Программистам часто требуется помощь в доступе к ресурсам в виртуальной частной сети. Например, у нас есть база данных, к которой мы хотим получить доступ с нашего ПК. Мы не должны выставлять порты базы данных в Интернет, потому что это потенциальная опасность. Но когда в нашей инфраструктуре есть Kubernetes, мы можем использовать его как прокси.

Обзор нашей проблемы

У нас нет прямого подключения к базе данных, но мы можем получить к ней доступ с помощью socat и kubectl.

Инструмент socat считается расширенной версией netcat. Они делают похожие вещи, но у socat есть дополнительные функции, такие как разрешение нескольким клиентам прослушивать порт или повторное использование соединений.

Возможное решение

Используя socat, мы можем сделать переадресацию портов. Вот пример для нескольких подключений:

socat tcp-listen:81,fork,reuseaddr tcp:192.168.1.10:80
# where:
# 81 is port number on local machine
# 192.168.1.10:80 is remote host

Все, что нам нужно сделать, это запустить указанную выше команду в Kubernetes. Для этого нам нужно создать простой Pod. См. приведенный ниже пример в файле `port-forward.yaml`.

apiVersion: v1
kind: Pod
metadata:
  name: port-forward
spec:
  containers:
 - name: port-forward
   image: alpine/socat:1.7.4.4
   command:
       - "/bin/sh"
       - "-c"
       - |
          socat tcp-listen:$LOCAL_PORT,reuseaddr,fork  tcp:$REMOTE_HOST:$REMOTE_PORT & pid=$! && trap "kill $pid" SIGINT && \
          echo "Socat started listening on $LOCAL_PORT: Redirecting traffic to $REMOTE_HOST:$REMOTE_PORT ($pid)" && wait $pid
   env:
     - name: REMOTE_HOST
         value: postgresql.database.cloud.net
     - name: REMOTE_PORT
         value: "5432"
     - name: LOCAL_PORT
         value: "5432"

В этом примере мы создаем док-контейнер с переадресацией порта в базу данных postgresql.

Чтобы запустить следующий модуль в kubernetes, используйте kubeclt:

kubectl apply -f port-forward.yaml

Затем мы видим запущенный контейнер, работающий в нашем кластере k8s:

user@hostname:~/$ kubectl get pods
NAME        READY   STATUS RESTARTS   AGE
port-forward   1/1  Running   0       20s

Последнее, что нам нужно сделать, это сделать переадресацию порта с пода на нашу локальную машину:

user@hostname:~/$ kubectl port-forward pod/port-forward 5432:5432
Forwarding from 127.0.0.1:5432 -> 5432
Forwarding from [::1]:5432 -> 5432
Handling connection for 5432
Handling connection for 5432
Handling connection for 5432

И теперь мы можем подключиться к базе данных в облаке, которая доступна на локальном хосте по порту 5432.

Сообщите нам, если хотите узнать больше

Эти практические примеры показывают вам, как получить доступ к ресурсам may с помощью kubernetes. Это практичное решение может внести свой вклад в ваши будущие проекты и продукты. Не стесняйтесь обращаться к нам, если вы хотите узнать больше о практическом использовании Kotlin или вам нужна помощь в разработке вашего текущего или следующего проекта.