利用k8s Infra 容器,解决pod网络故障注入的问题

本文探讨了Kubernetes中infra容器的作用,如何处理pod网络故障注入导致的container重启问题,以及如何利用infra容器共享网络命名空间来避免重启影响。作者提出了两种方案,最终选择在infra容器上直接注入故障以确保故障恢复的稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、infra容器作用

二、pod网络故障注入问题

三、充分利用pod infra容器


一、infra容器的作用

我们知道,在kubernetes中,pod中容器的资源隔离主要通过namespace和cgroup来实现。那如果我们需要为pod中的容器共享某种资源应该怎么做。kubernetes 中的 pause 容器就提供了以下功能:

  • 在 pod 中担任 Linux 命名空间共享的基础;
  • 启用 pid 命名空间,开启 init 进程。

二、pod网络故障注入问题

背景:

在给pod注入网络故障,模拟pod网络延迟,丢包的场景下,会出现注入故障的目标container重启,进而导致故障恢复失败,最后只能重启相应pod来恢复故障。

如上图所示,注入故障后显示0/1的pod。

问题分析:

是什么原因导致目标pod会重启呢?故障注入本身是由tc实现的,并不会引起该问题。然后想到容器具有探针机制,当用户容器配置了livenessProbe探针时,由于容器被注入了各种网络延迟或者丢包,会导致探针失败,从而使kubelet重启container,导致后续一系列依赖之前容器的操作失败。

三、充分利用pod infra容器

思考:

那有没有一种办法可以既可以注入故障,又可以不受重启container的影响?这边想到两种方案。

1.重启查询新启动的container,对新的目标container进行故障恢复。

2.通过前面infra容器的前置知识,可以知道infra container是和pod所有容器共享networknamespace的,因此可以直接把故障做在infra容器上,并且infra容器的生命周期是和pod相同的。

解决:

有了上述两种方案,我们再对其进行比较。

在方案1中,有下面几种情况仍然会出现恢复失败:

1.在恢复过程中,恰巧目标container重启了。

2.恢复时间点在新旧container重启的间隙。

3.尝试重试并且成功的时间间隔和新旧container重启并启动的时间间隔相关。

因此,需要不停重试,直到恢复成功为止,并不是一个看上去很好的解决方案。

再看看方案2,和没有重启的故障注入、恢复假设一模一样。通过分析和尝试最后选择了方案2。

四、参考

### 调整 Kubernetes Pod 内 Vim 终端窗口大小 当在 Kubernetes Pod 中使用 `vim` 编辑文件时遇到窗口大小不合适的问题,可以通过多种方法来调整终端窗口尺寸。以下是几种常见的解决方案: #### 方法一:通过 TTY 设置调整窗口大小 如果连接到 Pod 的方式支持伪TTY (PTY),可以尝试重新设置终端的行数和列数。这通常适用于交互式的 shell 会话。 ```bash kubectl exec -it <pod-name> -- bash stty rows 40 columns 120 ``` 上述命令将把终端的高度设为40行,宽度设为120列[^1]。 #### 方法二:利用环境变量控制窗口大小 对于某些容器运行时(如 Docker),可以在启动容器时指定环境变量来预定义终端大小。然而,在 Kubernetes 中直接这样做较为复杂,因为 Pod 配置通常是静态或由控制器管理的。不过,仍然可以在进入 Pod 后手动设置这些环境变量: ```bash export COLUMNS=120 export LINES=40 ``` 这种方法同样能够影响后续打开的应用程序,包括 `vim`[^3]。 #### 方法三:优化 SSH 或远程访问工具配置 如果是通过 SSH 访问节点上的静态 Pod 文件夹 `/etc/kubernetes/manifests/` 并进一步操作,则应确保使用的 SSH 客户端已正确配置以传递正确的窗口尺寸给服务器侧。例如,在 Linux/MacOS 上可以编辑 `.ssh/config` 文件加入如下选项: ```plaintext Host * RequestTty force SendEnv LC_ALL LANG ``` 此配置强制请求分配 PTY,并发送本地的语言环境变量,有助于保持一致性的显示效果。 #### 方法四:修改 Kubelet 参数 虽然这不是直接解决问题的方法,但如果经常面临此类问题,考虑增加 kubelet 的参数可能有所帮助。比如,确保所有节点都设置了合适的默认基础设施镜像版本,这对于维持稳定的容器行为非常重要[^2]: ```bash --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.2" ``` 尽管这个特定的例子与解决当前问题是间接关联的,但它展示了如何通过调整底层组件改善用户体验的可能性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值