实战在 Docker 中优雅的关闭 Node、Java、Python 等应用容器

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

0008f972c6706e828dc863a22e499a6b.png

优雅地关闭容器在 Kubernetes(K8s)中是一个重要的操作,它确保了应用程序可以安全地保存其状态并释放资源,同时避免对服务的用户造成不必要的中断。

为何要优雅地关闭容器

  1. 数据一致性:确保应用在关闭时能保存其当前状态,避免数据丢失或损坏。

  2. 用户体验:避免因为突然关闭容器而导致的服务中断,提供更加流畅的用户体验。

  3. 资源清理:确保释放容器所占用的资源,如网络连接、内存、文件句柄等。

典型场景

  1. 部署更新:在进行应用更新时,需要优雅地关闭旧容器,以便新版本可以顺利接管。

  2. 资源回收:在资源紧张时,优雅地关闭某些容器可以帮助系统更好地管理资源。

  3. 应用维护:在执行例行维护或调试时,需要优雅地关闭容器,避免影响正在进行的操作。

使用技巧

  1. 设置适当的停止信号:在容器的 Dockerfile 或 K8s 配置中指定正确的停止信号(如 SIGTERM),确保应用能够接收并处理这个信号。

  2. 实现优雅关闭逻辑:在应用程序中编写处理停止信号的代码,如保存状态、关闭数据库连接等。

  3. 配置优雅关闭时间:在 K8s 配置中设置 terminationGracePeriodSeconds,为容器提供足够的时间来执行关闭操作。

使用案例

优雅地关闭 Node.js 应用

场景描述:假设您有一个 Node.js 应用在 Kubernetes 集群中运行,需要在关闭时优雅地保存用户会话。

步骤

  1. Node.js 应用的优雅关闭逻辑

    // Node.js 示例代码
    process.on('SIGTERM', () => {
      console.log('SIGTERM signal received: closing HTTP server');
      server.close(() => {
        console.log('HTTP server closed');
        // 这里可以添加更多的清理逻辑,如数据库连接关闭等
      });
    });
  2. Dockerfile 中设置 STOPSIGNAL

    FROM node:14
    # ... 其他 Docker 指令 ...
    STOPSIGNAL SIGTERM
  3. Kubernetes 配置文件

    apiVersion: v1
    kind: Pod
    metadata:
      name: nodejs-app
    spec:
      containers:
      - name: nodejs-app-container
        image: nodejs-app-image
        ports:
        - containerPort: 8080
      terminationGracePeriodSeconds: 30

    这里,terminationGracePeriodSeconds 设置为 30 秒,为 Node.js 应用提供足够的时间来处理 SIGTERM 信号并优雅地关闭。


  4. 部署和测试

  • 使用 kubectl apply -f 部署上述 Kubernetes 配置。

  • 测试容器关闭行为,确认应用是否能够优雅地关闭。

通过实现应用层面的优雅关闭逻辑,并在 Docker 和 Kubernetes 配置中适当设置,可以确保 Node.js 应用在 Kubernetes 中优雅地关闭,从而维护数据一致性和提供更好的用户体验。

优雅关闭 Python Flask 应用

场景描述:假设您有一个基于 Flask 的 Python Web 应用在 Kubernetes 集群中运行,您需要确保在停止容器时,所有正在进行的请求都得到正确处理。

步骤

  1. Flask 应用的优雅关闭逻辑

    # Python Flask 示例
    from flask import Flask
    import signal
    import sys
    
    app = Flask(__name__)
    
    def graceful_shutdown(signum, frame):
        print("Shutting down gracefully...")
        # 添加任何必要的清理逻辑
        sys.exit(0)
    
    signal.signal(signal.SIGTERM, graceful_shutdown)
    
    @app.route('/')
    def hello_world():
        return 'Hello, World!'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0')
  2. Dockerfile

    FROM python:3.8-slim
    # ... 其他 Docker 指令 ...
    COPY . /app
    WORKDIR /app
    RUN pip install Flask
    CMD ["python", "app.py"]
  3. Kubernetes 配置文件

    apiVersion: v1
    kind: Pod
    metadata:
      name: flask-app
    spec:
      containers:
      - name: flask-app-container
        image: flask-app-image
        ports:
        - containerPort: 5000
      terminationGracePeriodSeconds: 60

    在这个配置中,terminationGracePeriodSeconds 被设置为 60 秒,为 Flask 应用提供足够的时间来处理正在进行的请求并优雅地关闭。

优雅关闭 Java Spring Boot 应用

场景描述:您有一个 Java Spring Boot 应用运行在 Kubernetes 上,需要在关闭时完成必要的资源释放和状态保存。

步骤

  1. Spring Boot 应用的优雅关闭逻辑

    在 application.properties 或 application.yml 中添加:

    server.shutdown=graceful
    spring.lifecycle.timeout-per-shutdown-phase=30s

    这会启用 Spring Boot 的优雅关闭特性,并设置超时时间为 30 秒。

  2. Dockerfile

    FROM openjdk:11
    # ... 其他 Docker 指令 ...
    COPY target/spring-boot-app.jar app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
  3. Kubernetes 配置文件

    apiVersion: v1
    kind: Pod
    metadata:
      name: spring-boot-app
    spec:
      containers:
      - name: spring-boot-app-container
        image: spring-boot-app-image
        ports:
        - containerPort: 8080
      terminationGracePeriodSeconds: 60

    设置 terminationGracePeriodSeconds 为 60 秒,确保 Spring Boot 应用有足够的时间来处理正在进行的请求和完成必要的清理工作。

本文转载自:「云原生之路」,原文:https://url.hi-linux.com/x23Wd,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

bea7564813d72c7c419c94473ee0631f.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

c7fcd692eedae268b6dfab9568fcba42.png

你可能还喜欢

点击下方图片即可阅读

0605f1a128a818dce74f44f2e7a38691.png

推荐两款超实用的在线工具:IP 工具箱和 IT-Tools

11da843f523ec37c72b13fb44cae9704.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

3b81d0d6f2a0c53eef3a18b9b38a4f43.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值