【问题标题】:grpc in k8s cannot resolve service dns namek8s 中的 grpc 无法解析服务 dns 名称
【发布时间】:2019-05-06 13:37:04
【问题描述】:

我正在使用节点 js 尝试在 kubernetes 集群环境中运行 grpc。没有 kubernetes 的 localy 工作正常。服务器端正在监听:'0.0.0.0:80',客户端尝试通过:http://recommended-upgrades-qa-int 连接。在 kuberenets 中,我收到以下错误:

ERROR failed to get via grpc the getRecommended Error: 14 UNAVAILABLE: Connect Failed endpoint:http://<K8S_SERVICE_NAME>
ERROR: Recommendations fetch error: Error: 14 UNAVAILABLE: Connect Failed severity=error, message=failed to get via grpc the getRecommended Error: 14 UNAVAILABLE: Connect Failed endpoint:http://<K8S_SERVICE_NAME>

服务器端:

const connectionHost = this.listenHost + ':' + this.listenPort;
server.bind(connectionHost, grpc.ServerCredentials.createInsecure());
logger.info(`Server running at ${connectionHost}`);
server.start();

客户端:

RecommendedService = grpc.load(__dirname + '/../../node_modules/@zerto/lib-service-clients/Output/sources/recommendedClient.proto').RecommendedService;
        } catch (error){
            console.log(error);
        }

        this.client = RecommendedService && new RecommendedService(grpcAddress, grpc.credentials.createInsecure());

清单文件:

服务器端

apiVersion: apps/v1
kind: Deployment
metadata:
  name: server-side-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: server-side-deployment
  replicas: 1
  template:
    metadata:
      labels:
        app: server-side-deployment
    spec:
      containers:
      - name: server-side-deployment
        image: (DOCKER_IMAGE_PATH)
        imagePullPolicy: Always
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: recommended-upgrades-qa-int
  namespace: default
spec:
  selector:
      app: server-side-deployment
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      name: http

客户端

apiVersion: apps/v1
kind: Deployment
metadata:
  name: client-side-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: client-side-deployment
  replicas: 1
  template:
    metadata:
      labels:
        app: client-side-deployment
    spec:
      containers:
      - name: client-side-deployment
        image: (DOCKER_IMAGE_PATH)
        imagePullPolicy: Always
        env:
          - name: RECOMANDED_SERVICE
            value: http://recommended-upgrades-qa-int
        ports:
        - containerPort: 80

【问题讨论】:

  • 您的客户端是否在服务器的同一命名空间中运行?

标签: node.js kubernetes grpc


【解决方案1】:

来自docs

“正常”(非无头)服务被分配了一个 DNS A 记录,其名称格式为 my-svc.my-namespace.svc.cluster.local。这将解析为 Service 的集群 IP。

您的问题可能是在您的服务位于另一个命名空间时唱歌 &lt;service name&gt;。尝试使用:

<service name>.<service namespace>.svc.cluster.local

【讨论】:

  • 服务在同一个命名空间中
  • 还检查了与 telnet 和 curl 的连接,它正在响应。只有 grpc 不工作
  • 在我的问题中参见上面的客户端和服务器清单文件
  • 嗯,它看起来不错,但你能检查recommended-upgrades-qa-int:80而不是http://recommended-upgrades-qa-int吗?您确定在您的容器内部网络已正确完成以使其正常工作吗?
【解决方案2】:

看来我们想通了。首先 url 必须包含端口 80 并且服务器服务中存在内部未捕获的异常,这可能导致它无法工作。 谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2020-01-20
    • 2017-04-06
    相关资源
    最近更新 更多