OpenKruise SidecarSet通过Admission Webhook,在创建Pod时对匹配了目标Label的所有Pod注入Sidecar容器,但无法仅对调度到虚拟节点的Pod生效。您可以使用虚拟节点组件(ack-virtual-node),仅为调度到虚拟节点的Pod自动注入Sidecar容器,从而解耦虚拟节点Pod的Sidecar容器与业务容器。
基本概念
Sidecar:一种将应用辅助功能从应用本身剥离出来作为单独进程或容器的设计方式。该模式允许您向应用无侵入添加多种功能,避免为满足第三方组件需求而向应用添加额外的配置代码。
Sidecar容器:在Pod中添加附加容器,扩展和增强主容器,无需改变主容器。
SidecarSet:是阿里云开源的云原生应用自动化引擎OpenKruise的核心功能之一。SidecarSet可以为符合条件的Pod自动注入Sidecar容器,实现Sidecar容器(如监控、日志等agent)的定义和生命周期与业务容器解耦。
使用限制
支持OpenKruise v1.3及以下版本的SidecarSet全部功能,不支持1.3以上版本中新增的SidecarSet功能。
前提条件
集群版本为1.22及以上,集群类型为ACK托管集群Pro版或者ACK专有集群。
已安装ack-kruise组件,且版本为v1.3.0及以上。更多信息,请参见ack-kruise。
已安装虚拟节点组件(ACK Virtual Node),且版本为v2.10.0及以上。更多信息,请参见ACK Virtual Node。
已启用
SidecarSetServerlessPod=true
特性门控。在Kube API Server组件featureGates中设置
SidecarSetServerlessPod=true
。具体操作,请参见自定义控制面组件参数。
功能介绍
SidecarSet
您可以使用与默认SidecarSet完全一致的方式来匹配所有调度到虚拟节点的Pod,即通过标签serverless.alibabacloud.com/virtual-node: "true"
指定。该标签会在Pod确定调度到虚拟节点后打上。关于默认SidecarSet的使用方法,请参见SidecarSet。
另一个常用的功能是跨命名空间引用ConfigMap和Secret。DaemonSet核心容器运行经常依赖ConfigMap,如配置参数。将DaemonSet核心容器注入到业务Pod中,业务Pod与ConfigMap通常在不同的命名空间,在Sidecar容器Volume中通过namespace/name
方式引用其他命名空间的ConfigMap。
跨命名空间访问ConfigMap和Secret需要授权。具体方式,请参见下方SidecarSetResourceBinding。
SidecarSetResourceBinding
出于安全考虑,在Sidecar容器Volume中引入其他命名空间的ConfigMap和Secret需要通过SidecarSetResourceBinding显式授权。
该授权仅授予对ConfigMap和Secret的只读权限(Get,List,Watch)。
容器启动和退出顺序
Sidecar容器经常需要在业务容器前启动,在业务容器后退出,您可以通过设置容器启动和退出顺序实现。
自动结束Sidecar容器
对于Job类Pod,Sidecar容器可能会导致业务容器完成后Job无法退出的情况,您可以通过强制终止Sidecar容器并忽略容器退出码来解决问题。
升级Sidecar容器
使用Sidecar模式后,您可能会有Sidecar容器升级等运维需求。您可以使用OpenKruise已有的Sidecar热升级功能,该方式能在不影响Pod可用性情况下无缝升级Sidecar容器,且与当前虚拟节点方式完全兼容。
日志收集
通过将虚拟节点Pod标准输出日志卷挂载到Sidecar容器指定目录,可以收集业务容器的日志。具体信息,请参见挂载stdlog实现挂载容器标准输出日志。
操作示例
下文将以filebeat容器作为Sidecar容器注入到echo-server业务Pod为例,展示完整的使用流程。
部署filebeat容器配置文件。
配置文件是kube-system命名空间的ConfigMap,将被挂载到filebeat容器里。本示例仅将该配置文件挂载到Sidecar容器并打印,相关变量不生效,无需替换。
部署filebeat容器的SidecarSet描述。
本示例filebeat容器仅打印配置内容。同时,filebeat容器还挂载了业务Pod的标准输出卷,可以收集业务Pod的标准输出日志。
授权filebeat容器能够访问kube-system命名空间下的配置文件。
因为echo-server业务Pod位于default命名空间下,filebeat容器被注入后跨namespace访问配置文件需要显式授权。
部署echo-server业务Pod。
查看业务Pod。
kubectl get pod NAME READY STATUS RESTARTS AGE echo-server-54f5cf556c-8ms5z 2/2 Running 0 41s
输出表明,Pod包含2个容器,说明注入成功。
验证filebeat容器已挂载业务Pod标准输出日志。
kubectl exec echo-server-54f5cf556c-8ms5z -c filebeat -- cat /var/log/std/echo-server/0.log 2023-07-07T00:40:07.927378153+08:00 stderr F 2023/07/06 16:40:07 Server is listening on :8080
输出表明,可以看到业务Pod标准输出日志。
验证filebeat容器已挂载跨命名空间的配置文件filebeat-config。
输出表明,挂载正常。