kubernetes 为什么我在部署到K8s的Fastapi应用程序时会收到502错误?

jmo0nnb3  于 2023-05-16  发布在  Kubernetes
关注(0)|答案(1)|浏览(571)

我在将我的fastapi应用部署到GCP中的k8s容器时遇到问题。即使我有绿色的复选标记,表明它的启动和运行,我的日志显示:

当我在本地运行我的应用程序时,它会构建。当我在本地构建我的镜像和容器时,Docker桌面没有显示任何问题,它也没有一遍又一遍地访问这个活动的端点。在我将此端点添加到应用程序之前。日志显示应用程序一次又一次地停止和重新启动。
部署的其他端点没有任何这些日志。所以我觉得有什么东西一直在让应用程序一遍又一遍地重新启动,并检查这个健康活跃度端点,我在这里做错了什么?
Dockerfile:

FROM python:3.9

#need to run virtualenv
RUN python3 -m venv /opt/venv


# Install system dependencies
RUN apt-get update

ENV PATH="${PATH}:/root/.poetry/bin"

WORKDIR .app work directory for code

ARG PIPCONF_B64
RUN mkdir -p ~/.pip && echo $PIPCONF_B64 | base64 -d > ~/.pip/pip.conf
RUN pip install poetry
# Copy over the requirements.txt so we can install it Copy project files and test files
COPY . app
COPY requirements.txt /requirements.txt
COPY poetry.lock pyproject.toml
COPY pyproject.toml pyproject.toml
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes

# Install requirements
RUN pip3 install --upgrade pip
RUN pip3 install -r /requirements.txt
RUN . /opt/venv/bin/activate && pip install -r requirements.txt

ENV PYTHONPATH="${PYTHONPATH}:/appstuff"

EXPOSE 80
CMD ["uvicorn", "main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]

我的部署。yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: "{{ .Release.Name }}-deployment"
spec:
  revisionHistoryLimit: 5
  {{- if not .Values.hpa.enabled }}
  replicas: {{ .Values.replicas }}
  {{ end }}
  selector:
    matchLabels:
      app: "{{ .Release.Name }}"
{{ toYaml .Values.labels | indent 6 }}
  template:
    metadata:
      annotations:
        ad.datadoghq.com/postgres.logs: '[{"source": ...}]'
      labels:
        app: "{{ .Release.Name }}"
{{ toYaml .Values.labels | indent 8 }}
    spec:
      serviceAccountName: "{{ .Release.Name }}-sa"
      containers:
        - name: "{{ .Release.Name }}"
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: "{{ .Values.image.pullPolicy }}"
          command: ["uvicorn"]
          args: ["main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
          ports:
            - name: ui
              containerPort: 80
              protocol: TCP
          env:

          envFrom:
            - configMapRef:
                name: "{{ .Release.Name }}-configmap"
#            - secretRef:
#                name: my-secret-name
          livenessProbe:
            httpGet:
              path: /alive
              port: 80
            initialDelaySeconds: 120
          resources:
{{ toYaml .Values.resources | indent 12 }}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 33%
      maxUnavailable: 33%

我的配置.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: "{{ .Release.Name }}-configmap"
  annotations:
    meta.helm.sh/release-name: "{{ .Release.Name }}"
    meta.helm.sh/release-namespace: "{{ .Release.Namespace }}"
  labels:
    app.kubernetes.io/managed-by: Helm
data:
{{ toYaml .Values.envConfig | indent 2 }}
baubqpgj

baubqpgj1#

502之类的5xx错误是指服务器无法处理或服务客户端的请求。Nir Shtein撰写的blog简要介绍了各种故障点,当应用程序部署在kubernetes集群上时,这些故障可能导致5xx错误。
考虑一个典型的场景,在这个场景中,您将一个ServiceMap到pod中的一个容器,并且客户端正在尝试访问在该容器上运行的应用程序。这会造成几个故障点:

  • 豆荚
  • 容器
  • 容器上公开的网络端口
  • 服务
  • 入口

根据您提供的描述,获得502错误的主要原因是您的容器不断重新启动。
pod或容器重启可能是由于资源利用率过高(CPU或内存过冲)或由于应用程序代码错误导致pod过早关闭等原因,请关注此博客以了解有关容器重启的更多信息。

故障排除步骤:

查看pod日志以获取更多信息,关于为什么pod会重新启动,您可以使用以下命令

`kubectl get logs <pod>` or `kubectl describe pod <pod>`

Pod重新启动也可能由于CPU或内存使用率高而发生。使用以下命令检查消耗较高资源的Pod

`kubectl top pods`

检查您的应用程序pod是否显示在列表中,并登录到内存利用率较高的pod,并检查消耗更多资源的进程。
有时不正确的自动缩放器配置也会导致容器或pod重新启动,请检查您的自动缩放器配置并纠正发现的任何错误配置。
Here是关于Pod重启的额外参考,通过此了解更多信息和调试步骤。

相关问题