【问题标题】:kubernetes nginx upstream server as service not foundkubernetes nginx 上游服务器作为服务未找到
【发布时间】:2023-11-25 17:56:01
【问题描述】:

这些是here (kubernetes.io/docs)引用的我的yaml文件

deployment gists

我使用命令kubectl apply -f backend-deployment.yaml -f frontend-configmap.yaml -f frontend-deployment.yaml

后端启动成功,但前端出现错误。

[emerg] 1#1: host not found in upstream "backend-service" in /etc/nginx/conf.d/nginx.conf:2
#nginx: [emerg] host not found in upstream "backend-service" in /etc/nginx/conf.d/nginx.conf:2

即使声明了'backend-service',nginx也无法识别它。

命令nslookup backend-service 结果是:

Server:         127.0.0.53
Address:        127.0.0.53#53

** server can't find backend-service: SERVFAIL

我错过了什么?

【问题讨论】:

  • “kubectl get pods”和“kubectl get svc”和“kubectl get endpoints”的输出是什么?
  • @meaningqo 圣洁....对不起,工作节点已关闭....重启后,我会评论
  • 我对该输出有点困惑,因为后端服务显示类型为 ClusterIP,但没有分配 clusterIp。但是,您的 yaml 配置文件会为您的后端服务输入 nodeport。我试图在 minikube 上重现你的问题,但是我没有使用你的私有图像,所以我使用默认的 nginx 和 mysql 图像作为前端/后端。
  • @MikołajGłodziak 哦,是的。我写了答案。原因是 kube-system 中的 coredns。 Node.js交出主机访问Mysql但不识别,以为服务的地址没有管理。于是查看了coredns的日志,有错误,重启后也没有错误。然后,后端连接mysql没有任何问题,前端能够正常识别后端服务。

标签: nginx kubernetes


【解决方案1】:

我已经更接近问题/解决方案了。

首先,如果您提供的答案中的图像是正确的,那么您在后端部署中运行 nginx,在前端部署中运行 node-js 服务器。这是一个错误。

更改图像后,前端正在运行(如预期的那样)但后端 pod 正在崩溃。

但是,后端 pod 已成功将 mysql-service 解析为其内部 clusterIp,而我的身份验证设置似乎有误。

`> server@1.0.0 start /usr/src/app
 > node backend.js
 
 (node:18) Warning: Accessing non-existent property 'count' of module exports inside circular dependency
 (Use `node --trace-warnings ...` to show where the warning was created)
 (node:18) Warning: Accessing non-existent property 'findOne' of module exports inside circular dependency
 (node:18) Warning: Accessing non-existent property 'remove' of module exports inside circular dependency
 (node:18) Warning: Accessing non-existent property 'updateOne' of module exports inside circular dependency
 listening on 3000
 events.js:292
       throw er; // Unhandled 'error' event
       ^
 
 Error: connect ECONNREFUSED 10.100.77.32:3306
     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1142:16)
     --------------------
     at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
     at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
     at Connection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:116:18)
     at Object.<anonymous> (/usr/src/app/backend.js:58:12)
     at Module._compile (internal/modules/cjs/loader.js:1185:30)
     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1205:10)
     at Module.load (internal/modules/cjs/loader.js:1034:32)
     at Function.Module._load (internal/modules/cjs/loader.js:923:14)
     at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
     at internal/main/run_main_module.js:17:47
 Emitted 'error' event on Connection instance at:
     at Connection._handleProtocolError (/usr/src/app/node_modules/mysql/lib/Connection.js:423:8)
     at Protocol.emit (events.js:315:20)
     at Protocol._delegateError (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:398:10)
     at Handshake.<anonymous> (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:153:12)
     at Handshake.emit (events.js:315:20)
     at Handshake.Sequence.end (/usr/src/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:78:12)
     at Protocol.handleNetworkError (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:369:14)
     at Connection._handleNetworkError (/usr/src/app/node_modules/mysql/lib/Connection.js:418:18)
     at Socket.emit (events.js:315:20)
     at emitErrorNT (internal/streams/destroy.js:96:8)
     at emitErrorCloseNT (internal/streams/destroy.js:68:3)
     at processTicksAndRejections (internal/process/task_queues.js:84:21) {
   errno: -111,
   code: 'ECONNREFUSED',
   syscall: 'connect',
   address: '10.100.77.32',
   port: 3306,
 > node backend.js
   fatal: true
 }
 npm ERR! code ELIFECYCLE
 npm ERR! errno 1
 npm ERR! server@1.0.0 start: `node backend.js`
 npm ERR! Exit status 1
 npm ERR! 
 npm ERR! Failed at the server@1.0.0 start script.
 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
 
 npm ERR! A complete log of this run can be found in:
 npm ERR!     /root/.npm/_logs/2021-07-21T08_46_32_833Z-debug.log`

如果您查看日志。它说它试图连接到 10.100.77.32:3306 并且 kubectl get svc 的输出如下mysql-service ClusterIP 10.100.77.32 &lt;none&gt; 3306/TCP 17m

与我的服务的匹配 ip。

kubectl get endpoints 表明 mysql-service 确实找到了一个端点:

mysql-service      ClusterIP   10.100.77.32     <none>        3306/TCP       17m

这里是额外的日志信息,显示您的 nodejs 应用程序的身份验证机制似乎不适用于 mysql pod。

  Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (/usr/src/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
    at Handshake.ErrorPacket (/usr/src/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)
    at Protocol._parsePacket (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/usr/src/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/usr/src/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
    at Protocol.write (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
    at Socket.<anonymous> (/usr/src/app/node_modules/mysql/lib/Connection.js:88:28)
    at Socket.<anonymous> (/usr/src/app/node_modules/mysql/lib/Connection.js:526:10)
    at Socket.emit (events.js:315:20)
    at addChunk (_stream_readable.js:296:12)
    at readableAddChunk (_stream_readable.js:272:9)
    at Socket.Readable.push (_stream_readable.js:213:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23)
    --------------------
    at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
    at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
    at Connection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:116:18)
    at Object.<anonymous> (/usr/src/app/backend.js:58:12)
    at Module._compile (internal/modules/cjs/loader.js:1185:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1205:10)
    at Module.load (internal/modules/cjs/loader.js:1034:32)
    at Function.Module._load (internal/modules/cjs/loader.js:923:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
Emitted 'error' event on Connection instance at:
    at Connection._handleProtocolError (/usr/src/app/node_modules/mysql/lib/Connection.js:423:8)
    at Protocol.emit (events.js:315:20)
    at Protocol._delegateError (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:398:10)
    at Handshake.<anonymous> (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:153:12)
    at Handshake.emit (events.js:315:20)
    at Handshake.Sequence.end (/usr/src/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:78:12)
    at Handshake.ErrorPacket (/usr/src/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:125:8)
    at Protocol._parsePacket (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    [... lines matching original stack trace ...]
    at readableAddChunk (_stream_readable.js:272:9) {
  code: 'ER_NOT_SUPPORTED_AUTH_MODE',
  errno: 1251,
  sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',
  sqlState: '08004',
  fatal: true
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! server@1.0.0 start: `node backend.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the server@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2021-07-21T08_55_22_133Z-debug.log

但是,随着答案开头所建议的更改,应该解决有关解析服务名称和在 kubernetes 内部通信的问题。

【讨论】:

【解决方案2】:

后端部署镜像:bateaux/test-nginx

前端部署映像:bataux/test-node-server

在部署 backend-deployment 时,移除 [livenessProbe, readinessProbe]。

因为node.js express server使用@cloudnative/health-connect来做readinessProbe,所以调用PingCheck(worker node ip)。

【讨论】:

  • holy.....如果移除 [livenessProbe, readinessProbe],则没有上游错误。又出现一个错误hhhhh。很有希望。
  • 看起来类似于我尝试设置的输出。后端不记录任何内容,但已启动并运行。由于连接被拒绝尝试连接到 127.0.0.1:3306 上的 mysql,前端卡在 crashloopbackoff 中,请参阅gist.github.com/fhochleitner/a4d3d826ba5863b666541318e0fce258
  • 这个问题有两件事:你的 mysql-service 仍然处于待处理状态,因为你使用的是 LoadBalancer 类型。此类型仅适用于云环境或当您自己部署了配置外部负载均衡器的东西时。我想mysql应该只能从你的集群内部访问。您能否尝试将此服务类型更改为类型:ClusterIP 并删除服务的 NodePort 部分(如果已为其分配端口)。
  • @meaningqo 我删除了服务类型,nodePort。但错误仍然存​​在。
  • 您是否也将其更改为类型:ClusterIP?看来您的 backend.js 正在将 mysql-service 解析为 127.0.0.1 ,但事实并非如此。还是您将其定义为 127.0.0.1 或其他地方的 localhost?
【解决方案3】:

哇....我找到了getaddrinfo EAI_AGAIN mysql-service 的解决方案。

我认为如果网络找不到服务,则 dns 有错误。

kubectl logs --namespace=kube-system -l k8s-app=kube-dns

命令的结果是gist

所以...我终于找到了这个关于 kubernetes coredns 的link

根据belphegor的回答,它可以重新启动coredns。

虽然有新错误Client does not support authentication protocol requested by server; consider upgrading MySQL client,但我认为解决它比 dns 错误更容易。哈哈哈哈哈哈哈哈哈

【讨论】:

    最近更新 更多