server.listen(8080, () => {
logger.log({
level: 'info',
message: 'Listening on port ' + port
})
})
FROM node:10-alpine
...
# Expose port
EXPOSE 8080
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"
apiVersion: v1
kind: Service
metadata:
name: service
spec:
ports:
- protocol: TCP
targetPort: 8080
port: 8080
selector:
app: deployment
type: LoadBalancer
$ 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
$ 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 /副本。我在做什么错了?
答案 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 的任何日志输出。