作者: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-v42f6labels:app: demoapp
spec:containers:- name: bookingsimage: banzaicloud/allspark:0.1.1...- name: istio-proxyimage: docker.io/istio/proxyv2:1.4.3lifecycle: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. chrome 69版本flash内置支持

    chrome69版本已经停止对flash的支持.flash已经开始逐步退出历史舞台. 单是一些网站还没有更换,又想要支持flash,怎么办呢?下面给出解决方案: chrome虽然禁用了flash插件, ...

  2. 部署k8s 1.18版本及图形管理工具kuboard(十四)

    部署k8s 1.18版本 1.配置主机名 [root@192 ~]# hostnamectl set-hostname k8s-master [root@192 ~]# hostnamectl set ...

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

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

  4. servlet容器_SpringBoot是否内置了Servlet容器?

    SpringBoot是否内置了Servlet容器? SpringBoot内置了Servlet容器,这样项目的发布.部署就不需要额外的Servlet容器,直接启动jar包即可.SpringBoot官方文 ...

  5. Mac OS X:雪豹内置支持读写NTFS卷

    Mac OS X:雪豹内置支持读写NTFS卷 Update : 添加另外一种方法,它可以自动将任何的NTFS卷默认地绑定为可写的. 最新的Snow Leopard雪豹系统内置支持对NTFS分区卷的读写 ...

  6. “您的Microsoft Internet Explorer浏览器包含最新版本的内置Adobe Flash Player“解决

    因为win8.win10以后flash是内置在浏览器的,如果一定要另外安装adobe flash activeX版本的软件,会报如下的错误,因为IE.Microsoft Edge浏览器都是用的acti ...

  7. Spark团队开源新项目MLflow发布0.2版本,内置TensorFlow集成

    译者 | 无明 编辑 | Natalie AI 前线导读: 在今年的 Spark+AI 峰会上,Spark 团队推出了 MLflow,一个开源的用于简化机器学习生命周期的平台.从首次发布到现在的三周时 ...

  8. GTA5内置html菜单源码,【GTA5线上1.46版本免费内置菜单菜单】【5款目前最新可用的内置菜单可供选择】刷钱、套模型、无敌、传送...

    功能上有线上刷钱,给其他玩家套模型 ,无敌 传送等等 首先先回答大家几个关于内置菜单的问题 1.内置菜单会封号嘛? 回答:外置菜单也会有几率封号,我只能说是挂都会有封号的几率,用内置就像抽烟的人对比不 ...

  9. Apache Spark 3.2 内置支持会话窗口

    Apache Spark™ Structured Streaming 允许用户在事件时间的窗口上进行聚合.在 Apache Spark 3.2™ 之前,Spark 支持滚动窗口(tumbling wi ...

最新文章

  1. mybatis-错误记录java.lang.ExceptionInInitializerError
  2. js form中的onsubmit和action
  3. vb操作excel图表_EXCEL的简单介绍(嗯,文本版的)
  4. android 蓝牙不停扫描,android – BluetoothAdapter不会停止扫描BLE设备
  5. 11尺寸长宽 iphone_新手必知LED显示屏尺寸规格及计算方法
  6. 大数据学习笔记03:安装配置CentOS7虚拟机
  7. 面试造飞机,工作拧螺丝。
  8. android sdk 文档导读之前传:初涉
  9. ADB常用命令及其用法大全
  10. 设计原则:单一职责(SRP)原则
  11. c语言算术转换例子,关于C语言算术表达式中“寻常算术转换”的问题
  12. html和css实现 字体变色 旋转 图标渐变
  13. PS怎么调整字体的行间距
  14. 【运筹学】CH2 线性规划与单纯形法1——线性规划问题及其数学模型
  15. mysql 查询上周记录_mysql查询今天、昨天、上周
  16. Automatic classification of defective photovoltaic module cells in electroluminescence images-论文阅读笔记
  17. cmd命令与dos指令
  18. Programming Rust Fast, Safe Systems Development(译) 表达式(第六章 完)
  19. uniapp 下载文件却变成了跳转
  20. unity5.0 添加图片纹理

热门文章

  1. C#编程中的66个好习惯,你有多少个?(转)
  2. 设计模式建议学习顺序
  3. 【机房真是】。。。各种蛋疼。。。
  4. linux 内核fpic,linux编译动态库 fPIC作用
  5. Linux 环境下 jdk1.8 maven3.2.3 Git2.8.0 安装脚本
  6. jquery.cookie.js 使用小结
  7. 外部中断0(含知识点)
  8. 认识与入门:Markdown
  9. HTTP协议快速入门
  10. [BOOST] BOOST::Format