【问题标题】:Does kubernetes outbound request during 'terminationGracePeriodSeconds''terminationGracePeriodSeconds' 期间是否有 kubernetes 出站请求
【发布时间】:2022-01-09 14:27:27
【问题描述】:

我的设置是在 kubernetes pod 中运行的 spring-boot 服务。我已将 terminationGracePeriodSeconds 设置为 30 秒,并将我的 Spring Boot 服务中的正常关机时间配置为 spring.lifecycle.timeout-per-shutdown-phase: 30。 我正在尝试使用以下测试控制器 -

@GetMapping("/hello")
    public String hello(@RequestParam("time") long time) throws InterruptedException, IOException {
        System.out.println("Sleeping for " + time +  " milliseconds...");
        Thread.sleep(time);

        System.out.println("Done Sleeping");

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url("http://www.google.com")//My server address will go here
                .build();
        Response response = client.newCall(request).execute();
        System.out.println("*********************** " + response.code());
        return "Hello World";
    }

我尝试了两种方案

  • 本地运行的 spring boot 服务。命中以上端点并使用 - kill pid (SIGTERM) 停止服务器。我可以访问 google.com 端点并获得回复。

  • 在 K8 pod 上部署了这些更改。点击上面的端点并使用 -kubectl delete pod my-pod -n my-namespace 删除 pod。在这种情况下,我成功获得了“完成睡眠”日志,但是一旦它尝试调用 google.com,它就会失败并显示 -

SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.net.ConnectException: Failed to connect to www.google.com/172.217.27.196:80
    at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:265)
    at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:183)
    at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.java:224)
    at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.java:108)
    at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.java:88)
    at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:169)
    at
......
......
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:607)
    at okhttp3.internal.platform.Platform.connectSocket(Platform.java:130)
    at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:263)
    ... 116 more

看起来在 kubernetes 正常关闭期间,我们无法访问外部端点。我在它周围找不到任何文档。这是正确的吗?

【问题讨论】:

    标签: java spring-boot kubernetes


    【解决方案1】:

    terminationGracePeriodSeconds期间,你的Pod处于Terminating阶段,这意味着它可以完成它已经收到的请求,但是任何服务都不会向这个Pod传递新的请求。

    阅读相关的 SO 问题:Do Kubernetes pods still receive requests after receiving SIGTERM?

    【讨论】:

    • 我知道 pod 不会接受任何新请求,但我的问题是它是否允许在正常关闭期间进行任何外部调用。
    • 我认为在Terminating阶段允许pod进行外部调用。
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2021-09-06
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2011-11-11
    相关资源
    最近更新 更多