Kubernetes 1.33 重磅发布:Sidecar 容器正式 GA,服务网格的补丁时代结束了
Kubernetes 1.33 重磅发布Sidecar 容器正式 GA服务网格的补丁时代结束了作者人间凡尔赛前言2026 年 8 月Kubernetes 1.33代号 Octarine的 Beta 特性陆续进入社区视野其中原生 Sidecar 容器正式 GA、In-place Pod Resize 转 Beta 等特性引发广泛讨论。Sidecar 是服务网格、日志采集、可观测性三大基础设施的基石模式此次原生支持落地意味着从 Istio 到 Filebeat 的部署方式都将迎来一次去 Hack 化的范式升级。---一、十年之痒为什么 Sidecar 需要原生支持Sidecar边车模式的概念可以追溯到 2015 年 Kubernetes 官方博客对组合容器的描述在同一个 Pod 中与应用主容器并列部署一个辅助容器为其扩展和增强能力。如今 Sidecar 已成为最普遍的 K8s 部署模式之一Istio/Envoy 网络代理、Filebeat/Fluent Bit 日志采集、Prometheus exporter 指标暴露全是典型 Sidecar。但很长一段时间里Kubernetes 对 Sidecar 没有任何原生支持这带来了一系列棘手的生命周期问题| 痛点 | 表现 ||------|------|| 启动顺序 | 无法保证 Sidecar 先于主容器就绪网络代理未就绪主容器请求已发出 || 优雅终止 | Job 型 Pod 结束运行时日志 Sidecar 被同时杀掉最后一批日志丢失 || 独立重启 | Sidecar 崩溃后无法单独拉起只能整 Pod 重建 || 网格 Hack | Istio 必须借助 iptables 流量重写 PostStart 钩子来管理注入容器的生命周期 |社区为此吵了多年有人用 init 容器但 init 容器跑完即退出无法常驻有人用普通容器 preStop 钩子 各种脚本强行编排顺序。直到 2019 年 KEP-753 正式提案2023 年 1.28 以 Alpha 引入2026 年 1.33 终于 GA。---二、原生 Sidecar 是什么一个 restartPolicy: Always 的 init 容器原生 Sidecar 的实现思路非常优雅——它本质上仍是 init 容器只是允许设置 restartPolicy: Always。Kubernetes 据此获得了一个关键信息这个容器不是跑一次就退出的初始化任务而是要陪主容器跑完整个生命周期的常驻伙伴。apiVersion: v1 kind: Pod metadata: name: app-with-native-sidecar spec: initContainers: # 传统 init 容器跑完即退出 - name: init-db-migrate image: busybox:1.36 command: [sh, -c, echo migrating... sleep 3] # 原生 SidecarrestartPolicy: Always → 常驻 - name: log-agent image: fluent/fluent-bit:3.2 restartPolicy: Always volumeMounts: - name: app-logs mountPath: /var/log/app containers: - name: main-app image: nginx:1.27 volumeMounts: - name: app-logs mountPath: /var/log/nginx volumes: - name: app-logs emptyDir: {}部署后观察 Pod 状态会发现两个容器都进入 Running$ kubectl get pod app-with-native-sidecar NAME READY STATUS RESTARTS AGE app-with-native-sidecar 2/2 Running 0 42s区别在于init-db-migrate 完成后变成 Completed而 log-agent 会一直运行直到 Pod 被删除。---三、GA 带来的四大核心能力3.1 启动顺序保证先 Sidecar后主容器这是服务网格的刚需。过去 Istio 注入的 Envoy 必须抢在主容器之前完成 iptables 规则注入否则应用流量直接绕过代理。原生 Sidecar 让这个顺序变成语言级保证所有 Sidecar 按声明顺序启动完成后主容器才会启动。spec: initContainers: - name: envoy-proxy # 第 1 个启动 image: envoyproxy/envoy:v1.32 restartPolicy: Always - name: otel-agent # 第 2 个启动 image: otel/opentelemetry-collector-contrib:0.115.0 restartPolicy: Always containers: - name: app # 最后启动 image: myapp:latest3.2 优雅终止Sidecar 撑到最后过去最经典的翻车现场Job 跑完kubectl logs 里永远缺最后几行日志——因为日志 Sidecar 和主容器同时收到 SIGTERM双双退出日志缓冲来不及 flush。原生 Sidecar 的终止语义是主容器先退出Sidecar 继续存活直到 Pod 删除完成保证日志、指标、连接追踪都能完整落盘。这对批处理、AI 训练任务尤为重要。3.3 独立重启Sidecar 崩了不用整 Pod 陪葬普通容器模式的 Sidecar 一旦 OOM 或 panickubelet 只能重启整个 Pod主容器被迫跟着闪断。原生 Sidecar 的 restartPolicy: Always 让 kubelet 可以单独重启 Sidecar 本身$ kubectl get pod app-with-native-sidecar -o jsonpath{.status.containerStatuses}当 log-agent 崩溃时只有它的 restartCount 增加主容器零感知。3.4 完整探针支持Ready 状态终于算数GA 版本补齐了 Sidecar 的健康话语权支持 startupProbe、readinessProbe、livenessProbe 全部探针且Sidecar 的就绪状态会影响整个 Pod 的 Ready 状态——只有 Envoy 就绪了Pod 才算就绪流量才会打进来。initContainers: - name: envoy-proxy image: envoyproxy/envoy:v1.32 restartPolicy: Always ports: - name: admin containerPort: 9901 readinessProbe: httpGet: path: /ready port: admin initialDelaySeconds: 3 periodSeconds: 5 livenessProbe: httpGet: path: /healthz port: admin periodSeconds: 10---四、服务网格去 HackIstio 与 Linkerd 的新姿势原生 Sidecar 最大受益者就是服务网格。过去 Istio 注入 Envoy 需要三步 Hack① init 容器设置 iptables 规则劫持流量② postStart 钩子等代理就绪③ 各种 holdApplicationUntilProxyStarts 之类的开关。现在直接声明原生 Sidecar生命周期交给 kubelet网格数据面第一次拥有了一等公民待遇。apiVersion: apps/v1 kind: Deployment metadata: name: payments namespace: default spec: template: metadata: annotations: sidecar.istio.io/inject: true # 开启 Istio 原生 Sidecar 模式1.19 sidecar.istio.io/nativeSidecar: true spec: initContainers: - name: istio-proxy image: auto restartPolicy: Always效果立竿见影• 不再需要 iptables 重写与 PostStart 钩子的时序魔法• 网格代理崩溃可独立重启业务进程稳如泰山• Job/CronJob 短任务结束后代理优雅退出不再拖住 Pod 无法完成---五、1.33 里同样值得关注的三件事原生 Sidecar 是 1.33 的主角但这几个特性同样值得后端架构师关注5.1 In-place Pod Resize 转 Beta默认开启过去调整 Pod 的 CPU/内存必须重建 Pod重启应用1.33 支持原地修改资源通过 PodResizePending / PodResizeInProgress 两个 Condition 观察进度$ kubectl patch pod web-0 --subresourceresize \ -p {spec:{containers:[{name:app,resources:{requests:{cpu:2,memory:4Gi}}}]}} $ kubectl get pod web-0 -o jsonpath{.status.conditions[?(.typePodResizeInProgress)]}大促扩容再也不用滚动重启了长连接、缓存热数据全部保留。5.2 User Namespaces 默认开启每个 Pod 的 UID/GID 被映射到宿主机的非特权 ID即使容器内以 root 运行、被攻破也无法在宿主机上提权——容器逃逸的横向移动路径被彻底切断多租户集群安全水位大幅提升。5.3 Job 批量能力收尾JobBackoffLimitPerIndex 与 JobSuccessPolicy 双双 GA索引级重试 自定义成功判定让大规模并行数据处理如 AI 数据预处理的失败重试策略精确到每一条。---六、迁移建议三步切换到原生 Sidecar如果你的集群已升级到 1.33该特性默认启用可以按以下路径平滑迁移# 1. 确认特性可用 $ kubectl get nodes -o wide | head -3 $ kubectl api-resources | grep -i sidecar # 无需独立 CRD直接用 initContainers # 2. 把常驻型 init 容器加上 restartPolicy: Always # 日志采集、网格代理、配置热加载器等 # 3. 观察 Pod 生命周期重启测试、缩容测试、Job 完成测试 $ kubectl rollout restart deployment/log-collector迁移的三个判断准则• 需要常驻、需保证先于主容器启动 → 原生 SidecarrestartPolicy: Always• 跑完即退的一次性初始化 → 保持传统 init 容器• 无依赖顺序的纯并行辅助容器 → 保持普通容器即可无需迁移---七、总结从 2015 年的概念博客到 2019 年的 KEP-753再到 2026 年的正式 GASidecar 原生支持走完了模式 → 提案 → Alpha → Beta → Stable的完整旅程。它带来的不只是 YAML 里多一个字段而是把 Sidecar 从需要各种 Hack 才能跑起来的二等公民升级为生命周期受 kubelet 全权托管的头等公民。对后端与平台工程师来说这意味着服务网格更稳了、日志一条不丢了、Pod 重启更少了。1.33 的 Sidecar GA或许正是云原生基础设施走向零 Hack的一块重要里程碑。你的集群升级到 1.33 了吗打算把哪些 Sidecar 迁移到原生模式欢迎在评论区交流。---本文为原创技术分享数据与特性说明基于 Kubernetes 1.33 官方 Release Notes 与社区讨论整理。