当您采用Sidecar容器的形式实现类似DaemonSet的效果,从而提供额外的服务或功能(如日志记录、监控、安全性或流量转发),这些功能需要控制Sidecar容器相对于主应用容器的启停顺序。本文介绍如何配置Sidecar容器启停顺序。
功能说明
在ACS场景下,由于虚拟节点的限制,不支持Kubernetes的DaemonSet功能。此时部分需要使用DaemonSet的场景可以采用为Pod添加Sidecar容器的形式来实现类似效果。 然而,Sidecar容器的生命周期无法独立于Pod的生命周期。为了达到类似于DaemonSet的效果,您需要进行一些配置来控制Sidecar容器的启停顺序。保证Sidecar容器在Pod创建时先于应用主容器启动, 并保证在Job类Pod中业务容器已经退出的情况下, 强制终止Sidecar容器。
针对上述场景,ACS支持通过两种方式配置Sidecar容器的启停顺序:
社区原生Sidecar声明
在K8s 1.29及以上的版本, 默认支持原生的Sidecar声明方式。 即通过把Sidecar配置为Init容器,并将
restartPolicy
设置成Always。说明原生Sidecar方式将Sidecar容器作为一个特殊的Init容器来实现。Pod启动时,应用容器需要等待Sidecar容器完成启动之后才可以正常运行。同时
restartPolicy: Always
的配置使得Sidecar容器可以启动、停止和重新启动,且不会影响主应用容器和其他Init容器。ACS定制声明
对于K8s 1.28及以下的版本, ACS支持为普通容器设置一个特殊的环境变量
__IS_SIDECAR__
,来标记此容器是否为Sidecar。重要ACS定制声明的方式,支持将普通容器声明为Sidecar,先于其他普通容器启动,并按
restartPolicy
为Always
的原则自动重试。同时,ACS集群在低版本K8s(1.28及以下)做了兼容,确保Container状态可以得到更新。但在高版本或其他类型的的K8s集群中,受限于K8s对于Container状态的更新限制,ACS定制声明的Sidecar容器在失败重试后,
containerStatus
和Pod状态中并不会更新为Running,请以Pod实际状态为准。建议您将集群升级至1.29以上版本,并使用社区原生Sidecar声明的方式。
配置说明
配置方法 | Pod字段/环境变量名称 | 配置说明 |
社区原生Sidecar声明 | Init容器的 |
|
ACS定制声明 | 普通容器的环境变量: |
|
配置示例
test-sidecar.yaml的内容示例如下,表示创建一个Job,Job内包含两个容器,app为业务容器,sidecar为Sidecar容器。
ACS定制声明
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] env: - name: __IS_SIDECAR__ # 为此容器设置环境变量 value: "true" # 标记此容器为sidecar restartPolicy: Never backoffLimit: 2
社区原生Sidecar声明
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: initContainers: - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] restartPolicy: Always # 声明此容器为sidecar containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] restartPolicy: Never backoffLimit: 2
执行以下命令,创建Job。
kubectl apply -f test-sidecar.yaml
查看Job详情和对应的Pod详情,观察环境变量的效果。
确认Job已经运行完成,且状态为
Succeeded
。kubectl describe job <job-name>
示例如下:
查看Sidecar容器详情,观察容器的启动顺序和实际的退出码
kubectl describe pod <pod-name>
容器的启动顺序示例如下,可以看到sidecar容器先于app容器启动, 从而保证应用主容器依赖的sidecar功能(例如流量转发)提前就绪;另外,可以看到app容器运行结束后(10s后),sidecar容器会被强制杀掉,从而保证作业Pod可以完成:
退出码示例如下,可以看到sidecar容器被强制退出,且退出码是0,保证不会干扰作业Pod运行是成功还是失败的判断。