如何在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群集),但我希望