【发布时间】:2021-03-06 08:51:40
【问题描述】:
我正在尝试使用 kubernetes 部署 gRPC 服务器,并在集群外部连接到它。 服务器相关部分:
function main() {
var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;
var server = new grpc.Server();
server.addService(hello_proto.Greeter.service, {sayHello: sayHello});
const url = '0.0.0.0:50051'
server.bindAsync(url, grpc.ServerCredentials.createInsecure(), () => {
server.start();
console.log("Started server! on " + url);
});
}
function sayHello(call, callback) {
console.log('Hello request');
callback(null, {message: 'Hello ' + call.request.name + ' from ' + require('os').hostname()});
}
这里是客户端的相关部分:
function main() {
var target = '0.0.0.0:50051';
let pkg = grpc.loadPackageDefinition(packageDefinition);
let Greeter = pkg.helloworld["Greeter"];
var client = new Greeter(target,grpc.credentials.createInsecure());
var user = "client";
client.sayHello({name: user}, function(err, response) {
console.log('Greeting:', response.message);
});
}
当我使用 nodeJS 手动运行它们时,以及在 docker 容器中运行服务器时(客户端仍然在没有容器的情况下使用 node 运行),它工作得很好。
带有命令的docker文件:docker run -it -p 50051:50051 helloapp
FROM node:carbon
# Create app directory
WORKDIR /usr/src/appnpm
COPY package.json .
COPY package-lock.json .
RUN npm install
COPY . .
CMD npm start
但是,当我使用 kubernetes 部署服务器时(同样,客户端不在容器中运行),我无法连接。
yaml文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloapp
spec:
replicas: 1
selector:
matchLabels:
app: helloapp
strategy: {}
template:
metadata:
labels:
app: helloapp
spec:
containers:
image: isolatedsushi/helloapp
name: helloapp
ports:
- containerPort: 50051
name: helloapp
resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
name: helloservice
spec:
selector:
app: helloapp
ports:
- name: grpc
port: 50051
targetPort: 50051
部署和服务启动正常
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helloservice ClusterIP 10.105.11.22 <none> 50051/TCP 17s
kubectl get pods
NAME READY STATUS RESTARTS AGE
helloapp-dbdfffb-brvdn 1/1 Running 0 45s
但是当我运行客户端时,它无法访问服务器。
任何想法我做错了什么?
【问题讨论】:
-
原来我必须使用 minikube 服务 helloservice 运行它,然后使用它吐出的 IP 没有 http 部分。然后它起作用了,我不知道为什么我必须这样做......
-
@Jakub 1. 客户端确实位于我的本地电脑上。 2. 它给出一个错误:代码 14,详细信息:''目标 dns 的名称解析失败:127.0.0.1:65065'。我不明白的是,当我使用 nodePort 时,比如说 30007,它也不会让我连接到 grpc 服务器。
-
是的,http 部分是不可能的。关于其余的,它像以前一样工作。当我使用命令
kubectl -n hellospace port-forward svc/helloservice 8080:50051转发时,它也可以工作
标签: node.js docker kubernetes grpc