gcloud 已分配静态 ip,但我从服务器收到 404。我该如何调试?

gcloud 已分配静态 ip,但我从服务器收到 404。我该如何调试?

我正在使用 kubernet 部署我的应用程序:这是我的服务描述:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flaskgql
  labels:
    name: flaskgql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: flaskgql
    spec:
      containers:
      - name: flaskgql
        image: cryptodraco/flask_gql
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: secrets
            mountPath: /etc/secrets
            readOnly: true
      volumes:
      - name: secrets
        secret:
          secretName: db-passwords
---

apiVersion: v1
kind: Service
metadata:
  name: flaskgql
  labels:
    name: flaskgql
spec:
  type: LoadBalancer
  #loadBalancerIP: 35.189.238.42
  ports:
  - port: 80
    targetPort: 8080
  selector:
    name: flaskgql

当我列出我的服务时,一切都很好:

flaskgql  LoadBalancer   10.59.251.206   35.189.238.42   80:30677/TCP   6m

我的docker文件如下:

FROM gcr.io/google_appengine/python

RUN virtualenv /env

# source venv/bin/activate
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

# no database - SQL only
#ENV NODB 1

ADD . /app

CMD gunicorn -b :$PORT wsgi:app

但是当我尝试访问我分配的静态 IP 时,它不起作用。注意:我之前已经做过同样的事情,而且没问题。但现在当我访问静态 IP 时,我收到 404 错误。似乎我的 gunicorn 服务器没有端口转发到 IP。即使从 gcloud 我得到: 在此处输入图片描述

我不知道是不是因为我应该坚持使用虚拟机而不是实例。但我只知道它不起作用,我不知道如何调试。提前谢谢

答案1

首先,404 未找到意味着请求正在向目标服务器发出,但无法找到请求的文件,我怀疑这是静态 IP 的问题。

有几种方法可以调试此问题。第一步是通过 SSH 进入其中一个节点,然后尝试使用集群 IP 直接连接到 pod:

列出你的 Pod 及其 CLuster IP

kubectl 获取 pod -o wide

通过 GCP 控制台或使用 gcloud 命令通过 SSH 连接到集群的某个节点

gcloud 计算实例 ssh [节点名称]

连接到节点后,运行 curl 命令查看容器是否正确响应请求

curl [pod_cluster_ip]

如果返回 404 错误消息,则表示容器镜像存在问题。服务器根目录中没有文件,或者docker 镜像没有暴露 80 端口

如果这个测试成功,您就知道容器正在正确服务,因此服务可能存在问题。

使用 LB 服务集群 IP 重复 curl 测试。

你也可以连接到 pod 来观察活动

kubectl 附加 [pod名称] -i

最后,您可以检查 GCP 负载均衡器,看看那里是否有任何报告的错误,例如不健康的后端。

我不太擅长使用 dockerfile,但 k8s yaml 看起来不错

相关内容