GKE访问服务

时间:2018-07-24 13:58:30

标签: c# kubernetes ravendb connection-refused

我正在尝试将一个Pod连接到另一个Pod,但是出现连接被拒绝的错误。

我只跑:

  1. RavenDB服务器

    • 部署具有:
      • 端口:
        • containerPort:8080,协议:TCP
        • containerPort:38888,协议:TCP
    • 服务:
      • ravendb-cluster01-service
      • 群集IP:无,端口:8080/38888
  2. RavenDB客户端

    • 连接到ravendb-cluster01-service.staging.svc.cluster.local:8080
      • 尽管失败并显示连接被拒绝错误

什么不起作用:

  • 客户端无法连接到服务器,连接被拒绝

有效的方法:

  • 使用交互式外壳程序docker -it ... -- bash访问客户端窗格时,
    • 我可以ping服务
    • 并远程登录
  • 使用kubectl ... port-forward 8080:8080时,我可以在本地使用数据库服务器,因此该服务器正在运行

奇怪的是,尽管正在运行的脚本本身拒绝连接到目标容器,但是访问泊坞窗时我能够连接到它。

它将Pod连接到Pod,并使用不带服务IP地址的服务标记目标服务器(RavenDB),以将域名解析为Pod的当前IP地址。

知道我在做什么错吗?

完整配置:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: ravendb-cluster01
    tier: backend
  name: ravendb-cluster01
  namespace: staging
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ravendb-cluster01
      tier: backend
  template:
    metadata:
      labels:
        app: ravendb-cluster01
        tier: backend
      name: ravendb-cluster01
      namespace: staging
    spec:
      containers:
      - env:
        - name: RAVEN_ARGS
          value: --ServerUrl=http://ravendb-cluster01-service.staging.svc.cluster.local:8080
            --ServerUrl.Tcp=tcp://ravendb-cluster01-service.staging.svc.cluster.local:38888
            --PublicServerUrl=http://localhost:8080 --PublicServerUrl.Tcp=tcp://localhost:38888
            --DataDir=/ravendb/ --Setup.Mode=None --License.Eula.Accepted=true
        image: ravendb/ravendb-nightly:4.0.6-nightly-20180720-0400-ubuntu.16.04-x64
        name: ravendb
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        - containerPort: 38888
          name: tcp
          protocol: TCP
        resources:
          limits:
            memory: 26000Mi
          requests:
            memory: 26000Mi
        volumeMounts:
        - mountPath: /ravendb/
          name: ravendb-cluster01-storage
      volumes:
      - gcePersistentDisk:
          fsType: ext4
          pdName: ravendb-cluster01-storage
        name: ravendb-cluster01-storage
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: ravendb-cluster01-service
    tier: backend
  name: ravendb-cluster01-service
  namespace: staging
spec:
  clusterIP: None
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
  - name: tcp
    port: 38888
    protocol: TCP
    targetPort: 38888
  selector:
    app: ravendb-cluster01
    tier: backend
  sessionAffinity: None
  type: ClusterIP

2 个答案:

答案 0 :(得分:4)

问题似乎出在您的PublicServerUrl设置上。

--PublicServerUrl=http://localhost:8080 --PublicServerUrl.Tcp=tcp://localhost:38888

根据RavenDB文档:

  

将URL设置为可由客户端和其他节点访问,而不管内部使用哪个IP访问服务器。当通过https URL或在代理服务器后面使用安全连接时,这很有用。

您需要将其配置为服务名称,或者完全删除该选项。在查看了ServerUrl的文档之后,我个人建议将您的args更新为类似以下内容:

value: --ServerUrl=http://0.0.0.0:8080
            --ServerUrl.Tcp=tcp://0.0.0.0:38888
            --PublicServerUrl=http://ravendb-cluster01-service.staging.svc.cluster.local:8080 --PublicServerUrl.Tcp=tcp://ravendb-cluster01-service.staging.svc.cluster.local:38888
            --DataDir=/ravendb/ --Setup.Mode=None --License.Eula.Accepted=true

您希望ServerUrl理想地在所有端口上进行侦听,因此对于PublicUrl而言,将0.0.0.0设置为有意义。

它可以与port-forward以及从本地docker容器一起使用的原因可能是因为RavenDB正在侦听回送设备,并且这两种连接方法都为您提供了容器内部的本地进程,因此回送设备可以访问。

答案 1 :(得分:0)

DB的服务主机名错误,是拼写错误吗?

ravendb-cluster01-service.namespace.svc.cluster.local

-> ravendb-cluster01-service.staging.svc.cluster.local

并且最好检查运行DB Pod的节点主机上的FW规则。