尽管指定了 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_IDAWS_SECRET_ACCESS_KEY 的值,实际上在 AWS_REGION 中也是如此,region 必须匹配。

如果您使用创建时使用的不同 region 查询数据库,则会收到 Cannot do operations on a non-existent table 错误。

【讨论】:

以上是关于尽管指定了 Kubernetes 部署/服务端口,但连接端口错误的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 负载均衡器服务器连接被拒绝:默认 80 端口正在工作

如何在 Kubernetes 中使用负载均衡器服务公开多个端口

从 docker 容器到 kubernetes pod 的端口发布如何工作?

从 Kubernetes 部署中公开 SCDF 服务

如何配置prometheus kubernetes_sd_configs 指定特定主机端口?

在Play with Kubernetes平台上以测试驱动的方式部署Istio