GKE接入服务

GKE accessing service

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

我只有运行:

  1. RavenDB 服务器

    • 部署有:
      • 端口:
        • 容器端口:8080,协议:TCP
        • 容器端口:38888,协议:TCP
    • 服务:
      • ravendb-cluster01-服务
      • 集群IP:None,端口:8080 / 38888
  2. RavenDB 客户端

    • 连接到 ravendb-cluster01-service.staging.svc.cluster.local:8080
      • 虽然因连接被拒绝错误而失败

什么不起作用:

什么有效:

很奇怪,在访问 docker 时我能够连接到它,尽管 运行ning 脚本本身拒绝连接到目标 pod。

它是将pod连接到pod,并在目标服务器(RavenDB)上打上服务标签,不带服务IP地址,将域名解析为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

DB 的服务主机名错误,是否打错了?

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

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

而且您最好检查运行您的数据库的节点主机上的固件规则 pods。

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

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

根据 RavenDB 文档:

Set the URL to be accessible by clients and other nodes, regardless of which IP is used to access the server internally. This is useful when using a secured connection via https URL, or behind a proxy server.

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

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 理想地监听所有端口,因此设置为 0.0.0.0 对 PublicUrl 有意义。

它与 port-forward 和本地 docker 容器一起工作的原因可能是因为 RavenDB 正在监听环回设备,并且这两种连接方法都为您提供了一个本地进程容器,因此可以访问环回设备。