容器引擎入口不工作
container engine ingress not working
我在 google 容器注册表中有一个简单的容器,它基本上做一些事情并执行一个二进制文件,这是一个基于 go 的服务器,这里是 DockerFile 的内容:
FROM debian:stable
WORKDIR /workspace/
COPY key.json .
COPY bin/user-creds.
EXPOSE 1108
ENV GOOGLE_APPLICATION_CREDENTIALS /workspace/key.json
RUN apt-get update \
&& apt-get install -y ca-certificates \
&& chmod +x user-creds
CMD ["./user-creds"]
这个容器已经在本地测试过并且可以完美运行。所以使用 google 云 shell 我 运行 这个容器:
kubectl run user-creds --image=eu.gcr.io/GCLOUD_PROJECT/user-creds:COMMIT_SHA --port=1108
然后就像文档上说的那样,我把它暴露在一个节点端口上
kubectl expose deployment user-creds --target-port=1108 --type=NodePort
然后我创建了一个带有服务路径的入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: INGRESS_NAME
annotations:
kubernetes.io/ingress.global-static-ip-name: IP_NAME
spec:
rules:
- http:
paths:
- path: /user/creds/*
backend:
serviceName: user-creds
servicePort: 1108
然后我创建了入口:
kubectl create -f INGRESS_NAME.yaml
入口已创建,我等了一段时间,这是入口的详细信息:
NAME HOSTS ADDRESS PORTS AGE
INGRESS_NAME * IP_ADDRESS 80 38m
但是当我使用实际的 url 路径时,我得到了 502 错误:
当我转到任何其他路径时,我会收到默认的后端 404 错误,但是当我访问特定的 /user/creds/ 路径时,我会收到 502 错误。
为了检查集群或我的特定容器、端口或其他东西是否有问题,我尝试将容器公开为 LoadBalancer,它运行良好,命令:
kubectl expose deployment user-creds --target-port=1108 --port=80 --type=LoadBalancer
服务详情:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP INT_IP_ADDRESS <none> 443/TCP 1h
user-creds LoadBalancer INT_IP_ADDRESS IP_ADDRESS 80:31618/TCP 1m
结果:200 条响应正文正确。
现在一直坚持这个问题,尝试了没有路径的入口,只是用户信用作为后端,但仍然有同样的错误。
如有任何帮助或建议,我们将不胜感激:)
终于弄明白了,原来是跟健康检查有关。健康检查访问 / 并期望 200,如果没有得到它,则它会将后端标记为不健康,并为发送给它的每个请求标记 returns 502。我的问题是我使用的 / 端点如果在没有特定请求参数的情况下被调用通常会返回 400。
这确实是我这边的人为错误,它甚至在文档中明确指出:https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#remarks
要考虑的另一件事是入口 returns 路由之前的所有路径,因此在我的情况下服务器需要按字面意思侦听 /user/creds/。
我在 google 容器注册表中有一个简单的容器,它基本上做一些事情并执行一个二进制文件,这是一个基于 go 的服务器,这里是 DockerFile 的内容:
FROM debian:stable
WORKDIR /workspace/
COPY key.json .
COPY bin/user-creds.
EXPOSE 1108
ENV GOOGLE_APPLICATION_CREDENTIALS /workspace/key.json
RUN apt-get update \
&& apt-get install -y ca-certificates \
&& chmod +x user-creds
CMD ["./user-creds"]
这个容器已经在本地测试过并且可以完美运行。所以使用 google 云 shell 我 运行 这个容器:
kubectl run user-creds --image=eu.gcr.io/GCLOUD_PROJECT/user-creds:COMMIT_SHA --port=1108
然后就像文档上说的那样,我把它暴露在一个节点端口上
kubectl expose deployment user-creds --target-port=1108 --type=NodePort
然后我创建了一个带有服务路径的入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: INGRESS_NAME
annotations:
kubernetes.io/ingress.global-static-ip-name: IP_NAME
spec:
rules:
- http:
paths:
- path: /user/creds/*
backend:
serviceName: user-creds
servicePort: 1108
然后我创建了入口:
kubectl create -f INGRESS_NAME.yaml
入口已创建,我等了一段时间,这是入口的详细信息:
NAME HOSTS ADDRESS PORTS AGE
INGRESS_NAME * IP_ADDRESS 80 38m
但是当我使用实际的 url 路径时,我得到了 502 错误:
当我转到任何其他路径时,我会收到默认的后端 404 错误,但是当我访问特定的 /user/creds/ 路径时,我会收到 502 错误。
为了检查集群或我的特定容器、端口或其他东西是否有问题,我尝试将容器公开为 LoadBalancer,它运行良好,命令:
kubectl expose deployment user-creds --target-port=1108 --port=80 --type=LoadBalancer
服务详情:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP INT_IP_ADDRESS <none> 443/TCP 1h
user-creds LoadBalancer INT_IP_ADDRESS IP_ADDRESS 80:31618/TCP 1m
结果:200 条响应正文正确。
现在一直坚持这个问题,尝试了没有路径的入口,只是用户信用作为后端,但仍然有同样的错误。
如有任何帮助或建议,我们将不胜感激:)
终于弄明白了,原来是跟健康检查有关。健康检查访问 / 并期望 200,如果没有得到它,则它会将后端标记为不健康,并为发送给它的每个请求标记 returns 502。我的问题是我使用的 / 端点如果在没有特定请求参数的情况下被调用通常会返回 400。
这确实是我这边的人为错误,它甚至在文档中明确指出:https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#remarks
要考虑的另一件事是入口 returns 路由之前的所有路径,因此在我的情况下服务器需要按字面意思侦听 /user/creds/。