我在这里遇到了真正的障碍,到目前为止,我还没有找到任何解决方案。最终,在GCP上部署到Kubernete集群时,无法访问我已部署的NodeJS + Express服务器。我按照指南和示例进行操作,似乎没有任何效果。
集群,节点和服务运行正常,没有任何问题。此外,在Docker上运行时,它在本地运行良好。
这是我的Node YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: 2019-08-06T04:13:29Z
generation: 1
labels:
run: nodejsapp
name: nodejsapp
namespace: default
resourceVersion: "23861"
selfLink: /apis/apps/v1/namespaces/default/deployments/nodejsapp
uid: 8b6b7ac5-b800-11e9-816e-42010a9600de
spec:
progressDeadlineSeconds: 2147483647
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
run: nodejsapp
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
run: nodejsapp
spec:
containers:
- image: gcr.io/${project}/nodejsapp:latest
imagePullPolicy: Always
name: nodejsapp
ports:
- containerPort: 5000
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: 2019-08-06T04:13:29Z
lastUpdateTime: 2019-08-06T04:13:29Z
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
observedGeneration: 1
readyReplicas: 1
replicas: 1
updatedReplicas: 1
YAML服务:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: 2019-08-06T04:13:34Z
labels:
run: nodejsapp
name: nodejsapp
namespace: default
resourceVersion: "25444"
selfLink: /api/v1/namespaces/default/services/nodejsapp
uid: 8ef81536-b800-11e9-816e-42010a9600de
spec:
clusterIP: XXX.XXX.XXX.XXX
externalTrafficPolicy: Cluster
ports:
- nodePort: 32393
port: 80
protocol: TCP
targetPort: 5000
selector:
run: nodejsapp
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: XXX.XXX.XXX.XXX
NodeJS服务器配置为在端口5000上运行。我也尝试不进行端口转发,但结果没有区别。
非常感谢您的帮助。
更新: 我使用了本指南并按照说明进行操作:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
更新2: 最终-解决了。我不确定为什么在任何地方都没有提到它,但是您必须创建一个Ingress才能将流量相应地路由到Pod。
这是示例配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/backends: '{"k8s-be-32064--abfe1f07378017e9":"HEALTHY"}'
ingress.kubernetes.io/forwarding-rule: k8s-fw-default-nodejsapp--abfe1f07378017e9
ingress.kubernetes.io/target-proxy: k8s-tp-default-nodejsapp--abfe1f07378017e9
ingress.kubernetes.io/url-map: k8s-um-default-nodejsapp--abfe1f07378017e9
creationTimestamp: 2019-08-06T18:59:15Z
generation: 1
name: nodejsapp
namespace: default
resourceVersion: "171168"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/versapay-api
uid: 491cd248-b87c-11e9-816e-42010a9600de
spec:
backend:
serviceName: nodejsapp
servicePort: 80
status:
loadBalancer:
ingress:
- ip: XXX.XXX.XXX
答案 0 :(得分:0)
根据需要添加图像作为答案(但不一定是答案):
如图所示,除了您的后端服务外,绿色的勾也应该可见
可能的解决方案:
在您的NodeJsApp
中,添加以下基本URL,即
在本地启动应用程序时,http://localhost:5000/
应该返回200
状态代码(最好是Server is running...
或某些消息)
此外,如果启用了path based routing
,则还需要另一个基本URL:
http://localhost:5000/<nodeJsAppUrl>/
还应该返回200
状态代码。
LoadBalancer
和Backend Service
的运行状况检查都需要以上URL并重新部署服务。
如果上述解决方案不能解决上述问题,请告诉我。
答案 1 :(得分:0)
您需要一个中间服务来内部公开您的部署。
现在,您已经将一组Pod分组在一个部署中,并且在群集中公开了一个负载均衡器,但是您需要将它们与其他服务链接。
您可以尝试使用NodePort
,如下所示:
apiVersion: v1
kind: Service
metadata:
name: nodejsapp-nodeport
spec:
selector:
run: nodejsapp
ports:
- name: default
protocol: TCP
port: 32393
targetPort: 5000
type: NodePort
此NodePort
服务位于您的Load Balancer
和部署中的Pod之间,将其定位在端口5000
中,并暴露端口32393
(根据您在原始问题,您可以更改)。
您可以从此处重新部署Load Balancer
来定位先前的NodePort
。这样,您可以从负载均衡器公共地址通过端口80访问NodeJS应用。
apiVersion: v1
kind: Service
metadata:
name: nodejs-lb
spec:
selector:
run: nodejsapp
ports:
- name: default
protocol: TCP
port: 80
targetPort: 32393
type: LoadBalancer
整个场景如下:
publicy exposed address --> LoadBalancer --> | NodePort --> Deployment --> Pods