【发布时间】:2019-09-11 03:13:30
【问题描述】:
我的情况:
- 现有的 Docker 容器映像,通过 websocket 在端口 5000 上公开其服务。部署时,websocket 的服务在主机上(再次)在端口 5000 上公开。
- 现有 Python 客户端通过 websocket 连接到此服务,使用 Autobahn's websockets 和 Twisted。
- 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)
【问题讨论】:
-
查看这个问题的答案:stackoverflow.com/questions/48151388/…
-
谢谢你,瓦西里!有没有办法在 Python 客户端连接到我的集群后使用它自己使用的 Bearer 令牌,而不必通过 kubectl 导出令牌?理由是我的 Python 脚本是一个插件,应该尽可能简单地使用现有的 kubectl 配置?
-
>>> from kubernetes import config >>> import kubernetes >>> config.load_kube_config() >>> kubernetes.client.configuration.Configuration._default.api_key {'authorization': 'Bearer ya29 .Kl3zBA2GQ-7xEURvDHR9ApfEp1jEBPRVlEiJ5c6-o4Mpi1P3iz3ZVgxVMp0J7fwIIklsdDvmXq-gghD92iyoX1D5DF89TL0shOOZ1H40cswQDIKjLYkya6noEj270Hs'}
-
嗯 ...当我使用 minikube 设置然后在成功
v1.list_pod_for_all_namespaces()之后查看kubernetes.client.configuration.Configuration然后_default.apikey是一个空的 dict()。所以这似乎取决于设置,我想。 -
但是,我可以看到
kubernetes.client.configuration.Configuration有cert_file、key_file和ssl_ca_cert正确填充了我的.kube/config。curl -X GET --cert ... --key ... -cacert ... https://.../api/v1/pods成功。
标签: python-3.x websocket kubernetes twisted autobahn