我已经配置了托管在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应用程序输出打印消息的容器的日志,我可以确保正确配置了容器和服务。

已尝试:

以详细模式生成的
  • curl应用程序:
  • *   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到原始终端模式下的容器中的进程,该模式将本地stdinstdout与容器的连接:

    kubectl -n <namespace> attach <pod-name> -c <container-name> -i -t
    

    关于如何从外部访问应用程序而无需直接访问Pod和使用服务来访问应用程序的其他问题,我建议:
  • 更改应用程序,以便它创建ServerSocket来侦听和接受特定端口号上的连接。
  • 从套接字的输入流中读取各行,并对其进行处理,就像输入来自System.in一样。
  • 将结果写入套接字的输出流。
  • 通过LoadBalancer Kubernetes服务公开端口,就像您已经拥有的一样。

  • This here可能是新代码的良好起点。您可以使用telnet 127.0.0.1 <port>curl telnet://127.0.0.1:<port>/在本地以及不在容器中运行应用程序时对其进行测试。

    我认为,公开基于HTTP的服务似乎对该应用程序来说是过大的选择。

    09-27 01:54
    查看更多