为什么可以';我不能在Kubernetes中找到服务发现吗?

为什么可以';我不能在Kubernetes中找到服务发现吗?,kubernetes,coredns,Kubernetes,Coredns,我正在创建一个简单的grpc示例,在本地环境中使用Kubernetes 当nodejs使用pythonservice发出请求时,pythonservice使用helloworld进行响应并将其显示在网页上 但是,pythonservice的clusterip是可访问的,但不是http://pythoservice:8000 coredns可能有问题,所以我检查了各种东西并删除了kube系统的kube dns服务 如果您使用nslookup使用pythonservice.default.svc.c

我正在创建一个简单的grpc示例,在本地环境中使用Kubernetes

当nodejs使用pythonservice发出请求时,pythonservice使用helloworld进行响应并将其显示在网页上

但是,pythonservice的clusterip是可访问的,但不是
http://pythoservice:8000

coredns可能有问题,所以我检查了各种东西并删除了kube系统的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

1。回答第一个问题:

  • pythonservice的clusterip是可访问的,但不是http://pythoservice:8000
请参阅

service/pythonservice
的类型是
ClusterIP
如果您有兴趣在集群外公开服务,请使用service type
NodePort或LoadBalancer
。根据附带的屏幕,您的应用程序可以从集群内访问(ClusterIP Serie)

2。回答第二个问题:

  • 输出
    exec失败:container\u linux.go:345:启动容器进程导致“exec:\“nslookup\”:在$PATH中找不到可执行文件:未知命令终止,退出代码126
这意味着您的pod中可能没有类似于
nslookup
的工具,因此:请使用已安装的工具在同一命名空间中运行一些pod,然后再次验证:

kubectl run ubuntu --rm -it --image ubuntu --restart=Never --command -- bash -c 'apt-get update && apt-get -y install dnsutils && bash'

kubectl exec ubuntu2 -- nslookup pythonservice.default.svc.cluster.local
--更新

请确认所有POD和svc的状态,尤其是
kube系统中的状态
命名空间:

kubectl get nodes,pods,svc --all-namespaces -o wide
为了开始调试,请获取有关coredns特定问题f.e.的更多信息,请使用:

kubectl describe pod your coredns_pod -n kube-system
kubectl logs coredns_pod -n kube-system
请参阅:


希望对您有所帮助。

1。回答第一个问题:

  • pythonservice的clusterip是可访问的,但不是http://pythoservice:8000
请参阅

service/pythonservice
的类型是
ClusterIP
如果您有兴趣在集群外公开服务,请使用service type
NodePort或LoadBalancer
。根据附带的屏幕,您的应用程序可以从集群内访问(ClusterIP Serie)

2。回答第二个问题:

  • 输出
    exec失败:container\u linux.go:345:启动容器进程导致“exec:\“nslookup\”:在$PATH中找不到可执行文件:未知命令终止,退出代码126
这意味着您的pod中可能没有类似于
nslookup
的工具,因此:请使用已安装的工具在同一命名空间中运行一些pod,然后再次验证:

kubectl run ubuntu --rm -it --image ubuntu --restart=Never --command -- bash -c 'apt-get update && apt-get -y install dnsutils && bash'

kubectl exec ubuntu2 -- nslookup pythonservice.default.svc.cluster.local
--更新

请确认所有POD和svc的状态,尤其是
kube系统中的状态
命名空间:

kubectl get nodes,pods,svc --all-namespaces -o wide
为了开始调试,请获取有关coredns特定问题f.e.的更多信息,请使用:

kubectl describe pod your coredns_pod -n kube-system
kubectl logs coredns_pod -n kube-system
请参阅:


希望有此帮助。

您需要重新创建用于服务发现的coredns,确保它已启动并正常运行。您可以发布python服务的yaml文件、运行
kubectl get svc
的输出以及nslookup的输出吗?谢谢您的评论。照你说的贴。像在主机上运行nslookup一样练习dp=node js pracice-dp2=pythonSeems?试着在一个舱内跑步。如果127.0.1.1是主机上的DNS服务器,这可能会导致coredns无法启动。看看下面的链接。我试图在pod内运行nslookup,但出现以下错误:------------------------------------------------------------kubectl exec practice-dp-55dd4b9d54-v4hhq--nslookup pythonservice.default.svc.cluster.local OCI runtime exec失败:exec失败:container\u linux.go:345:启动容器进程导致“exec:\”nslookup\“:在$PATH中找不到可执行文件“:未知命令以退出代码126终止------------------然后我在ubuntu环境中通过virtualbox配置了一个集群。1个主节点,1个工作节点您需要重新创建用于服务发现的coredns,确保它已启动并正常运行。您可以发布python服务的yaml文件、运行
kubectl get svc
的输出以及nslookup的输出吗?谢谢您的评论。照你说的贴。像在主机上运行nslookup一样练习dp=node js pracice-dp2=pythonSeems?试着在一个舱内跑步。如果127.0.1.1是主机上的DNS服务器,这可能会导致coredns无法启动。看看下面的链接。我试图在pod内运行nslookup,但出现以下错误:------------------------------------------------------------kubectl exec practice-dp-55dd4b9d54-v4hhq--nslookup pythonservice.default.svc.cluster.local OCI runtime exec失败:exec失败:container\u linux.go:345:启动容器进程导致“exec:\”nslookup\“:executable file not found in$PATH”:未知命令终止,退出代码126------------------然后我在ubuntu环境中通过virtualbox配置了一个集群。1个主节点,1个工作节点注释,但在2个节点中,创建ubuntu pod的命令显示错误…我试图通过转到kubectl exec使用nslookup{podname}-ti bash在pod中使用nslookup,但apt get dnsutils未运行。如果要在Dockerfile中安装nslookup,通过在Dockerfile中安装dnsutill,您可以在pod中的容器上使用nslookup。但是我得到以下信息