【发布时间】:2019-08-29 06:32:21
【问题描述】:
我正在本地环境中使用 Kubernetes 创建一个简单的 grpc 示例。
当 nodejs 向 pythonservice 发出请求时,pythonservice 会以 helloworld 响应并显示在网页上。
但是,pythonservice 的 clusterip 可以访问,但http://pythoservice:8000 不可用。
可能是coredns有问题,所以查了很多东西,删除了kube-system的kube-dns服务。
如果你用 nslookup 检查pythonservice.default.svc.cluster.local,你会看到与 pythonservice 的 clusterip 不同的地址。
对不起,我英语不好
这是 node.js 代码:
var setting = 'test';
var express = require('express');
var app = express();
const port = 80;
var PROTO_PATH = __dirname + '/helloworld.proto';
var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
});
// http://pythonservice:8000
// 10.109.228.152:8000
// pythonservice.default.svc.cluster.local:8000
// 218.38.137.28
var hello_proto =
grpc.loadPackageDefinition(packageDefinition).helloworld;
function main(callback) {
var client = new hello_proto.Greeter("http://pythonservice:8000",
grpc.credentials.createInsecure());
var user;
if (process.argv.length >= 3) {
user = process.argv[2];
} else {
user = 'world';
}
client.sayHello({name: user}, function(err, response) {
console.log('Greeting:', response.message);
setting = response.message;
});
}
var server = app.listen(port, function () {});
app.get('/', function (req, res) {
main();
res.send(setting);
//res.send(ip2);
//main(function(result){
// res.send(result);
//})
});
这是pythonservice的yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: practice-dp2
spec:
selector:
matchLabels:
app: practice-dp2
replicas: 1
template:
metadata:
labels:
app: practice-dp2
spec:
hostname: appname
subdomain: default-subdomain
containers:
- name: practice-dp2
image: taeil777/greeter-server:v1
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: pythonservice
spec:
type: ClusterIP
selector:
app: practice-dp2
ports:
- port: 8000
targetPort: 8000
这是 kubectl 获取所有内容:
root@pusik-server0:/home/tinyos/Desktop/grpc/node# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/practice-dp-55dd4b9d54-v4hhq 1/1 Running 1 68m
pod/practice-dp2-7d4886876-znjtl 1/1 Running 0 18h
NAME TYPE CLUSTER-IP EXTERNAL-IP
PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none>
443/TCP 34d
service/nodeservice ClusterIP 10.100.165.53 <none>
80/TCP 68m
service/pythonservice ClusterIP 10.109.228.152 <none>
8000/TCP 18h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/practice-dp 1/1 1 1 68m
deployment.apps/practice-dp2 1/1 1 1 18h
NAME DESIRED CURRENT READY
AGE
replicaset.apps/practice-dp-55dd4b9d54 1 1 1
68m
replicaset.apps/practice-dp2-7d4886876 1 1 1
18h
root@pusik-server0:/home/tinyos/Desktop/grpc/python# nslookup
pythonservice.default.svc.cluster.local
Server: 127.0.1.1
Address: 127.0.1.1#53
Name: pythonservice.default.svc.cluster.local
Address: 218.38.137.28
【问题讨论】:
-
您需要重新创建用于服务发现的 coredns,确保它已启动并正常运行。你能发布你的pythonservice的yaml文件,运行
kubectl get svc的输出和nslookup的输出吗? -
感谢您的评论。照你说的发。 practice-dp = node js 实践-dp2 = python
-
您好像在您的主机上运行 nslookup?尝试在一个吊舱内运行。如果 127.0.1.1 是您主机上的 DNS 服务器,这可能会导致 coredns 无法启动。看看下面的链接。 github.com/coredns/coredns/blob/master/plugin/loop/…
-
我正在尝试在 pod 内运行 nslookup,但出现以下错误: -------------- ------------------ kubectl exec practice-dp-55dd4b9d54-v4hhq -- nslookup pythonservice.default.svc.cluster.local OCI 运行时执行失败:执行失败:container_linux.go :345:启动容器进程导致“exec:\”nslookup\“:$PATH中找不到可执行文件”:未知命令以退出代码126终止 ------------------ --- 然后我在 ubuntu 环境中通过 virtualbox 配置了一个集群。 1个主节点,1个工作节点
标签: kubernetes coredns