Istio Proxy 无法连接到 EKS 上的 Istio Pilot

Istio Proxy unable to connect to Istio Pilot on EKS

我已经按照说明在EKS上安装了bookinfo here and here

在验证应用程序是否已正确安装时,我在尝试调出产品页面时收到 000。检查我的网络连接后 VPC/Subnets/Routing/SecurityGroups,我将问题缩小为一个 istio 网络问题。

经过进一步调查,我登录到产品页面的 istio-sidecar 容器并注意到以下错误。

[2019-01-21 09:06:01.039][10][warning][upstream] external/envoy/source/common/config/grpc_mux_impl.cc:41] Unable to establish new stream
[2019-01-21 09:06:28.150][10][warning][upstream] external/envoy/source/common/config/grpc_mux_impl.cc:240] gRPC config stream closed: 14, no healthy upstream

这让我注意到 istio-proxy 指向 istio-pilot.istio-system:15007 地址以供发现。唯一奇怪的是,kubernetes istio-pilot.istio-system 服务似乎没有暴露端口 15007,如下所示。

[procyclinsur@localhost Downloads]$ kubectl get svc istio-pilot --namespace=istio-system
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                 AGE
istio-pilot   ClusterIP   172.20.185.72   <none>        15010/TCP,15011/TCP,8080/TCP,9093/TCP   1d

事实上 none 来自 istio-system 命名空间的服务似乎公开了该端口。 我假设这个 istio-pilot.istio-system 地址是用于 gRPC 的地址,并且想知道如何解决这个问题,因为它似乎指向了错误的地址;如有错误请指正

相关日志

istio-代理

2019-01-21T09:04:58.949152Z info    Version root@6f6ea1061f2b-docker.io/istio-1.0.5-c1707e45e71c75d74bf3a5dec8c7086f32f32fad-Clean
2019-01-21T09:04:58.949283Z info    Proxy role: model.Proxy{ClusterID:"", Type:"sidecar", IPAddress:"10.20.228.89", ID:"productpage-v1-54b8b9f55-jpz8g.default", Domain:"default.svc.cluster.local", Metadata:map[string]string(nil)}
2019-01-21T09:04:58.949971Z info    Effective config: binaryPath: /usr/local/bin/envoy
configPath: /etc/istio/proxy
connectTimeout: 10s
discoveryAddress: istio-pilot.istio-system:15007
discoveryRefreshDelay: 1s
drainDuration: 45s
parentShutdownDuration: 60s
proxyAdminPort: 15000
serviceCluster: productpage
zipkinAddress: zipkin.istio-system:9411

向您发送 link 到 the Istio docs,这在调试 Istio 时可能非常有用。

要验证 Istio 是否正常工作,请从另一个 pod 向 productpage 发送请求,例如来自 ratings:

kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"

输出应该是:<title>Simple Bookstore App</title>

如果您获得正确的输出,则问题可能出在您的 Ingress 定义上。

仔细验证您是否遵循了指定的步骤here and here

忽略它们没有意义的 gRPC 警告。确保你做了 kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

如果你这样做 kubectl exec $(kubectl get pod --selector app=ratings --output jsonpath='{.items[0].metadata.name}') -c istio-proxy -- ps -ef 你会看到这样的条目 --discoveryAddress istio-pilot.istio-system:15011。这是 Sidecar 使用的地址 联系 Pilot 并且应该匹配您看到的条目 使用 kubectl -n istio-system get service istio-pilot.

如果 discoveryAddress 与 Pilot 端口匹配,您可以测试网络。您不能轻易地 curl 发现地址,但是如果您这样做 kubectl exec $(kubectl get pod --selector app=ratings --output jsonpath='{.items[0].metadata.name}') -c istio-proxy -- curl https://istio-pilot.istio-system:15011 并且出现超时,那么就会出现通信问题。

发现地址来自Istio配置。如果您这样做 kubectl -n istio-system get cm istio-sidecar-injector 并且年龄早于您的 Istio 安装,则升级较旧的 Istio 版本可能存在问题。

我想post解决我的问题。

问题:

EKS DNS 无法正常工作,这就是 none 其他解决方案(虽然非常好!!)对我有用的原因。

原因:

首次创建 AWS VPC 时,没有为 EKS 正确设置 VPC DNS 设置。 EKS 需要启用以下 VPC 设置。

  • DNS 解析:已启用
  • DNS 主机名:已禁用<-- Default VPC Settings

解法:

DNS hostnames 设置为 Enabled,DNS 开始按预期工作。