【问题标题】:Kubernetes : Cannot interconnect pod in microservice applicationKubernetes:无法在微服务应用程序中互连 pod
【发布时间】:2020-09-11 17:47:24
【问题描述】:

我正在开发一个微服务应用程序,但我无法将我的 React 连接到我的后端 api pod。

由于我使用的是 ServerSideRendering,所以请求将是内部的,因此当页面首先加载时,客户端 pod 直接连接到后端 pod。 我也在使用 ingress-nginx 在内部连接它们。

端点(来自 React pod --> Express pod):

http://ingress-nginx-controller.ingress-nginx.svc.cluster.local

入口详情:

$ kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.245.81.11   149.69.37.110   80:31702/TCP,443:31028/TCP   2d1h

入口配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
    name: ingress-service 
    annotations: 
        kubernetes.io/ingress.class: nginx 
        nginx.ingress.kubernetes.io/use-regex: 'true'
spec: 
    rules: 
        - host: cultor.dev 
          http: 
            paths:
                - path: /api/users/?(.*) 
                  backend: 
                    serviceName: auth-srv 
                    servicePort: 3000
                - path: /?(.*) 
                  backend: 
                    serviceName: client-srv 
                    servicePort: 3000

入口日志:

[error] 1230#1230: *1253654 broken header: "GET /api/users/currentuser HTTP/1.1

另外,我无法从 客户端 pod 内部 ping ingress-nginx-controller.ingress-nginx.svc.cluster.local


额外日志

$ kubectl get ns
NAME              STATUS   AGE
default           Active   2d3h
ingress-nginx     Active   2d1h
kube-node-lease   Active   2d3h
kube-public       Active   2d3h
kube-system       Active   2d3h

#####

$ kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
auth-mongo-srv   ClusterIP   10.245.155.193   <none>        27017/TCP   6h8m
auth-srv         ClusterIP   10.245.1.179     <none>        3000/TCP    6h8m
client-srv       ClusterIP   10.245.100.11    <none>        3000/TCP    6h8m
kubernetes       ClusterIP   10.245.0.1       <none>        443/TCP     2d3h

更新: 入口日志:

[error] 1230#1230: *1253654 broken header: "GET /api/users/currentuser HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
host: cultor.dev
x-request-id: 5cfd15996dc8481114b39a16f0be5f06
x-real-ip: 45.248.29.8
x-forwarded-for: 45.248.29.8
x-forwarded-proto: https
x-forwarded-host: cultor.dev
x-forwarded-port: 443
x-scheme: https
cache-control: max-age=0
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: en-US,en-IN;q=0.9,en;q=0.8,la;q=0.7

【问题讨论】:

  • 我认为您需要有另一个 ClusterIP 类型的服务来 ping,因为 LB 用于外部访问。

标签: kubernetes microservices google-kubernetes-engine kubernetes-ingress


【解决方案1】:

这是在将 Ingress 负载平衡器与 Digitalocean 结合使用作为代理以通过负载平衡器在内部连接 ​​pod 时的一个错误:

解决方法

自定义主机名(在您选择的提供商处)的 DNS 记录必须设置为指向负载平衡器的外部 IP 地址。之后,必须指示 digitalocean-cloud-controller-manager 通过在 service.beta.kubernetes.io/do 中指定主机名,在服务入口状态字段 status.Hostname 中返回自定义主机名(而不是外部 LB IP 地址) -loadbalancer-hostname 注释。然后客户端可以连接到主机名以从集群内部访问负载均衡器。

Full official explaination of this bug

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2016-04-28
    • 2018-08-18
    • 2021-01-02
    • 2020-08-04
    • 2022-01-06
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多