公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
优雅地关闭容器在 Kubernetes(K8s)中是一个重要的操作,它确保了应用程序可以安全地保存其状态并释放资源,同时避免对服务的用户造成不必要的中断。
为何要优雅地关闭容器
数据一致性:确保应用在关闭时能保存其当前状态,避免数据丢失或损坏。
用户体验:避免因为突然关闭容器而导致的服务中断,提供更加流畅的用户体验。
资源清理:确保释放容器所占用的资源,如网络连接、内存、文件句柄等。
典型场景
部署更新:在进行应用更新时,需要优雅地关闭旧容器,以便新版本可以顺利接管。
资源回收:在资源紧张时,优雅地关闭某些容器可以帮助系统更好地管理资源。
应用维护:在执行例行维护或调试时,需要优雅地关闭容器,避免影响正在进行的操作。
使用技巧
设置适当的停止信号:在容器的 Dockerfile 或 K8s 配置中指定正确的停止信号(如
SIGTERM
),确保应用能够接收并处理这个信号。实现优雅关闭逻辑:在应用程序中编写处理停止信号的代码,如保存状态、关闭数据库连接等。
配置优雅关闭时间:在 K8s 配置中设置
terminationGracePeriodSeconds
,为容器提供足够的时间来执行关闭操作。
使用案例
优雅地关闭 Node.js 应用
场景描述:假设您有一个 Node.js 应用在 Kubernetes 集群中运行,需要在关闭时优雅地保存用户会话。
步骤:
Node.js 应用的优雅关闭逻辑:
// Node.js 示例代码 process.on('SIGTERM', () => { console.log('SIGTERM signal received: closing HTTP server'); server.close(() => { console.log('HTTP server closed'); // 这里可以添加更多的清理逻辑,如数据库连接关闭等 }); });
Dockerfile 中设置 STOPSIGNAL:
FROM node:14 # ... 其他 Docker 指令 ... STOPSIGNAL SIGTERM
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 信号并优雅地关闭。部署和测试:
使用
kubectl apply -f
部署上述 Kubernetes 配置。测试容器关闭行为,确认应用是否能够优雅地关闭。
通过实现应用层面的优雅关闭逻辑,并在 Docker 和 Kubernetes 配置中适当设置,可以确保 Node.js 应用在 Kubernetes 中优雅地关闭,从而维护数据一致性和提供更好的用户体验。
优雅关闭 Python Flask 应用
场景描述:假设您有一个基于 Flask 的 Python Web 应用在 Kubernetes 集群中运行,您需要确保在停止容器时,所有正在进行的请求都得到正确处理。
步骤:
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')
Dockerfile:
FROM python:3.8-slim # ... 其他 Docker 指令 ... COPY . /app WORKDIR /app RUN pip install Flask CMD ["python", "app.py"]
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 上,需要在关闭时完成必要的资源释放和状态保存。
步骤:
Spring Boot 应用的优雅关闭逻辑:
在
application.properties
或application.yml
中添加:server.shutdown=graceful spring.lifecycle.timeout-per-shutdown-phase=30s
这会启用 Spring Boot 的优雅关闭特性,并设置超时时间为 30 秒。
Dockerfile:
FROM openjdk:11 # ... 其他 Docker 指令 ... COPY target/spring-boot-app.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]
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。
最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
你可能还喜欢
点击下方图片即可阅读
推荐两款超实用的在线工具:IP 工具箱和 IT-Tools
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!