问题的来由

在kubernetes集群的生产中,经常遇到这样的一个问题,就是在应用大规模更新时,大量容器删除而后大量容器创建,创建的容器需要很长时间才能就绪。这其中一个可能的原因,就是大量容器删除释放ip过于缓慢,导致新创建的容器无法及时获取ip,从而无法及时启动。

这种情况普遍存在于ip池较小或者应用升级需要ip保持不变的情景下,具有较为普遍的意义。针对这一情况,笔者先前做过一个方案用以解决该问题,在这里与大家分享一下。

k8s容器删除的流程

首先,我们先来梳理下容器删除的整个流程,看下为什么会释放ip缓慢。kubernetes容器的整个删除流程基本套路如下:

  1. 发送删除请求到apiserver,标记容器的deletionTimestamp
  2. kubelet watch到该事件,知道pod需要删除,进入删除流程
  3. pod执行killPod流程
  4. kill app容器
    1. 执行preStopHook
    2. 等待gracePeriod
    3. 停止app容器
  5. kill pause容器
    1. 调用cni接口,停止容器网络
    2. 停止pause容器
  6. 从apiserver中将pod的信息清除(真正删除掉存储在etcd的pod信息)

那么可以看到,ip的释放其实是发生在调用cni接口的时候。因此,按照常规流程,其需要等待的时间为执行preStopHook的时间 + gracePeriod + 停止app容器的时间。这个时间对于希望快速释放ip的情形下,是较为漫长的(一般要几十秒)。

加速ip资源释放的方案与利弊

如果想要加速ip资源的释放,那么方式也就是显而易见的,就是在kubernetes的现有流程基础上进行定制开发,将cni的调用前置,将其提前到kill app容器之前

特别注意,这里只是将cni接口调用提前,但是不要将停止pause容器提前,否则先停止pause容器可能会导致app容器停止时会有一些问题。

修改后的流程如下:

  1. 发送删除请求到apiserver,标记容器的deletionTimestamp
  2. kubelet watch到该事件,知道pod需要删除,进入删除流程
  3. pod执行killPod
  4. 调用cni接口,停止容器网络,释放容器ip
  5. kill app容器
    1. 执行preStopHook
    2. 等待gracePeriod
    3. 停止app容器
  6. kill pause容器
    1. 调用cni接口,停止容器网络(可选)
    2. 停止pause容器
  7. 从apiserver中将pod的信息清除(真正删除掉存储在etcd的pod信息)

这样的话,可以在第一时间尽快释放ip,而无需等待过久。

但是这样的方案也存在着很大的弊端,就是首先摘除了容器的网络,而如果preStopHook的执行或者停止app容器时需要依赖容器网络(比如应用需要调用某个接口才能进行下线等),可能会导致流程无法进行,容器被卡住,形成僵尸容器或者形成应用信息错误。

因此这个方案最好要做成可选的选项,在annotation中增加一个注解。而后根据应用的实际情况,选择是否使用快速释放ip的策略。

kubernetes容器删除时快速释放ip的方案的更多相关文章

  1. 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践

    [点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...

  2. Kubernetes容器运行时弃用Docker转型Containerd

    文章转载自:https://i4t.com/5435.html Kubernetes社区在2020年7月份发布的版本中已经开始了dockershim的移除计划,在1.20版本中将内置的dockersh ...

  3. docker for windows 容器内网通过独立IP直接访问的方法

    Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 ...

  4. C++ STL map容器值为指针时怎么释放内存

    最近在使用STL中map时,遇到了一个问题,就是当map中值为指针对象时怎么释放内存? // 站点与TCP连接映射表 (key为ip_port_stationCode, value为 clientSo ...

  5. vector容器删除某些元素且释放内存

    1,size和capacity size: 指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小. capac ...

  6. kubernetes/k8s CRI分析-容器运行时接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能.在此架构思想下,kubernetes ...

  7. CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路

    摘要: 关于 Kubernetes 接口化设计.CRI.容器运行时.shimv2.RuntimeClass 等关键技术特性的设计与实现.     Kubernetes 项目目前的重点发展方向,是为开发 ...

  8. Kubernetes容器运行时(CRI)简介

    Kubernetes节点的底层由一个叫做“容器运行时”的软件进行支撑,它负责比如启停容器这样的事情.最广为人知的容器运行时当属Docker,但它不是唯一的.事实上,容器运行时这个领域发展迅速.为了使K ...

  9. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

随机推荐

  1. Python通过简单的文件读写,来实现注册登录

    # -*- coding:utf-8 -*- '''''' username = input('请输入您的姓名:') password = input('请输入密码:') with open('get ...

  2. robot framework + win7 64 上的安装

    1.安装 python 2.7   2.cmd  管理模式 python -m pip install --upgrade pip     pip install robotframework==3. ...

  3. oracle连表语法

    1.笛卡尔积 (表一乘以表二) (表连接建立在笛卡尔积上过滤) select * from emp,dept; 2.等值连接 (表与表之见有相同的列表) select ename,dname from ...

  4. TestNG Suite 运行出现中文乱码如何解决

    场景: 用TestNG框架运行测试类,控制台视图输出出现中文乱码. 解决方案: 1.eclipse属性>workspace>other>utf-8 2.修改eclipse.ini 文 ...

  5. 多线程深入:乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(转)

    原文:https://www.cnblogs.com/qjjazry/p/6581568.html 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每 ...

  6. webservice学习教程(二)--理论

    一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...

  7. what's the 黑盒测试

    what's the 黑盒测试 黑盒测试是把测试对象看做一个黑盒子,利用黑盒测试法进行动态测试时,需要测试软件产品已经实现的功能是否符合功能设计要求,不需测试软件产品的内部结构和处理过程. 黑盒测试注 ...

  8. HDD ,SSD和PCIE SSD性能测试

      PCIE SSD   * MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s] * KB = 1000 bytes, KiB = 10 ...

  9. xcode 10 模拟器报错

    xcode 10(也可能是任意版本)run 模拟器时,发现会报下面的错误. This app could not be installed at this time.Could not access ...

  10. Percona-Toolkit 之 pt-archiver 总结

    pt-archiver - Archive rows from a MySQL table into another table or a file. pt-archiver nibbles reco ...