0

我在 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"]

这个容器已经过本地测试并且可以完美运行。所以使用谷歌云外壳我运行了这个容器:

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 与正确的响应正文。

现在一直停留在这个问题上,尝试了没有路径的入口,只有用户信用作为后端,但仍然有同样的错误。

任何帮助或建议将不胜感激,谢谢:)

4

1 回答 1

2

终于弄明白了,是和体检有关。健康检查访问 / 并期望 200,如果它没有得到它,那么它将后端标记为不健康,并为发送给它的每个请求返回 502。我的问题是我正在使用 / 端点,如果在没有特定请求参数的情况下调用它,它通常会返回 400。

这确实是我的人为错误,它甚至在文档中明确指出:https ://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#remarks

要考虑的另一件事是入口返回路由之前的所有路径,因此在我的情况下,服务器需要逐字监听 /user/creds/ 。

于 2017-11-14T21:31:44.917 回答