一步一步教你写 kubernetes sidecar
什么是 sidecar?
sidecar,直译为边车。 如上图所示,边车就是加装在摩托车旁来达到拓展功能的目的,比如行驶更加稳定,可以拉更多的人和货物,坐在边车上的人可以给驾驶员指路等。边车模式通过给应用服务加装一个“边车”来达到控制和逻辑的分离的目的。
对于微服务来讲,我们可以用边车模式来做诸如 日志收集、服务注册、服务发现、限流、鉴权等不需要业务服务实现的控制面板能力。通常和边车模式比较的就是像 spring-cloud 那样的 sdk 模式,像上面提到的这些能力都通过 sdk 实现。
这两种实现模式各有优劣,sidecar 模式会引入额外的性能损耗以及延时,但传统的 sdk 模式会让代码变得臃肿并且升级复杂,控制面能力和业务面能力不能分开升级。
本文的代码已经上传到gitee
sidecar 实现原理
介绍了 sidecar 的诸多功能,但是,sidecar 是如何做到这些能力的呢?
原来,在 kubernetes 中,一个 pod 是部署的最小单元,但一个 pod 里面,允许运行多个 container(容器),多个 container(容器)之间共享存储卷和网络栈。这样子,我们就可以多 container 来做 sidecar,或者 init-container(初始化容器)来调整挂载卷的权限
日志收集 sidecar
日志收集 sidecar 的原理是利用多个 container 间可以共用挂载卷的原理实现的,通过将应用程序的日志路径挂出,用另一个程序访问路径下的日志来实现日志收集,这里用 cat 来替代了日志收集,部署 yaml 模板如下
使用 kubectl create -f 创建 pod,通过 kubectl logs 命令就可以看到 sidecar-container 打印的日志输出
转发请求 sidecar
这一节我们来实现,一个给应用程序转发请求的 sidecar,应用程序代码如下
我们再来写一个 sidecar,它会每 15 秒向应用程序发出请求
通过仓库下的intput/build.sh
脚本构造镜像,运行 yaml 如下
通过查看 kubectl logs input input-http-server 可以看到 input-http-server 收到了请求
拦截请求 sidecar
应用程序代码,它会每 15s 向localhost
发出请求
我们再来写一个 sidecar,它会拦截 http 请求并打印日志
通过仓库下的output/build.sh
脚本构造镜像,运行 yaml 如下
通过查看 kubectl logs output output-workload 可以看到 output-sidecar 收到了请求
文章转载自:华为云开发者联盟
评论