尽管指定了 Kubernetes 部署/服务端口,但连接端口错误
Posted
技术标签:
【中文标题】尽管指定了 Kubernetes 部署/服务端口,但连接端口错误【英文标题】:Wrong connection port despite Kubernetes deployments/services ports specified 【发布时间】:2021-12-23 12:45:07 【问题描述】:可能需要一些时间来解释我要做什么,但请耐心等待。
我指定了以下基础架构:
我有一份名为 questo-server-deployment
的工作(我知道,令人困惑,但这是在不使用 minikube 上的入口的情况下访问部署的唯一方法)
这就是各部分应该如何相互交流:
here 你可以找到上述设置的整个 Kubernetes/Terraform 配置文件
我有 2 个端点从 node.js
应用程序 (questo-server-deployment
) 中暴露出来
我使用10.97.189.215
发出请求,这是questo-server-service
外部IP 地址(如您在第一张图片中所见)
所以我有 2 个端点:
health - 它只是从node.js
应用程序返回200 OK
- 这部分很好地确认了节点应用程序按预期工作。
dynamodb - 它应该能够向questo-dynamodb-deployment
(pod) 发送请求并得到响应,但它不能。
当我打印环境变量时,我得到以下信息:
➜ kubectl -n minikube-local-ns exec questo-server-deployment--1-7ptnz -- printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=questo-server-deployment--1-7ptnz
DB_DOCKER_URL=questo-dynamodb-service
DB_REGION=local
DB_SECRET_ACCESS_KEY=local
DB_TABLE_NAME=Questo
DB_ACCESS_KEY=local
QUESTO_SERVER_SERVICE_PORT_4000_TCP=tcp://10.97.189.215:4000
QUESTO_SERVER_SERVICE_PORT_4000_TCP_PORT=4000
QUESTO_DYNAMODB_SERVICE_SERVICE_PORT=8000
QUESTO_DYNAMODB_SERVICE_PORT_8000_TCP_PROTO=tcp
QUESTO_DYNAMODB_SERVICE_PORT_8000_TCP_PORT=8000
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
QUESTO_SERVER_SERVICE_SERVICE_HOST=10.97.189.215
QUESTO_SERVER_SERVICE_PORT=tcp://10.97.189.215:4000
QUESTO_SERVER_SERVICE_PORT_4000_TCP_PROTO=tcp
QUESTO_SERVER_SERVICE_PORT_4000_TCP_ADDR=10.97.189.215
KUBERNETES_PORT_443_TCP_PROTO=tcp
QUESTO_DYNAMODB_SERVICE_PORT_8000_TCP=tcp://10.107.45.125:8000
QUESTO_DYNAMODB_SERVICE_PORT_8000_TCP_ADDR=10.107.45.125
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
QUESTO_SERVER_SERVICE_SERVICE_PORT=4000
QUESTO_DYNAMODB_SERVICE_SERVICE_HOST=10.107.45.125
QUESTO_DYNAMODB_SERVICE_PORT=tcp://10.107.45.125:8000
KUBERNETES_SERVICE_PORT_HTTPS=443
NODE_VERSION=12.22.7
YARN_VERSION=1.22.15
HOME=/root
所以看起来配置知道 dynamodb 地址和端口:
QUESTO_DYNAMODB_SERVICE_PORT_8000_TCP=tcp://10.107.45.125:8000
您还会在我指定的上述环境变量中注意到:
DB_DOCKER_URL=questo-dynamodb-service
这应该是我分配给配置here(在配置映射中)的questo-dynamodb-service
url:port,然后在questo-server-deployment
(作业)中使用here
另外,当我登录时:
kubectl logs -f questo-server-deployment--1-7ptnz -n minikube-local-ns
我得到以下结果:
这表明应用程序 (node.js) 尝试连接到数据库 (dynamodb) 但使用了错误的端口 443
而不是 8000
?
DB_DOCKER_URL
应包含questo-dynamodb-service
的完整地址(带端口)
我在这里做错了什么?
编辑----
我已按照答案中的建议将端口8000
明确分配给DB_DOCKER_URL
,但现在我收到以下错误:
在我看来,Kubernetes 中存在某种默认行为,它尝试使用 https
在 pod 之间进行通信?
有什么想法需要在这里做什么吗?
【问题讨论】:
【参考方案1】:如何在 ConfigMap 中指定端口:
...
data =
DB_DOCKER_URL = $kubernetes_service.questo_dynamodb_service.metadata.0.name:8000
...
否则可能默认为 443。
【讨论】:
嘿,感谢您花时间回答,我已经用另一个问题更新了这个问题,在我看来,豆荚正在尝试使用https
协议进行通信?从应用您的建议后的错误来看,pod 似乎正试图找到一个显然不存在的 ssl
证书。它还将解释为什么它首先尝试使用443
。有没有办法告诉 Kubernetes 只使用 http?【参考方案2】:
回答我自己的问题,以防万一有人有同样出色的想法在 minikube
集群中运行 local dybamodb
。
问题不仅出在port
上,还出在protocol
上,所以问题的最终答案是修改ConfigMap
如下:
data =
DB_DOCKER_URL = "http://$kubernetes_service.questo_dynamodb_service.metadata.0.name:8000"
...
附注:
此外,当您运行各种脚本以在 amazon/dynamodb-local
容器中创建 dynamodb
表时,请确保使用相同的 region
来创建表,如下所示:
#!/bin/bash
aws dynamodb create-table \
--cli-input-json file://questo_db_definition.json \
--endpoint-url http://questo-dynamodb-service:8000 \
--region local
和查询数据时相同的region
。
即使这只是一个本地副本,您也可以在其中键入任何您想要的值作为 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
的值,实际上在 AWS_REGION
中也是如此,region
必须匹配。
如果您使用创建时使用的不同 region
查询数据库,则会收到 Cannot do operations on a non-existent table
错误。
【讨论】:
以上是关于尽管指定了 Kubernetes 部署/服务端口,但连接端口错误的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 负载均衡器服务器连接被拒绝:默认 80 端口正在工作
如何在 Kubernetes 中使用负载均衡器服务公开多个端口
从 docker 容器到 kubernetes pod 的端口发布如何工作?