注入Istio Envoy代理后EKS集群应用无法访问公网求助
问题分析与解决方案
核心问题定位
注入Envoy代理后SSL请求失败,覆盖两类场景:
- S3存储桶域名解析异常指向
es.amazonaws.com - Alpine容器无法通过
apk安装软件包
本质是Istio出站流量拦截后未正确处理外部HTTPS请求,结合未部署出口网关的情况,重点排查Istio出站策略、DNS配置及透明代理规则。
分步解决方案
1. 调整Istio全局出站流量模式
Istio默认outboundTrafficPolicy.mode为REGISTRY_ONLY,仅允许访问Istio注册表内的服务,外部请求会被直接拦截——这是所有SSL请求失败的核心原因。
修改全局配置为ALLOW_ANY,允许Pod直接访问外部服务:
kubectl patch istiooperator installed-state -n istio-system --type merge -p '{"spec":{"meshConfig":{"outboundTrafficPolicy":{"mode":"ALLOW_ANY"}}}}'
2. 修复DNS解析异常问题
S3域名解析错误,大概率是Istio DNS代理与EKS CoreDNS的配置冲突导致,可通过两种方式解决:
方式一:禁用Istio DNS代理
关闭Istio的DNS代理功能,避免干扰集群默认DNS解析:
kubectl patch istiooperator installed-state -n istio-system --type merge -p '{"spec":{"meshConfig":{"dnsRefreshRate":"0s","enableDNSProxy":false}}}'
方式二:配置CoreDNS转发规则
编辑CoreDNS的ConfigMap,确保AWS服务域名能正常解析:
kubectl edit configmap coredns -n kube-system
在Corefile中添加AWS服务域名的转发规则:
aws.local:53 { errors cache 30 forward . /etc/resolv.conf }
3. 验证Alpine容器网络访问
修改出站策略后,重建Alpine Pod测试软件包安装:
kubectl delete pod alpine kubectl apply -f alpine-pod.yaml
查看日志确认结果:
kubectl logs alpine -f
4. 可选:精准配置外部服务访问(无需全局开放)
若不想全局放开出站流量,可针对特定外部服务创建ServiceEntry,例如:
AWS S3相关服务的ServiceEntry
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: aws-s3 namespace: istio-system spec: hosts: - "*.s3.amazonaws.com" - "*.es.amazonaws.com" ports: - number: 443 name: https protocol: HTTPS resolution: DNS location: MESH_EXTERNAL
Alpine软件源的ServiceEntry
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: alpine-repos namespace: istio-system spec: hosts: - "dl-cdn.alpinelinux.org" ports: - number: 443 name: https protocol: HTTPS resolution: DNS location: MESH_EXTERNAL
创建后,即使出站模式为REGISTRY_ONLY,也能正常访问这些服务。
内容的提问来源于stack exchange,提问作者Aksh Sood
相关产品推荐
相关产品推荐

