8

在某些情况下,我们的服务在尝试访问它们时没有得到响应。例如,Chrome 显示 ERR_EMPTY_RESPONSE,偶尔我们也会遇到其他错误,比如 408,我相当肯定它是从 ELB 返回的,而不是我们的应用程序本身。

经过长时间的调查,包括通过 ssh 连接到节点本身、试验负载均衡器等等,我们仍然不确定问题实际存在于哪一层:要么是 Kubernetes 本身,要么是来自 Amazon EKS(ELB 或否则)

  • 似乎只有节点的实例(数据)端口是有问题的端口。这些问题似乎时断时续,这让我们相信这在我们的 kubernetes manifest 或 docker 配置中并不明显,而是在底层基础设施中的其他东西。有时服务和吊舱会工作,但回来早上它就会坏掉。这使我们相信问题源于 Kubernetes 中 pod 的重新分配,可能是由 AWS 中的某些东西(负载均衡器更改、自动缩放组更改等)或 Kubernetes 本身在出于其他原因重新分配 pod 时触发的。
  • 在我们看到的所有情况下,健康检查端口都继续正常工作,这就是为什么 kubernetes 和 aws 都认为一切正常并且不报告任何故障的原因。
  • 我们已经看到一个节点上的一些 pod 可以工作,而另一些则不能在同一个节点上工作。
  • 我们已经验证 kube-proxy 正在运行,并且 iptables-save 输出在两个正在工作的 Pod 之间是“相同的”。(这意味着所有不是唯一的东西,比如 ip 地址和端口都是相同的,并且与它们应该相互关联的内容一致)。(我们使用这些说明来帮助这些说明:https ://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#is-the-kube-proxy-working
  • 通过节点本身的 ssh,对于失败的 pod,我们可以通过预期的所有可能的 ip/端口访问该 pod(即应用程序本身)。
    • 10. 节点本身的地址,在实例数据端口上。
    • 10. pod(docker容器)在应用端口上的地址。
    • 172.地址的???在应用程序端口上(我们不确定该 ip 是什么,或者 ip 路由如何到达它,因为它与 docker0 接口的 172 地址是不同的子网)。
  • 从另一个节点上的 ssh,对于失败的 pod,我们无法在任何端口 (ERR_EMPTY_RESPONSE) 上访问失败的 pod。这似乎与服务/负载均衡器的行为相同。

还有什么可能导致这样的行为?

4

2 回答 2

3

经过大量调查,我们解决了许多问题: * 我们的应用程序并不总是按照我们预期的方式运行。总是先检查一下。* 在我们的 Kubernetes 服务清单中,我们设置了externalTrafficPolicy: Local,这可能应该可以工作,但给我们带来了问题。(这是使用 Classic Load Balancer)service.beta.kubernetes.io/aws-load-balancer-type: "clb"。因此,如果您在使用 CLB 时遇到问题,请删除externalTrafficPolicy或明确将其设置为默认的“集群”值。

所以我们的清单现在是: kind: Service apiVersion: v1 metadata: name: apollo-service annotations: service.beta.kubernetes.io/aws-load-balancer-type: "clb" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:REDACTED" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
spec: externalTrafficPolicy: Cluster selector: app: apollo ports: - name: http protocol: TCP port: 80 targetPort: 80 - name: https protocol: TCP port: 443 targetPort: 80 type: LoadBalancer

于 2018-09-20T14:37:00.440 回答
1

添加

service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"

为我解决了这个问题

于 2019-09-18T23:36:01.683 回答