【问题标题】:Wrong connection port despite Kubernetes deployments/services ports specified尽管指定了 Kubernetes 部署/服务端口,但连接端口错误
【发布时间】: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 之间进行通信?

有什么想法需要在这里做什么吗?

【问题讨论】:

    标签: node.js docker kubernetes amazon-dynamodb terraform


    【解决方案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 错误。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      相关资源
      最近更新 更多