如何在Kubernetes(带有docker容器)中运行echo服务器,以便与本地环境中的其他机器进行通信?

如何在Kubernetes(带有docker容器)中运行echo服务器,以便与本地环境中的其他机器进行通信?,kubernetes,minikube,Kubernetes,Minikube,我想要实现的是使用python和tornado运行最简单的echo服务器,代码如下: #/usr/bin/env蟒蛇3 导入tornado.ioloop 导入tornado.web 从tornado.log导入启用\u pretty\u日志记录 类MainHandler(tornado.web.RequestHandler): def get(自我): self.write(“你好,世界”) def make_app(): return tornado.web.Application([ (r“

我想要实现的是使用
python
tornado
运行最简单的echo服务器,代码如下:

#/usr/bin/env蟒蛇3
导入tornado.ioloop
导入tornado.web
从tornado.log导入启用\u pretty\u日志记录
类MainHandler(tornado.web.RequestHandler):
def get(自我):
self.write(“你好,世界”)
def make_app():
return tornado.web.Application([
(r“/”,主处理器),
])
如果名称=“\uuuuu main\uuuuuuuu”:
端口=8080
打印(“在端口%d“%port”启动echo服务器)
启用_pretty_日志记录()
app=make_app()
应用程序侦听(内部(端口))
tornado.ioloop.ioloop.current().start()
我想在库伯内特斯吊舱里运行的docker内部运行。 我已经做到了,但只是部分。我正在物理机器上运行kubernetes群集,它位于我的本地网络中。为了运行集群,我使用了
minikube
。 以下是我的配置文件,我使用这些文件运行kubernetes
部署
服务

apiVersion:apps/v1 种类:部署 元数据: 姓名:testApp 规格: 副本:1份 选择器: 火柴标签: app:testApp 模板: 元数据: 标签: app:testApp 规格: 容器: -名称:testApp容器 图片:testApp docker:最新 政策:绝不 命令:[“python3”] args:[“-u”,“echo_tornado.py”] 端口: -集装箱港口:5020 restartPolicy:始终 apiVersion:v1 种类:服务 元数据: 名称:testApp svc 标签: app:testApp 规格: 类型:节点端口 端口: -端口:5020 目标港:5020 节点端口:5020 选择器: app:testApp 到底是什么问题?我可以通过
curl$NODE\u-IP:$NODE\u-PORT
向我的echo服务器发送请求,并得到响应,但我也希望能够执行
curl localhost:$NODE\u-PORT
,并且(对我来说至关重要的是)我必须能够从同一本地网络中的其他机器执行
curl$my\u-LOCAL\u-MACHINE\u-IP:$NODE\u-PORT

有可能实现吗?我应该使用某种方式将本地IP和端口转发到节点的IP吗? 也许我不应该使用
ServiceType:NodePort
,我应该使用
LoadBalancer
? 也许
minikube
是一个问题,我应该使用不同的工具?

是一个在您的机器(PC、笔记本电脑、服务器等)上生成单节点Kubernetes群集的工具

它使用不同的
--驱动程序运行Kubernetes(它可以部署为
裸机
、在
docker
中、在
virtualbox
中、在
kvm
中等)。这允许与主机和其他设备隔离这也意味着此设置的网络部分存在差异。

当谈到库伯内特斯的网络部分时,有很多内容需要涵盖。我鼓励您查看官方文件:


由于使用了
驱动程序
,并且
操作系统
未知,因此可能很难确定确切的解决方案一些可以帮助您的指针:

  • 当您使用Linux发行版时,可以选择使用驱动程序
    --none
    。它将使用
    Docker
    ,但所有内容(如
    kubeapi服务器
    etcd
    等容器)都将直接在主机上进行配置。这样您就可以运行:
    $curl$MY\u LOCAL\u MACHINE\u IP:$NODE\u PORT
    )。使用
    --driver=docker
    时,我提到的所有内容都将放在
    docker
    容器中
旁注

--driver=none
有一些限制/问题(例如安全性降低)。您可以通过以下文档了解更多信息:

  • 作为解决方案/临时解决方案您可以使用前面提到的(在主机上运行):

    • $kubectl port forward svc/testApp svc 5020:5020--地址0.0.0
      -此命令将在端口
      5020
      上发送到计算机的请求直接转发到端口
      上的
      服务:testApp svc
  • 对于其他驱动程序,例如
    Virtualbox
    ,您需要获得它的文档,才能在局域网上公开您的
    minikube
    实例


看到问题的这一部分:

(对我来说至关重要的是)我必须能够执行curl$MY_LOCAL_MACHINE_IP:$NODE_端口,该端口来自同一本地网络中的其他机器

需要补充的是,在
minikube
之外还有其他解决方案可以为Kubernetes集群提供服务。它们之间存在一些差异,您需要选择最适合您需求的一个其中一些是:

旁注

负载平衡器
类型的
服务
分配
IP地址
,您可以查看(使用上述选项时)


额外资源:


    • 感谢您的详细回复。将来我将尝试您提到的其他解决方案。

      Kubernetes本质上是一个远程集群环境;NodePort服务几乎永远不会是
      localhost
      或本地系统。您通常会使用DNS名称配置负载平衡器(手动或使用负载平衡器服务),并让客户端连接到该名称。好的,谢谢,我理解了为什么在这种情况下无法使用NodePort。我将ServiceType更改为LoadBalancer,现在我可以通过LoadBalancer的外部IP与echo服务器通信,但我仍然只能从我的机器使用此IP(使用minikube群集),但我希望