作者:justmine

头条号:大数据与云原生

微信公众号:大数据与云原生

创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。

为了方便阅读,微信公众号已按分类排版,后续的文章将在移动端首发,想学习云原生相关知识,请关注我

一、前言

Kubernetes的目标不仅是使分布式应用程序的部署和运维变得简单可靠,还旨在能轻松地创建“云原生”应用程序,即易于创建在云环境中运行的分布式应用程序和服务,于是从1.18版本开始K8S将原生支持生命周期类型为SideCar的容器。

在云原生时代,通过将应用的非业务功能提到SideCar容器实现解耦,避免重复建设,给运维人员提供更为丰富而深入的控制同时,也大大减轻了开发人员的负担。

随着越来越多的应用程序开始实施这种模式,在K8S中出现了很多的问题。很快,Kubernetes意识到应该提供一种边车模式的容器,并以不同的方式处理此类容器的生命周期。

二、痛点

Sidecar容器的所有问题都与容器生命周期相关性有关。由于Pod中的常规容器之间没有区别,因此无法控制哪个容器首先启动或最后终止,但是先正确运行Sidecar容器通常是应用程序容器正确运行的要求。

Pod启动

让我们看一个Istio服务网格示例。Envoy边车负责将所有传入和传出流量代理到应用程序容器。因此,在代理启动并运行之前,应用程序应该无法发送或接收流量。此时,如果应用程序尝试出站访问,则K8S的就绪性探针便形同虚设。如果应用容器先启动,您会在日志中看到很多莫名的错误消息,明明应用已启动了,为什么还报503呢?但如果代理容器正常启动,但业务容器遭遇CrashLoopBackoffs时,应用容器根本启动失败,此时代理容器该何去何从?

其实这也不是一个非常棘手的问题,我们可以在应用程序容器的启动脚本中添加几秒钟的延迟,通过一个丑陋的解决方法间接地解决此问题,这也是Istio当下的做法。

三、解决方案

为了彻底解决上述痛点,从1.18版本开始,K8S内置的Sidecar功能将确保边车在正常业务流程开始之前就启动并运行,即通过更改pod的启动生命周期,在init容器完成后启动sidecar容器,在sidecar容器就绪后启动业务容器,从启动流程上保证顺序性。

四、新功能的影响

作业完成

如果Kubernetes作业具有Sidecar容器,则即使主容器完成后它仍将继续运行,并且作业本身永远不会达到完成状态。因为解决该问题的唯一方法是在业务过程完成时以某种方式发送信号给sidecar容器以退出。

这种解决方法存在一些问题:这意味着使用自定义逻辑扩展所有作业,并以某种方式在容器之间进行同步:通过共享的暂存卷或某些临时解决方案,例如Envoy的/quitquitquit终结点。

故从Kubernetes 1.18开始,如果所有普通容器都已到达终端状态(Succeededfor restartPolicy=OnFailureSucceeded/Failedfor restartPolicy=Never),则将向所有sidecar容器发送 SIGTERM信号。

Pod关闭

Pod关闭与Pod启动类似。如果Sidecar在业务过程之前终止,则在正常拆除业务应用程序期间可能会导致大量错误。在正常关闭期间,应用程序可以执行某种清除逻辑,例如关闭长期连接,回滚事务或将状态保存到外部存储(例如s3)。如果首先杀死了边车,则可能会导致清理逻辑无法正常运行。

一个很好的例子是argo项目中报告的一个问题。Argo尝试将容器日志存储在s3中,但是如果istio-proxy先杀死则无法这样做,因为所有流量都应流经该容器。

此类问题的解决方案类似于启动问题。通过更改Pod终止生命周期,首先向所有应用容器发送一个SIGTERM信号,等所有应用容器全部正常终止后,再向所有边车容器发送SIGTERM信号。在正常的平滑期(TerminationGracePeriod)内,如果所有的应用容器还未终止,像以前一样发送SIGKILL信号强制终止,然后发送SIGTERM信号给边车容器。

五、如何使用新功能?

通过更改Pod规范中的container.lifecycle.type将容器标记为边车类型:Sidecar,默认为Standard,如下:

apiVersion: v1
kind: Pod
metadata:
name: bookings-v1-b54bc7c9c-v42f6
labels:
app: demoapp
spec:
containers:
- name: bookings
image: banzaicloud/allspark:0.1.1
...
- name: istio-proxy
image: docker.io/istio/proxyv2:1.4.3
lifecycle:
type: Sidecar
...

注意:在k8s 1.18版本,边车模式仅仅作为支撑功能,故需要通过Api Server显示启用。

六、总结

本篇先详细介绍了K8S即将推出的重磅功能,可以说此功能专为云原生而设计,这也是为什么K8S会越来越受欢迎的原因,然后进一步分析了当下K8S实施边车模式的痛点,以及引入新功能的一些影响,最后通过例子演示了如何应用边车模式到Pod中,可以看出此功能将从根本上解决目前很多使用边车模式存在的问题。

七、最后

如果有什么疑问和见解,欢迎评论区交流。

如果觉得本篇有帮助的话,欢迎推荐转发

如果觉得本篇非常不错的话,可以请作者吃个鸡腿,创作的源泉将如滔滔江水连绵不断,嘿嘿。

八、参考资料

https://banzaicloud.com/blog/k8s-sidecars

https://github.com/kubernetes/enhancements/issues/753

https://kubernetes.io/blog/2016/06/container-design-patterns

重磅!K8S 1.18版本将内置支持SideCar容器。的更多相关文章

  1. 图文解说PhpStorm 7.0版本新增内置工具

    很多PHP开发者,都比较关心PhpStorm 7.0版本的内置工具.今天我们将测试内置的Vagrant工具和SSH远端控制台工具. Vagrant工具集成在PhpStorm 7.0版本中,提高了IDE ...

  2. 迭代器模式的一种应用场景以及C#对于迭代器的内置支持

    迭代器模式 先放上gof中对于迭代器模式的介绍镇楼 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 别名 游标(Cursor). 动机 一个聚合对象, 如列表(li ...

  3. Spring MVC内置支持的4种内容协商方式【享学Spring MVC】

    每篇一句 十个光头九个富,最后一个会砍树 前言 不知你在使用Spring Boot时是否对这样一个现象"诧异"过:同一个接口(同一个URL)在接口报错情况下,若你用rest访问,它 ...

  4. php 内置支持的标签和属性

    内置支持的标签和属性列表如下: 标签名 作用 包含属性 include 包含外部模板文件(闭合) file import 导入资源文件(闭合 包括js css load别名) file,href,ty ...

  5. swoole-1.7.18 版本已发布,支持 PHP7

    swoole-1.7.18 版本已发布,支持 PHP7 matyhtf 发布于: 2015年07月23日 (22评) 分享到:    收藏 +16 3月19日,深圳源创会火热报名中,go>> ...

  6. thinkphp中ajax使用实例(thinkphp内置支持ajax)

    thinkphp中ajax使用实例(thinkphp内置支持ajax) 一.总结 1.thinkphp应该是内置支持ajax的,所以请求类型里面才会有是否是ajax // 是否为 Ajax 请求 if ...

  7. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  8. python基础语法18 类的内置方法(魔法方法),单例模式

    类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...

  9. Apache Spark 3.0 将内置支持 GPU 调度

    如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...

随机推荐

  1. .NET Core 3.1之深入源码理解HealthCheck(二)

    写在前面 前文讨论了HealthCheck的理论部分,本文将讨论有关HealthCheck的应用内容. 可以监视内存.磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态. 运行状况检查可以测试应 ...

  2. 《算法笔记》之基础C/C++入门

    开始进行算法笔记的学习,在此纪录下来,同时作为自己日后复习资料. 1.基本语法 #include <iostream> using namespace std; int main(){ c ...

  3. 小小知识点(十八)U盘中病毒了,System Volume Information文件夹删除不掉

    win+R调出命令窗口后搜索cmd,启用cmd命令编辑器,并输入以下命令: attrib "H:\System Volume Information" -s   //这句话可以选择 ...

  4. vue开源Element UI表单设计及代码生成器

    在日常的开发工作中,表单开发是较为繁琐且重复的.本文介绍一个我自己写的,提高开发效率的小工具. 1 可视化设计器 设计器基于Element UI ,可通过点击或拖拽的方式设计基本表单, 设计器生成的代 ...

  5. Fabric1.4:运行 first-network 网络

    说明:运行 first-network 网络,必须先安装好 fabric1.4 的预置环境,fabric1.4 的安装可以参考此博文:https://www.cnblogs.com/zongmin/p ...

  6. 用VSCode插件来一键填满Github的绿色格子吧-AutoCommit

    autoCommit 一个用于Git自动commit的VSCode插件,它可以用来补充之前忘记提交commit,帮助你把首页的绿色格子填满. 使用效果 使用本插件来控制commit次数. 如下图,你甚 ...

  7. C# WPF 嵌入网页版WebGL油田三维可视化监控

    0x00 楔子 最近做的一个项目,是一个油田三维可视化监控的场景编辑和监控的系统,和三维组态有些类似,不过主要用于油田上. 效果如下图所示: 首先当然是上模型,设计人员跟进. 有了相关的模型,使用我们 ...

  8. 通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis核心原理

    本文将通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis原理 1.平常我们是如何使用Mapper的 先写一个简单的UserMapper,它包含一个全表查询的方法,代码如下 pub ...

  9. cogs 615. 韩国明星 STL map

    615. 韩国明星 ★★   输入文件:star.in   输出文件:star.out   简单对比时间限制:2 s   内存限制:128 MB [问题描述] 在LazyCat同学的影响下,Roby同 ...

  10. Anaconda的CondaHTTPError问题

    在Anaconda+Spyder配置Opencv的过程中遇到了缺乏cv2的问题,当时我在cmd的窗口(管理员身份)中输入了如下命令 conda install --channel https://co ...