我已经配置了托管在AWS EKS上的Kubernetes服务(类型为LoadBalancer
)。服务的Pod以交互模式运行(运行Pod中的容器是必需的)。那里的容器正在运行一个简单的Java .jar应用程序,该应用程序接收输入并根据该输出产生输出。
问题:如何将输入传递到Kubernetes容器内的Java应用程序?
这是pod的yaml配置的一部分,可确保它以交互方式运行:
spec:
containers:
- image: ardulat/mckinsey
imagePullPolicy: Always
name: anuar-mckinsey
ports:
- containerPort: 8080
name: http
protocol: TCP
stdin: true
tty: true
pods 已启动并正在运行。从配置中可以看到,它接收TCP连接。
这是 pods 的服务:
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应用程序输出打印消息的容器的日志,我可以确保正确配置了容器和服务。
已尝试:
以详细模式生成的
* 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
通过verbat模式通过netcat连接的
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 EKS托管的集群上运行。日志产生正确的输出。但是,我无法将消息(通过TCP连接?)发送到容器内的Java应用程序。关于如何将输入传递给它的任何想法?
最佳答案
根据评论中的讨论,信息是Java应用程序使用System.in
接收输入。这通常等效于stdin
。
一种将输入发送到容器中的应用程序并获取输出的方法是通过attaching到原始终端模式下的容器中的进程,该模式将本地stdin
和stdout
与容器的连接:
kubectl -n <namespace> attach <pod-name> -c <container-name> -i -t
关于如何从外部访问应用程序而无需直接访问Pod和使用服务来访问应用程序的其他问题,我建议:
ServerSocket
来侦听和接受特定端口号上的连接。 System.in
一样。 This here可能是新代码的良好起点。您可以使用
telnet 127.0.0.1 <port>
或curl telnet://127.0.0.1:<port>/
在本地以及不在容器中运行应用程序时对其进行测试。我认为,公开基于HTTP的服务似乎对该应用程序来说是过大的选择。