当您采用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>示例如下:
Parallelism: 1 Completions: 1 Completion Mode: NonIndexed Start Time: Tue, 29 Oct 2024 11:24:18 +0800 Completed At: Tue, 29 Oct 2024 11:25:17 +0800 Duration: 59s Pods Statuses: 0 Active (0 Ready) / 1 Succeeded / 0 Failed Pod Template:
-
-
查看Sidecar容器详情,观察容器的启动顺序和实际的退出码
kubectl describe pod <pod-name>-
容器的启动顺序示例如下,可以看到sidecar容器先于app容器启动, 从而保证应用主容器依赖的sidecar功能(例如流量转发)提前就绪;另外,可以看到app容器运行结束后(10s后),sidecar容器会被强制杀掉,从而保证作业Pod可以完成:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5m11s default-scheduler Successfully assigned default/test-729nd to virtual-kubelet-cn-shenzhen-f Normal Pulling 5m13s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 384ms Normal Created 5m12s kubelet Created container sidecar Normal Started 5m12s kubelet Started container sidecar Normal Pulling 5m12s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 342ms Normal Created 5m12s kubelet Created container app Normal Started 5m12s kubelet Started container app Normal Killing 5m1s kubelet Stopping container sidecar -
退出码示例如下,可以看到sidecar容器被强制退出,且退出码是0,保证不会干扰作业Pod运行是成功还是失败的判断。
sidecar: Container ID: containerd://bd85de5ad7ee1cb5a4807b094f2d41fa90881916857172 0e73ef0dfbd26f1dfb Image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 Image ID: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox@sha256:141c253bc4c3fd0a20 Port: <none> Host Port: <none> Command: sh -c touch /var/logs.txt && tail -F /var/logs.txt State: Terminated Reason: Completed Message: Force this container to be success(137, Error, ) Exit Code: 0 Started: Tue, 29 Oct 2024 11:24:32 +0800 Finished: Tue, 29 Oct 2024 11:25:13 +0800 Ready: False Restart Count: 0
-