发布时间: 2024-8-2 文章作者: myluzh 分类名称: Kubernetes 朗读文章
apiVersion: apps/v1 kind: Deployment metadata: name: gracefulshutdown-app spec: replicas: 3 selector: matchLabels: app: gracefulshutdown-app template: metadata: labels: app: gracefulshutdown-app spec: containers: - name: graceful-shutdown-test image: gracefulshutdown-app:latest ports: - containerPort: 8080 terminationGracePeriodSeconds: 452、合理处理 SIGTERM 信号
cat entrypoint.sh #!/bin/bash /webserver问题:
#! /bin/bash exec /bin/yourapp # 脚本中执行二进制
#! /bin/bash /bin/app1 & pid1="$!" # 启动第一个业务进程并记录 pid echo"app1 started with pid $pid1" /bin/app2 & pid2="$!" # 启动第二个业务进程并记录 pid echo"app2 started with pid $pid2" handle_sigterm() { echo "[INFO] Received SIGTERM" kill -SIGTERM $pid1 $pid2 # 传递 SIGTERM 给业务进程 wait $pid1 $pid2 # 等待所有业务进程完全终止 } trap handle_sigterm SIGTERM # 捕获 SIGTERM 信号并回调 handle_sigterm 函数 wait # 等待回调执行完,主进程再退出
# 这是以 dumb-init 为例制作镜像的 Dockerfile 示例 FROM ubuntu:22.04 RUN apt-get update && apt-get install -y dumb-init ADD start.sh / ADD app1 /bin/app1 ADD app2 /bin/app2 ENTRYPOINT ["dumb-init", "--"] CMD ["/start.sh"] # 这是以 tini 为例制作镜像的 Dockerfile 示例 FROM ubuntu:22.04 ENV TINI_VERSION v0.19.0 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini COPY entrypoint.sh /entrypoint.sh RUN chmod +x /tini /entrypoint.sh ENTRYPOINT ["/tini", "--"] CMD [ "/start.sh" ]
# 当使用 pre-stop 事件的容器终止时,nginx -s quit在 kubelet 向SIGTERM主进程发送信号之前,在容器中执行命令。 apiVersion: v1 kind: Pod metadata: name: prestop-demo spec: containers: - image: nginx name: nginx-container ports: - containerPort: 80 lifecycle: preStop: exec: command: - sh - -c - echo "Stopping container now..." > /proc/1/fd/1 && nginx -s stop在某些极端情况下,Pod 被删除的一小段时间内,仍然可能有新连接被转发过来,这种情况下,我们也可以利用 preStop 先 sleep 一小下,等待 kube-proxy 完成规则同步再开始停止容器内进程。
lifecycle: preStop: exec: command: - sleep - 5s4、使用 Liveness 和 Readiness Probes
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx strategy: type: RollingUpdate rollingUpdate: # 单个串行升级,等新副本 ready 后才开始销毁旧副本 maxUnavailable: 0 maxSurge: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest startupProbe: httpGet: path: / port: 80 successThreshold: 5 # 新副本启动时,连续探测成功多次后才交给 readinessProbe 探测 periodSeconds: 5 readinessProbe: httpGet: path: / port: 80 successThreshold: 1 # 运行过程中探测 1 次成功就认为 ready,可在抖动导致异常后快速恢复服务 periodSeconds: 5
标签: k8s kubernetes 优雅停止 PreStop Readiness SIGTERM Liveness
发表评论