Kubernetes中的交互式测试、优雅关机与后台处理
立即解锁
发布时间: 2025-08-25 02:10:08 阅读量: 4 订阅数: 7 


Kubernetes for Developers: 实战容器编排与应用部署
### Kubernetes 交互式测试、优雅关机与后台处理详解
#### 1. 快速交互式测试
当你尝试创建一个快速的单行初始化容器时,交互式地尝试命令通常很有用,特别是在使用像 busybox 这样的极简容器时。你想要使用的命令可能并不存在,因此最好快速尝试以验证其是否能按预期工作。
要交互式地运行一个 busybox 容器,并在完成后将其删除,可以使用以下命令:
```bash
kubectl run tempinteractive -it --rm --restart=Never --image=busybox -- /bin/sh
```
然后在容器内尝试命令。
#### 2. 优雅关机处理
Kubernetes 使用 SIGTERM 信号通知容器关闭。SIGTERM 是 Linux 内核支持的一种功能,用于向正在运行的进程发送中断信号。进程可以监听这些信号,并选择如何响应。有两个信号是不能忽略的,即 SIGKILL 和 SIGSTOP。
接收 SIGTERM 信号的情况不仅包括错误或用户发起的删除操作,还包括使用滚动更新机制进行代码更新,以及使用自动伸缩功能动态增加或减少副本集内的副本数量时。
当响应此信号时,通常需要保存所需的状态,关闭所有连接,然后终止应用程序。如果创建的服务将被其他用户通过 Kubernetes 使用,首先可以更改一个内部变量,使就绪探针返回 false,休眠几秒钟,然后进行最终处理和终止操作。这样可以让 Kubernetes 内的服务结构重定向后续连接,使所有活动连接能够正常完成、排空并优雅关闭。
Kubernetes 发送信号后会启动一个计时器,默认值为 30 秒。如果需要更长时间,可以在 Pod 规范中使用 `terminateGracePeriodSeconds` 进行定义。如果计时器到期时容器仍未退出,Kubernetes 将尝试使用 SIGKILL 信号强制关闭它。
例如,执行 `kubectl delete deploy nodejs` 后,可能会看到 Pod 处于 “Terminating” 状态一段时间,这就是上述过程的体现。
##### 2.1 Python 中处理 SIGTERM
```python
import signal
import sys
def sigterm_handler(_signo, _stack_frame):
sys.exit(0)
signal.signal(signal.SIGTERM, sigterm_handler)
```
信号处理逻辑可以根据代码需求设置得复杂或简单。
##### 2.2 Node.js 中处理 SIGTERM
```javascript
/**
* SIGTERM handler to terminate (semi) gracefully
*/
process.on(process.SIGTERM, function() {
console.log('Received SIGTERM signal, now shutting down...');
process.exit(0);
})
```
#### 3. Kubernetes 中的作业(Job)
Kubernetes 不仅支持连续的长期运行进程,还支持短期的离散软件运行。作业(Job)专注于在合理的已知时间范围内完成的离散运行,并报告成功或失败。作业基于与长期运行软件相同的结构,以 Pod 规范为核心,并增加了跟踪成功完成次数的概念。
作业有两个可选设置:并行度(parallelism)和完成次数(completion)。未指定并行度时,默认值为 1,即一次只调度一个作业。可以将这两个值指定为整数,以并行运行多个作业来实现多次完成。如果作业从某种工作队列中获取任务,则可以不设置完成次数。
需要注意的是,完成次数和并行度的设置并非绝对保证,因此 Pod 内的代码需要能够容忍多个实例同时运行。同样,作业需要能够容忍容器在失败时重启,以及在节点故障导致在新 Pod 上重启时进行必要的初始化或设置。
当作业完成时,系统不会再创建新的 Pod,也不会删除已完成的 Pod,这样可以检查 Pod 的状态和查看容器日志。已完成的 Pod 在 `kubectl get pods` 命令中不会显示,但使用 `-a` 选项可以看到。需要手动删除已完成的作业,使用 `kubectl delete` 删除作业时,相关的 Pod 也会被清理。
##### 3.1 示例:运行一个简单作业
以下是一个简单的 YAML 文件,用于定义一个打印 “hello world” 的作业:
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: helloworld
spec:
template:
metadata:
name: helloworld
spec:
containers:
- name: simple
image: busybox
command: ["/bin/echo", "'hello world'"]
restartPolicy: Never
```
使用以下命令运行作业:
```bash
kubectl apply -f simplejob.yaml
```
使用 `kubectl get jobs` 命令查看作业状态:
```bash
kubectl get jobs
```
输出示例:
```plaintext
NAME DESIRED SUCCESSFUL AGE
helloworld 1 1 3d
```
使用 `kubectl describe job helloworld` 命令获取更详细的状态和输出信息。
如果使用 shell 脚本创建简单作业时出错,Kubernetes 默认会反复重试运行 Pod,导致 Pod 处于失败状态。可以设置回退限制来限制重试次数,未指定时默认重试 6 次。
作业被视为不可变对象,如果尝试快速修改作业规范并使用 `kubectl apply` 修复错误,会得到错误提示。处理作业时,最好删除作业并创建新的作业。
作业适用于将备份加载到数据库、进行备份、进行系统深入检查或诊断,以及运行带外清理逻辑等场景。
#### 4. 定时作业(CronJob)
CronJob 是基于作业的扩展,允许指定作业的重复运行时间表。其名称源自 Linux 中用于调度重复脚本的 cron 工具。CronJob 在 Kuber
0
0
复制全文
相关推荐









