首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Kubernetes容器中将输入传递给Java应用程序?

如何在Kubernetes容器中将输入传递给Java应用程序?
EN

Stack Overflow用户
提问于 2019-11-19 17:01:30
回答 3查看 444关注 0票数 0

我已经配置了托管在AWS上的Kubernetes服务(类型为LoadBalancer)。服务的吊舱以交互模式运行(这是在吊舱中运行容器所需的)。其中的容器正在运行一个简单的Java .jar应用程序,该应用程序接收输入并在此基础上生成输出。

问题:我如何在Kubernetes容器中将输入传递给应用程序?

以下是yaml配置中确保在交互模式下运行的部分:

代码语言:javascript
复制
spec:
  containers:
  - image: ardulat/mckinsey
    imagePullPolicy: Always
    name: anuar-mckinsey
    ports:
    - containerPort: 8080
      name: http
      protocol: TCP
    stdin: true
    tty: true

吊舱已经启动并运行。正如您从配置中看到的,它接收TCP连接。

这是吊舱的服务:

代码语言:javascript
复制
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)          AGE
anuar-mckinsey   LoadBalancer   10.100.239.207   a8154210d09da11ea9c3806983848f2f-1085657314.us-east-2.elb.amazonaws.com   8080:32516/TCP

通过查看容器中从Java应用程序输出打印消息的pod日志,可以确保容器中的pod和服务配置正确。

已经尝试过

  • 以冗长的模式运行curl应用程序,该模式生成:
代码语言:javascript
复制
*   Trying 18.190.142.22...
* TCP_NODELAY set
* Connected to a8154210d09da11ea9c3806983848f2f-1085657314.us-east-2.elb.amazonaws.com (18.190.142.22) port 8080 (#0)
> GET / HTTP/1.1
> Host: a8154210d09da11ea9c3806983848f2f-1085657314.us-east-2.elb.amazonaws.com:8080
> User-Agent: curl/7.63.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host a8154210d09da11ea9c3806983848f2f-1085657314.us-east-2.elb.amazonaws.com left intact
curl: (52) Empty reply from server
  • 在生成输出的详细模式下通过netcat进行连接:
代码语言:javascript
复制
found 1 connections:
     1: flags=82<CONNECTED,PREFERRED>
    outif en0
    src 172.20.22.204 port 51144
    dst 18.190.142.22 port 8080
    rank info not available
    TCP aux info available

Connection to a8154210d09da11ea9c3806983848f2f-1085657314.us-east-2.elb.amazonaws.com port 8080 [tcp/http-alt] succeeded!

的最终想法:看起来配置是正确的,服务运行在AWS上托管的集群上。日志产生正确的输出。但是,我不能发送消息(通过TCP连接?)到容器内的Java应用程序。关于如何将输入传递给它,有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2019-11-19 22:42:32

根据注释中的讨论,信息是Java应用程序使用System.in接收输入。这通常等同于stdin

向容器中的应用程序发送输入并获取输出的一种方法是通过附合将本地stdinstdout连接到容器的原始终端模式中的进程:

代码语言:javascript
复制
kubectl -n <namespace> attach <pod-name> -c <container-name> -i -t

关于如何从外部访问应用程序而不直接访问豆荚和使用服务的附加问题,我建议:

  • 更改应用程序,以便它创建一个ServerSocket来侦听和接受特定端口号上的连接。
  • 从套接字的输入流中读取各个行,并让它们处理,就像输入来自System.in一样。
  • 将结果写入套接字的输出流。
  • 像您已经有的那样,通过LoadBalancer Kubernetes服务公开端口。

这个在这里可能是新代码的良好起点。您可以使用telnet 127.0.0.1 <port>curl telnet://127.0.0.1:<port>/在本地测试应用程序,并在没有在容器中运行应用程序时进行测试。

相反,在我看来,公开一个基于HTTP的服务对这个应用程序来说似乎是一个过分的选择。

票数 2
EN

Stack Overflow用户

发布于 2019-12-07 03:34:50

您可以使用环境变量来定义参数。

代码语言:javascript
复制
env:
- name: MESSAGE
  value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]

你刚刚为你的库伯内特斯舱定义了一个论点。

此外,最好将您的吊舱配置为使用configMapSecrets

票数 0
EN

Stack Overflow用户

发布于 2019-12-24 10:05:46

如果使用docker来构建kubernetes映像,则可以在启动应用程序时使用对接文件中的ENTRYPOINT或CMD属性传递参数。有关更多信息,请参考下面的链接。

最佳做法/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58939311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档