作者: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. U3D Shader_图片模糊处理

    shader"practice/12.14"{ properties { _MainTex("MainTex",2D) = ""{} } S ...

  2. 【学习】调用iframe中的方法

    当页面中有iframe时,想在主页面调用iframe中的方法,可以用contentWindow属性.但具体用时还有一点要注意,就是必须等页面加载完成才可以,否则会报错找不到函数. 例: 父页面: &l ...

  3. 【题解】P5446 [THUPC2018]绿绿和串串(manacher)

    [题解]P5446 [THUPC2018]绿绿和串串(manacher) 考虑对于一个串进行\(f\)操作,就是让他变成一个以最后一个节点为回文中心的回文串. 那么对于某个位置\(p\),假如它是一个 ...

  4. spring之整合Hibernate

    spring整合Hibernate整合什么? 1.让IOC容器来管理Hibernate的SessionFactory. 2.让Hibernate使用上spring的声明式事务. 整合步骤: 1.加入H ...

  5. AcWing 240. 食物链 | 并查集

    传送门 题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...

  6. Markdown 复杂公式&常用符号

    公式格式 行内公式 行内公式(不会换行)使用 $ 作为起止符,例如:$a + b = c$, 效果为:\(a + b = c\) 块级公式 块级公式(单独一行)使用 $$ 作为起止符,例如:$$a + ...

  7. 数据结构与算法 Python语言实现 第一章练习

    说明:部分代码参考了Harrytsz的文章:https://blog.csdn.net/Harrytsz/article/details/86645857 巩固 R-1.1 编写一个Python函数 ...

  8. dp - 3维背包(东四省)

    题意: 给你 n 张卡片,总共可以消耗的法力值,求最多可以造成多少伤害, 卡片分为2种,一种是魔法卡,使用后可以使所有的连环卡的费用全部减1,另一种是连环卡,因魔法卡的使用可以使其费用减1,问最终最多 ...

  9. 解析Json字符串中的指定的值

    { "head": { ", "Id": "20191008144448iAQE", "Message": & ...

  10. Kaggle竞赛丨入门手写数字识别之KNN、CNN、降维

    引言 这段时间来,看了西瓜书.蓝皮书,各种机器学习算法都有所了解,但在实践方面却缺乏相应的锻炼.于是我决定通过Kaggle这个平台来提升一下自己的应用能力,培养自己的数据分析能力. 我个人的计划是先从 ...