【问题标题】:Kubernetes how to access application in one namespace from anotherKubernetes 如何从一个命名空间访问另一个命名空间中的应用程序
【发布时间】:2022-11-23 03:12:12
【问题描述】:

我在 kubernetes 集群中启动并运行了以下组件

  • GoLang 应用程序将数据写入命名空间 app1 中的 mongodb statefulset 副本集
  • 在命名空间ng-mongo 中作为有状态集运行的 mongodb 副本集(1 个副本)

我需要做的是,我需要通过 golang 应用程序访问 mongodb 数据库以进行写/读操作,所以我所做的是;

  1. ng-mongo 命名空间中为 mongodb 创建无头服务,如下所示:
    # Source: mongo/templates/svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: mongo
      namespace: ng-mongo
      labels:
        app: mongo
    spec:
      ports:
      - port: 27017
        targetPort: 27017
        name: mongo
      clusterIP: None
      selector:
        role: mongo
    
    1. 然后我部署了 mongodb statefulset 并初始化了副本集,如下所示:
    kubectl exec -it mongo-0 -n ng-mongo mongosh
    rs.initiate({_id: "rs0",members: [{_id: 0, host: "mongo-0"}]})
    
    
    // gives output 
    { ok: 1 }
    
    1. 然后我在 app1 命名空间中创建了一个 ExternalName 服务,链接上面步骤 1 中的 mongo 服务,如下所示:
    # Source: app/templates/svc.yaml
    kind: Service
    apiVersion: v1
    metadata:
      name: app1
      namespace: app1
    spec:
      type: ExternalName
      externalName: mongo.ng-mongo.svc.cluster.local
      ports:
      - port: 27017
    
    1. 最后,我按如下方式检测了我的golang 应用程序;
    // Connection URI 
    const mongo_uri = "mongodb://app1" <-- Here I used the app1, as the ExternalName service's name is `app1`
    
    <RETRACTED-CODE>
    

    然后我运行了应用程序,并检查了日志。这是我发现的:

    2022/11/22 12:49:47 服务器选择错误:服务器选择超时,当前拓扑:{ 类型:ReplicaSetNoPrimary,服务器:[{ 地址:mongo-0:27017,类型:未知,最后一个错误:发生连接()错误在连接握手期间:拨打 tcp:在 10.96.0.10:53 上查找 mongo-0:没有这样的主机},]}

    更新:我没有为 mongodb 设置任何用户名或密码

    有人可以帮助我为什么会这样吗?

【问题讨论】:

    标签: mongodb go kubernetes


    【解决方案1】:

    根据我对你正在尝试做的事情的理解,

    您需要在app1 命名空间而不是ng-mongo 上创建app1 ExternalName 服务。 (app/templates/svc.yaml)

    这是因为您的 golang 应用程序运行在 app1 命名空间上,只有当 Pod 和 Services 在同一命名空间中时,才可以省略后缀“.svc.cluster.local”。

    在您的示例中,app1 服务现在位于 ng-mongo 命名空间,因此您的 golang 应用程序无法访问 app1 域,并且 mongo_uri 应设置为 mongodb://app1.ng-mongo.svc.cluster.local(使用 FQDN)。

    希望这对你有帮助。

    【讨论】:

    • 嗨 Devin,抱歉,这是一个错误,app1 ExternalName 服务已经在 app1 命名空间中,我更新了我的问题。
    • 哦,知道了。只是为了进一步澄清,
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多