【问题标题】:Kubernetes Python Client: connecting to a pod/service using Autobahn websocket/Twisted using bearer tokenKubernetes Python 客户端:使用 Autobahn websocket/Twisted 使用不记名令牌连接到 pod/服务
【发布时间】:2019-09-11 03:13:30
【问题描述】:

我的情况:

  • 现有的 Docker 容器映像,通过 websocket 在端口 5000 上公开其服务。部署时,websocket 的服务在主机上(再次)在端口 5000 上公开。
  • 现有 Python 客户端通过 websocket 连接到此服务,使用 Autobahn's websocketsTwisted
  • 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.Configurationcert_filekey_filessl_ca_cert 正确填充了我的 .kube/configcurl -X GET --cert ... --key ... -cacert ... https://.../api/v1/pods 成功。

标签: python-3.x websocket kubernetes twisted autobahn


【解决方案1】:
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 获取不记名令牌的方式。

【讨论】:

  • 非常感谢瓦西里!您正在确认我的怀疑,即不总是使用不记名令牌,这与我之前的想法相反。使用 minikube 设置,我正在使用不记名令牌并没有设置,而是看到从 .kube/config 获取所需的证书和密钥文件引用。所以我怀疑有多种情况需要处理:没有承载,并且承载在场。
  • 我已更新问题标题以反映不记名令牌的情况。由于我现在知道在某些情况下我也需要证书,因此最好针对其他情况提出一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2011-12-27
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多