Kubernetes Python 客户端:使用不记名令牌连接到 pod/service 使用高速公路 websocket/Twisted
Kubernetes Python Client: connecting to a pod/service using Autobahn websocket/Twisted using bearer token
我的情况:
- 现有 Docker 容器映像,通过 websocket 公开其服务,例如端口 5000。部署时,websocket 的服务(再次)在端口 5000 上公开。
- 现有 Python 客户端使用 Autobahn's websockets and Twisted.
通过 websocket 连接到此服务
- Kubernetes 集群 运行 pod 中的上述 Docker 容器映像,再次在端口 5000 公开其服务。pod 的服务具有关联的
Service
资源,但是无法从集群外部直接访问服务,除非通过集群 API 使用 proxy
动词。
我现在想升级我的 Python 客户端,不仅可以直接连接到我在 Docker 主机上的服务,还可以连接到部署在 Kubernetes 集群中的服务。也就是说,我希望 websocket 连接到我的集群的远程 API 和我的服务的代理动词。如果可能的话,我不想重写现有的 websocket 协议和处理。
我目前(有限)的理解是,对于这个约束,Kubernetes Python 客户端中的 stream
机制对我没有帮助,因为这需要完全重写我的现有 Python 代码库。
我现在的问题是(至少我认为这是这里的问题):如何从 Kubernetes 客户端获取必要的身份验证信息(Bearer
令牌?)以便将其传递给 Autobahn websocket为了从我的 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)
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 获取不记名令牌。
我的情况:
- 现有 Docker 容器映像,通过 websocket 公开其服务,例如端口 5000。部署时,websocket 的服务(再次)在端口 5000 上公开。
- 现有 Python 客户端使用 Autobahn's websockets and Twisted. 通过 websocket 连接到此服务
- Kubernetes 集群 运行 pod 中的上述 Docker 容器映像,再次在端口 5000 公开其服务。pod 的服务具有关联的
Service
资源,但是无法从集群外部直接访问服务,除非通过集群 API 使用proxy
动词。
我现在想升级我的 Python 客户端,不仅可以直接连接到我在 Docker 主机上的服务,还可以连接到部署在 Kubernetes 集群中的服务。也就是说,我希望 websocket 连接到我的集群的远程 API 和我的服务的代理动词。如果可能的话,我不想重写现有的 websocket 协议和处理。
我目前(有限)的理解是,对于这个约束,Kubernetes Python 客户端中的 stream
机制对我没有帮助,因为这需要完全重写我的现有 Python 代码库。
我现在的问题是(至少我认为这是这里的问题):如何从 Kubernetes 客户端获取必要的身份验证信息(Bearer
令牌?)以便将其传递给 Autobahn websocket为了从我的 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)
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 获取不记名令牌。