Kubernetes LoadBalancer服务返回空响应

时间:2019-03-17 00:50:27

标签: node.js docker kubernetes

  1. node.js快递服务器绑定到端口8080
server.listen(8080, () => {
  logger.log({
    level: 'info',
    message: 'Listening on port ' + port
  })
})
  1. 带有node.js代码的Docker映像+暴露了端口8080的npm模块
FROM node:10-alpine

...

# Expose port
EXPOSE 8080
  1. 配置了containerPort 8080的Kubernetes部署Docker映像
apiVersion: apps/v1

kind: Deployment

metadata:
  name: deployment

spec:
  selector:
    matchLabels:
      app: deployment

  replicas: 2

  template:
    metadata:
      labels:
        app: deployment

    spec:
      containers:
      - name: job-id-20
        image: redacted/redacted
        command: ["node", "backend/services.js"]

        ports:
        - name: http-port
          containerPort: 8080

      imagePullSecrets:
      - name: docker-hub-credentials

      dnsConfig:
        options:
          - name: ndots
            value: "0"
  1. 具有与选择器匹配的选择器的Kubernetes服务,目标端口为8080,并键入LoadBalancer
apiVersion: v1

kind: Service

metadata:
  name: service

spec:
  ports:
    - protocol: TCP
      targetPort: 8080
      port: 8080

  selector:
    app: deployment

  type: LoadBalancer
  1. 验证负载均衡器是否具有外部IP(我已将其擦除)
$ kubectl --kubeconfig="k8s-1-13-4-do-0-nyc1-1552761372568-kubeconfig.yaml" get service/service
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
service   LoadBalancer   10.245.239.60   1x4.2x9.1x8.x2   8080:30626/TCP   113s
  1. 卷曲失败,响应为空
$ curl --verbose http://1x4.2x9.1x8.x2:8080/
*   Trying 1x4.2x9.1x8.x2...
* TCP_NODELAY set
* Connected to 1x4.2x9.1x8.x2 (1x4.2x9.1x8.x2) port 8080 (#0)
> GET / HTTP/1.1
> Host: 1x4.2x9.1x8.x2:8080
> User-Agent: curl/7.54.0
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host 1x4.2x9.1x8.x2 left intact
curl: (52) Empty reply from server

我希望流量会路由到服务,到达部署中的一个pod /副本。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

在创建映像时检查任何错误,检查Pod在部署后是否已成功部署,即它们应该处于运行状态并也检查服务。 如果这些条件是正确的,那么我几乎不会在您的步骤中看到任何错误。 这是一个用于nodejs应用程序部署的简单示例。

index.js

var http = require('http');

var server = http.createServer(function(request, response) {

    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("Hello World!");

});

var port = 80;
server.listen(port);

console.log("Server running at http://localhost:%d", port);

Docker文件:

FROM node:0.10.40
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY ./nodejs-docs-hello-world ./
RUN npm install
CMD ["node", "index.js"]

网络部署:

apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    name: web
  name: web-controller
spec:
  replicas: 2
  template:
    metadata:
      labels:
        name: web
    spec:
      containers:
      - image: imagename
        name: web
        ports:
        - containerPort: 80
          name: http-server

网络服务:

apiVersion: v1
kind: Service
metadata:
  name: web
  labels:
    name: web
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: web

答案 1 :(得分:0)

这里有一些潜在的错误来源。

第一个潜在问题是您的 Docker 映像无法按预期工作。你可以试试这个:使用 nginx:latest 作为你的图片,试试看是否可行。如果这有效,则 Kubernetes 部分工作正常,您可以对 Docker 映像进行进一步调查。

据我所知,您的代码片段不包含任何输出某些数据的代码。

您可以使用上面评论中指示的 docker run 命令来试验您的图像。

如果它仍然不适用于 Nginx 映像,那么您必须进一步调查 Kubernetes 方面。

虽然 LoadBalancer 是一种标准的 Kubernetes 服务类型,但它的实现对于不同的云提供商和本地安装是不同的。

您必须查阅您的 Kubernetes 或云提供商的文档,了解如何确定 LoadBalancer 是否配置正确。

要查看服务是否可以访问 Pod,您可以使用命令 kubectl get endpoints

要进行更多调试,您可以使用 kubectl port-forward 命令创建通向其中一个 Pod 或服务的隧道,并在已建立的隧道上尝试 curl 命令。

您也可以使用 kubectl logs 命令查看 Pod 的任何日志输出。