Kubernetes Ingress 上的上游超时(110:连接超时)

Stu*_*haw 5 nginx kubernetes kubernetes-ingress nginx-ingress

我已经设置了 Kubernetes 集群,并且作为设置的一部分,设置了入口规则以将流量转发到 Web 服务器。

\n\n
---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: alpha-ingress\n  annotations:\n    kubernetes.io/ingress.class: nginx\n    certmanager.k8s.io/cluster-issuer: letsencrypt-prod\nspec:\n  tls:\n    - hosts:\n        - alpha.example.com\n      secretName: letsencrypt-prod\n  rules:\n    - host: alpha.example.com\n      http:\n        paths:\n          - backend:\n              serviceName: web\n              servicePort: 80\n
Run Code Online (Sandbox Code Playgroud)\n\n

最终浏览器超时并出现 504 错误,在 Ingress 日志中我看到

\n\n
\n

2019/01/27 23:45:38 [错误] 41#41: *4943 上游超时 (110:\n 连接超时) 从上游读取响应标头,\n 客户端:10.131.24.163,服务器:alpha。 example.com,请求:“GET /\n HTTP/2.0”,上游:“ http://10.244.93.12:80/ ”,主机:\n“alpha.example.com”

\n
\n\n

我在该 IP 地址上没有任何服务...

\n\n
\xe2\x95\xb0\xe2\x94\x80$ kgs --all-namespaces                                                                                                                                                                                                                                                  130 \xe2\x86\xb5\nNAMESPACE       NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE\ndefault         database                        ClusterIP      10.245.181.187   <none>           5432/TCP                     4d8h\ndefault         kubernetes                      ClusterIP      10.245.0.1       <none>           443/TCP                      9d\ndefault         user-api                        ClusterIP      10.245.41.8      <none>           9000/TCP                     4d8h\ndefault         web                             ClusterIP      10.245.145.213   <none>           80/TCP,443/TCP               34h\ningress-nginx   ingress-nginx                   LoadBalancer   10.245.25.107    <external-ip>   80:31680/TCP,443:32324/TCP   50m\nkube-system     grafana                         ClusterIP      10.245.81.91     <none>           80/TCP                       6d1h\nkube-system     kube-dns                        ClusterIP      10.245.0.10      <none>           53/UDP,53/TCP,9153/TCP       9d\nkube-system     prometheus-alertmanager         ClusterIP      10.245.228.165   <none>           80/TCP                       6d2h\nkube-system     prometheus-kube-state-metrics   ClusterIP      None             <none>           80/TCP                       6d2h\nkube-system     prometheus-node-exporter        ClusterIP      None             <none>           9100/TCP                     6d2h\nkube-system     prometheus-pushgateway          ClusterIP      10.245.147.195   <none>           9091/TCP                     6d2h\nkube-system     prometheus-server               ClusterIP      10.245.202.186   <none>           80/TCP                       6d2h\nkube-system     tiller-deploy                   ClusterIP      10.245.11.85     <none>           44134/TCP                    9d\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我查看 ingress pod 上的 resolv.conf 文件,它会返回它应该返回的内容...

\n\n
\xe2\x95\xb0\xe2\x94\x80$ keti -n ingress-nginx nginx-ingress-controller-c595c6896-klw25 -- cat /etc/resolv.conf                                                                                                                                                                                130 \xe2\x86\xb5\nnameserver 10.245.0.10\nsearch ingress-nginx.svc.cluster.local svc.cluster.local cluster.local\noptions ndots:5\n
Run Code Online (Sandbox Code Playgroud)\n\n

dig/nslookup/host 在该容器上不可用,但如果我创建一个简单的 busybox 实例,它会使用相同的配置获得正确的 IP:

\n\n
\xe2\x95\xb0\xe2\x94\x80$ keti busybox -- nslookup web\nServer:    10.245.0.10\nAddress 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local\n\nName:      web\nAddress 1: 10.245.145.213 web.default.svc.cluster.local\n
Run Code Online (Sandbox Code Playgroud)\n\n

谁能给我任何想法下一步要尝试什么?

\n\n

更新#1

\n\n

web这是评论中要求的配置。我还在调查为什么我不能直接使用集群内的 busybox 进行wget任何操作。web

\n\n
apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: web\n    app: web\n  name: web\nspec:\n  ports:\n  - name: "80"\n    port: 80\n    targetPort: 80\n  - name: "443"\n    port: 443\n    targetPort: 443\n  selector:\n    io.kompose.service: web\nstatus:\n  loadBalancer: {}\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  labels:\n    app: web\n  name: web\nspec:\n  replicas: 1\n  strategy:\n    type: RollingUpdate\n  selector:\n    matchLabels:\n      app: web\n  template:\n    metadata:\n      labels:\n        io.kompose.service: web\n        app: web\n    spec:\n      containers:\n      - image: <private docker repo>\n        imagePullPolicy: IfNotPresent\n        name: web\n        resources: {}\n      imagePullSecrets:\n      - name: gcr\nstatus: {}\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新2

\n\n

根据下面 Michael 的评论,它已解析的 IP 地址web是它的端点之一:

\n\n
\xe2\x95\xb0\xe2\x94\x80$ k get endpoints web                                                                                                                                                                                                                                                   130 \xe2\x86\xb5\nNAME      ENDPOINTS                          AGE\nweb       10.244.93.12:443,10.244.93.12:80   2d\n
Run Code Online (Sandbox Code Playgroud)\n

Stu*_*haw 2

所以,这一切都归结为 php-fpm 服务没有任何端点,因为我错误配置了服务选择器!

\n\n

一些眼尖的读者可能已经发现,我的配置是从 docker-compose 配置文件(我的开发环境)转换而来的,我是从那里开始构建的。

\n\n

问题的出现是因为我更改了部署的标签和选择器,但没有更改服务本身。

\n\n
apiVersion: v1\nkind: Service\nmetadata:\n  name: user-api\n  labels:\n    io.kompose.service: user-api\n    app: user-api\nspec:\n  ports:\n    - name: "9000"\n      port: 9000\n      targetPort: 9000\n  selector:\n    io.kompose.service: user-api\nstatus:\n  loadBalancer: {}\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  labels:\n    app: user-api\n  name: user-api\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: user-api\n  template:\n    metadata:\n      labels:\n        app: user-api\n    spec:\n... etc\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以看到我仍在使用 kompose 为我创建的旧选择器,io.kompose.service: user-api而不是较新的选择器app: user-api

\n\n

我遵循了 @coderanger 的建议,虽然 nginx 服务有响应,但 php-fpm 没有响应。

\n\n

快速浏览一下连接应用程序与服务的文档说:

\n\n
\n

如前所述,服务由一组 Pod 支持。这些 Pod 通过端点公开。Service\xe2\x80\x99s 选择器将被持续评估,结果将被 POST 到一个也名为 my-nginx 的 Endpoints 对象。

\n
\n\n

当我检查服务和部署模板的选择器时,我发现它们是不同的,现在它们匹配并且一切都按预期工作。

\n