【问题标题】:Why can't I find service discovery in Kubernetes?为什么在 Kubernetes 中找不到服务发现?
【发布时间】: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


【解决方案1】:

1。回答第一个问题:

  • pythonservice's clusterip is accessible, but not http://pythoservice:8000

请参考Connecting Applications with Services

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

2。回答第二个问题:

  • 输出 exec failed: container_linux.go:345: starting container process caused "exec: \"nslookup\": executable file not found in $PATH": unknown command terminated with exit code 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-system 命名空间中:

kubectl get nodes,pods,svc --all-namespaces -o wide

为了开始调试,请获取有关特定问题 f.e. 的更多信息。使用 coredns 请使用:

kubectl describe pod your coredns_pod -n kube-system
kubectl logs coredns_pod -n kube-system

请参考:

希望对您有所帮助。

【讨论】:

  • 感谢您的评论但是在2中,创建ubuntu pod的命令显示错误...
  • 我尝试通过 kubectl exec {podname} -ti bash 在 pod 中使用 nslookup 来使用 nslookup,但 apt-get dnsutils 没有运行。是否应该在 Dockerfile 中为 nslookup 安装??
  • 通过在 Dockerfile 中安装 dnsutill,您可以在 pod 中的容器上使用 nslookup。但是我收到以下错误:';;连接超时;无法访问任何服务器'
  • 我已经更新了答案:对于第二个命令kubectl run ubuntu --rm -it --image ubuntu ...,请提供带有错误信息的输出。无需使用 docker 文件构建映像即可在带有 ubuntu 映像的容器中使用 dnsutils。请提供:使用的完整命令、完整的错误信息和集群状态(pods、svc、version)
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2011-05-27
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多