配置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测试
- 查看运行中的Pod:
kubectl get pods -l app=myapp - 进入目标Pod的Envoy容器:
kubectl exec -it <pod名称> -c envoy-proxy -- /bin/bash - 在容器内发送请求:
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
相关产品推荐
相关产品推荐

