You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置Envoy作为Sidecar的Pod后,如何通过Envoy访问业务容器?

问题排查与解决步骤

1. 先修复Dockerfile的低级错误

你的Dockerfile最后一行文件名拼写不完整,导致镜像构建后Envoy配置文件权限设置失败,修正后重新构建镜像:

FROM envoyproxy/envoy:v1.19.0
COPY envoy.yaml /etc/envoy/envoy.yaml
RUN chmod go+r /etc/envoy/envoy.yaml

执行构建命令:docker build -t envoy:my-test-image .

2. 修正Sidecar的容器类型

你把Envoy放在了initContainers里,而init容器是初始化完成就退出的一次性容器,根本没法作为常驻的Sidecar代理。必须把Envoy移到containers列表,和业务容器并列运行:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: citizenstig/httpbin
          ports:
            - containerPort: 80  # 暴露httpbin默认端口
        - name: envoy-proxy
          image: envoy:my-test-image
          ports:
            - containerPort: 15001  # 暴露Envoy监听端口

3. 确保Envoy配置文件正确

你需要给Envoy配置监听15001端口,并且把请求转发到同Pod内的httpbin容器(同Pod内容器共享网络,直接用localhost:80即可)。示例envoy.yaml配置:

static_resources:
  listeners:
  - name: listener_15001
    address:
      socket_address: { address: 0.0.0.0, port_value: 15001 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: httpbin_service }
          http_filters:
          - name: envoy.filters.http.router
            typed_config: {}
  clusters:
  - name: httpbin_service
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: httpbin_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: localhost, port_value: 80 }
admin:
  access_log_path: "/dev/null"
  address:
    socket_address: { address: 0.0.0.0, port_value: 15000 }

4. 两种测试访问的正确方式

方式一:直接进入Pod测试

  1. 查看运行中的Pod:kubectl get pods -l app=myapp
  2. 进入目标Pod的Envoy容器:kubectl exec -it <pod名称> -c envoy-proxy -- /bin/bash
  3. 在容器内发送请求:curl http://localhost:15001/headers,正常情况下会返回httpbin的headers信息。

方式二:通过LoadBalancer Service访问

你的Service配置没问题,显示8080:30448/TCP是正常现象——30448是集群节点上的NodePort,8080是Service的ClusterIP端口:

  • 如果是本地集群(比如minikube、kind),可以执行minikube service lb-svc获取访问地址,或者直接访问http://<节点IP>:30448/headers
  • 如果是云服务商集群,等待LoadBalancer分配外部IP后,访问http://<外部IP>:8080/headers

5. 排查异常的额外步骤

如果还是访问失败,先确认Envoy是否正常运行:

  • 查看Envoy容器日志:kubectl logs <pod名称> -c envoy-proxy,检查是否有启动报错
  • 查看Pod详情:kubectl describe pod <pod名称>,确认envoy-proxy容器处于Running状态

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:52:35