Python-клиент Kubernetes: подключение к модулю / службе с помощью веб-сокета Autobahn / Twisted с использованием токена на предъявителя - PullRequest
0 голосов
/ 21 апреля 2019

Моя ситуация:

  • существующий образ контейнера Docker, предоставляющий его службу через веб-сокет, скажем, через порт 5000. При развертывании служба веб-сокета предоставляется на хосте (снова) через порт 5000.
  • существующий клиент Python, подключающийся к этой службе через веб-сокет, используя веб-сокеты Autobahn и Twisted .
  • Кластер Kubernetes запускает вышеупомянутый образ контейнера Docker в модуле, снова предоставляя свой сервис на порту 5000. Служба модуля имеет связанный ресурс Service, но служба не имеет прямого доступа извне кластера, кроме через API кластера, используя глагол proxy.

Теперь я хочу обновить мой клиент Python, чтобы он не только напрямую подключался к моей службе на хосте Docker, но и к моей службе при развертывании внутри кластера Kubernetes. То есть я хочу, чтобы веб-сокет подключался к удаленному API моего кластера и глаголу прокси-сервера моей службы. Я бы предпочел не переписывать существующий протокол и обработку websocket, если это возможно.

Мое текущее (ограниченное) понимание состоит в том, что для этого ограничения механизм stream в клиенте Python Kubernetes мне не поможет, так как для этого потребуется полное переписывание моей существующей базы кода Python.

Мой вопрос сейчас (по крайней мере, я думаю, что это вопрос здесь): как я могу получить необходимую аутентификационную информацию (Bearer токен?) От клиента Kubernetes, чтобы передать ее в веб-сокет Autobahn, чтобы успешно подключиться снаружи моего кластера Kubernetes к моему сервису внутри?

from twisted.internet import reactor
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS

import kubernetes
import kubernetes.client
import kubernetes.client.configuration

# My service's websocket protocol...
class MyPrtocol(WebSocketClientProtocol):
    def onConnect(self, response):
        pass

kubernetes.config.load_kube_config()  # activates default context

# **********************
# Here I'm lost!
headers = { ... ? }
# **********************

myurl = kubernetes.client.configuration.Configuration._default.host + '/api/v1/.../proxy'
factory = WebSocketClientFactory(myurl, headers=headers)
factory.protocol = MyProtocol
connectWS(factory)

1 Ответ

1 голос
/ 22 апреля 2019
python
>>> import kubernetes
>>> from kubernetes import config
>>> config.load_kube_config()
>>> kubernetes.client.configuration.Configuration._default.api_key
{'authorization': 'Bearer ya29.GGHzBj2GQ-aaaaaaafEp1jEBKKLKJJiJ5c6-o4Mpi1P3xxxxxxxxxxxklsdRYmXq-gghD92iyoX1DyyyyyyyyyyyQDIKjLYkyzzzzzzzzz'}

Вот так вы можете получить токен на предъявителя от kubeconfig.

...