无法访问通过NodePort公开的Kubernetes服务

时间:2019-03-05 05:50:59

标签: docker kubernetes namespaces minikube

我正在使用minikube在最新的MacOS上测试kubernetes。

以下是我相关的YAML:

namespace.yml

apiVersion: v1
kind: Namespace
metadata:
  name: micro
  labels:
    name: micro

deployment.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: adderservice
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: adderservice
    spec:
      containers:
      - name: adderservice
        image: jeromesoung/adderservice:0.0.1
        ports:
        - containerPort: 8080

service.yml

apiVersion: v1
kind: Service
metadata:
  name: adderservice
  labels:
    run: adderservice
spec:
  ports:
    - port: 8080
      name: main
      protocol: TCP
      targetPort: 8080
  selector:
    run: adderservice
  type: NodePort

运行minikube start之后,我执行的部署步骤如下:

  1. kubectl create -f namespace.yml创建名称空间

  2. kubectl config set-context minikube --namespace=micro

  3. kubectl create -f deployment.yml

  4. kubectl create -f service.yml

然后,我使用以下命令获取NodeIP和NodePort:

  1. kubectl get services获取NodePort
$ kubectl get services
NAME           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
adderservice   NodePort   10.99.155.255   <none>        8080:30981/TCP   21h
  1. minikube ip获取nodeIP
$ minikube ip
192.168.99.103

但是当我卷曲时,总是会得到拒绝连接,如下所示:

$ curl http://192.168.99.103:30981/add/1/2
curl: (7) Failed to connect to 192.168.99.103 port 30981: Connection refused

因此,我检查了节点,吊舱,部署和端点,如下所示:

$ kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    23h       v1.13.3

$ kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
adderservice-5b567df95f-9rrln   1/1       Running   0          23h

$ kubectl get deployments
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
adderservice   1         1         1            1           23h

$ kubectl get endpoints
NAME           ENDPOINTS         AGE
adderservice   172.17.0.5:8080   21h

我还通过以下方式检查了minikube的服务列表:

$ minikube service -n micro adderservice --url
http://192.168.99.103:30981

我已经阅读了许多有关通过NodePorts访问k8s服务的文章。据我所知,我应该能够毫无问题地访问该应用程序。我唯一怀疑的是我正在使用自定义名称空间。这会导致访问问题吗?

我知道名称空间会更改DNS,因此,为完整起见,我还运行了以下命令:

$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.default
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   kubernetes.default.svc.cluster.local
Address: 10.96.0.1

$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.micro
Server:     10.96.0.10
Address:    10.96.0.10#53

Non-authoritative answer:
Name:   kubernetes.micro
Address: 198.105.244.130
Name:   kubernetes.micro
Address: 104.239.207.44

有人可以帮我吗?谢谢。

4 个答案:

答案 0 :(得分:0)

检查服务是否真的在8080上监听。

在容器内尝试telnet。

telnet 127.0.0.1 8080
.
.
.
telnet 172.17.0.5 8080

答案 1 :(得分:0)

@ aakash-sharma

root@adderservice-5b567df95f-9rrln:/home/node/service# netstat -ltnpau
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::38641                :::*                    LISTEN      1/node

root@adderservice-5b567df95f-9rrln:/home/node/service# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  2.2 574852 46764 ?        Ssl  Mar04   0:00 node index.js
root       504  0.0  0.1  18196  3256 pts/0    Ss   06:58   0:00 bash
root       827  0.0  0.1  36640  2800 pts/0    R+   07:03   0:00 ps aux

在简单的应用服务器中,它读取由K8S注入的全局env变量,如下所示:

const restify = require('restify');

function wiring(service) {
  const server = restify.createServer();
  const { ADDERSERVICE_SERVICE_HOST, ADDERSERVICE_SERVICE_PORT } = process.env;

  server.get('/add/:first/:second', (req, res, next) => {
    service.add(req.params, (err, result) => {
      if (err) {
        res.send(err);
        next();
        return;
      }
      res.send(200, result);
      next();
    });
  });

  server.listen(ADDERSERVICE_SERVICE_PORT, ADDERSERVICE_SERVICE_HOST, () => {
    console.log('%s listening at %s', server.name, server.url);
  });
}

ADDERSERVICE_SERVICE_PORT 不应该成为服务YAML中定义的那个吗?

答案 2 :(得分:0)

错误Connection Refused主要表示容器内的应用程序不接受目标接口上的请求或未通过预期端口映射。

您需要注意的事项:

  • 请确保您的应用绑定到0.0.0.0,以便它可以从容器外部(如在公共场所或通过其他容器)接收来自容器外部的请求。
  • 确保您的应用程序确实正在按预期方式监听containerPorttargetPort

在您的情况下,必须确保ADDERSERVICE_SERVICE_HOST等于0.0.0.0,并且ADDERSERVICE_SERVICE_PORT等于8080,该值应与targetPort中的service.ymlcontainerPort

答案 3 :(得分:0)

没有回答这个问题,但是谷歌搜索引擎是否也像我一样遇到了同样的问题。这是我针对相同问题的解决方案。

我的Mac系统IP和minikube IP不同。

因此localhost:port无效,请尝试获取IP

minikube ip

稍后,使用该IP:Port访问该应用,它便可以正常工作。