我在将我的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 }}
1条答案
按热度按时间baubqpgj1#
502之类的5xx错误是指服务器无法处理或服务客户端的请求。Nir Shtein撰写的blog简要介绍了各种故障点,当应用程序部署在kubernetes集群上时,这些故障可能导致5xx错误。
考虑一个典型的场景,在这个场景中,您将一个ServiceMap到pod中的一个容器,并且客户端正在尝试访问在该容器上运行的应用程序。这会造成几个故障点:
根据您提供的描述,获得502错误的主要原因是您的容器不断重新启动。
pod或容器重启可能是由于资源利用率过高(CPU或内存过冲)或由于应用程序代码错误导致pod过早关闭等原因,请关注此博客以了解有关容器重启的更多信息。
故障排除步骤:
查看pod日志以获取更多信息,关于为什么pod会重新启动,您可以使用以下命令
Pod重新启动也可能由于CPU或内存使用率高而发生。使用以下命令检查消耗较高资源的Pod
检查您的应用程序pod是否显示在列表中,并登录到内存利用率较高的pod,并检查消耗更多资源的进程。
有时不正确的自动缩放器配置也会导致容器或pod重新启动,请检查您的自动缩放器配置并纠正发现的任何错误配置。
Here是关于Pod重启的额外参考,通过此了解更多信息和调试步骤。