使用 Telepresence 在本地替换云端 Serverless 容器

解读

在国内云原生面试中,这道题考察的是“本地开发如何无缝接入线上 Serverless 环境”。
Serverless 容器(如阿里云 SAE、华为 CCI、腾讯云 EKS Serverless)通常没有固定节点、无法直接 ssh 登录,传统 kubectl port-forwarddocker run 调试手段失效。
面试官希望你给出一条可落地、安全、低流量成本的链路,让本地容器在 2~3 分钟内就能“顶替”云端容器,接收真实流量,同时不破坏原有 CI/CD 流程。
回答时要突出三点:网络打通、流量劫持、Serverless 冷启动规避

知识点

  1. Telepresence 2 架构
    本地 telepresence connect 后,会在集群里注入 Traffic-Agent 边车,通过 VIF(虚拟网卡)把集群 DNS、Service、Pod IP 段拉到本机,实现三层网络透明

  2. Serverless 容器注入限制
    Serverless 节点多数开启 PodSecurityPolicy / 安全沙箱(kata/gvisor),默认禁止 privileged 容器。需要:

    • 使用 telepresence helm 安装时关闭 --set agentInjector.securityContext.privileged=true,改用 CAP_NET_ADMIN capability;
    • 提前在云厂商白名单中放行 traffic-manager 镜像域名(国内常用 registry.cn-hangzhou.aliyuncs.com/acs/telepresence 镜像缓存)。
  3. 流量劫持模式

    • Intercept:默认模式,把指定 Service 流量按权重或 header 规则导到本地,云端副本缩容到 0 也不影响,规避 Serverless 冷启动
    • Personal intercept:结合 x-telepresence-intercept-id header,实现多开发者并行调试
  4. 镜像一致性
    本地必须使用与云端相同的 distroless 或 scratch 基础镜像,防止 glibc 版本差异导致函数计算启动失败;同时本地监听端口必须与 Serverless 容器完全一致(如 9000 端口监听函数入口)。

  5. 安全与合规
    国内金融、政企项目要求流量不出国,需把 traffic-manager 部署在专有集群并开启 STUN over VPC 内网,禁用外部 Ambassador 中转;Secrets 统一走阿里云 KMS / 腾讯云 SSM,本地通过 telepresence gather-logs 审计,不留明文落盘

答案

步骤如下,全程 5 条命令,3 分钟内完成

  1. 本地安装并连接

    # 使用国内镜像加速
    brew install telepresence --cask  # Mac
    telepresence helm install \
      --set agentInjector.registry=registry.cn-hangzhou.aliyuncs.com/acs \
      --set agentInjector.tag=2.16.1-aliyun
    telepresence connect --kubeconfig ~/.kube/prod-config
    
  2. 创建 intercept,替换云端 Serverless 容器
    假设云端 Deployment 名为 prod-srv,端口 9000:

    telepresence intercept prod-srv --port 9000:9000 --env-file ~/prod-srv.env
    

    此时云端副本流量被100% 劫持到本地,Serverless 实例自动缩容到 0,不产生额外费用

  3. 本地启动容器
    使用与线上相同的 Dockerfile,确保镜像 tag 一致:

    docker run --rm -it --network host -v $(pwd):/workspace \
      -e ALICLOUD_ACCESS_KEY_ID=$(cat ~/prod-srv.env | grep ACCESS_KEY) \
      myrepo/prod-srv:1.3.0
    

    因 Telepresence 已把集群 DNS 注入本机,代码里通过 http://user-svc.default.svc.cluster.local 调用其他服务无需改任何配置

  4. 验证与排障

    telepresence status
    telepresence loglevel debug   # 实时看 VIF 路由
    curl -H "x-telepresence-intercept-id:$(telepresence list | grep prod-srv | awk '{print $2}')" \
         http://prod-svc/healthz
    

    若出现 5s 延迟,检查安全组是否放行 UDP 443 端口(STUN),国内 VPC 默认放行。

  5. 退出清理

    telepresence leave prod-srv
    telepresence quit -s
    

    云端 Serverless 容器自动扩容回 1,流量恢复,零 downtime

拓展思考

  1. 多开发者并行
    在 Serverless 场景下,冷启动成本高于节点场景。可给每个开发者分配独立 header 值(如 x-user-id=dev-${工号}),利用 telepresence intercept --match=header 实现流量染色,云端基线容器保持 1 个实例即可,节省 60% 以上费用

  2. CI/CD 集成
    将上述 intercept 命令封装成 GitLab CI Job

    • MR 阶段自动拉起 Telepresence,跑完集成测试用例后上传覆盖率;
    • 使用 –preview-url 生成一次性域名,让测试同学免 VPN 直接访问本地容器,缩短验收周期 1 天
  3. Serverless 冷启动终极优化
    若函数镜像过大(>500 MB),可结合 docker buildx 多阶段 + telepresence 的 --to-pod 模式,把本地编译缓存通过 rsync 增量同步到云端 InitContainer,实现二次启动 <200 ms,满足国内直播、秒杀场景。

  4. 合规场景
    对于等保三级系统,需把 traffic-manager 部署在金融云专属集群,并开启 mTLS 双向证书;本地开发机通过 SSL VPN 专线接入,Telepresence 日志实时推送到阿里云 SLS 审计中心,确保操作可回溯、流量可审计