#python #django #kubernetes #google-cloud-platform #kubernetes-ingress
#python #django #kubernetes #google-облачная платформа #kubernetes-вход
Вопрос:
У меня есть развертывание, обслуживание и вход для приложения Django в Google Cloud Kubernetes. Когда я применяю всю конфигурацию, происходит сбой входа, потому что служба Django не работает, я получаю шлюз 502 при посещении домена. Мое приложение Django возвращает статус 200 для конечной точки «/»; однако, когда я поменял свое изображение на другой http-сервер Google example, ingress работал нормально. Похоже, это может быть мой образ, который использует Gunicorn, но, похоже, я не могу решить проблему. Смотрите примеры кода ниже. Я был бы признателен за помощь, большое вам спасибо!
Ошибка GCP
ingress.kubernetes.io/backends:
{"k8s-be-xxxx":"HEALTHY","k8s-be-xxxxxx":"UNHEALTHY"}
Локально перенаправленный на порт модуль Curl
curl -iL http://127.0.0.1:8080/
HTTP/1.1 200 OK
Server: gunicorn/20.0.4
Date: Fri, 06 Nov 2020 03:29:03 GMT
Connection: close
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 45
<html><body><h1>API</h1></body></html>
URL-АДРЕСА Django
# urls.py
def index(request):
html = "<html><body><h1>API</h1></body></html>"
return HttpResponse(html)
urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
]
Dockerfile
FROM python:3.8-slim
ENV APP_HOME /app
WORKDIR $APP_HOME
# Install dependencies.
COPY requirements.txt .
RUN pip install -r requirements.txt
# Copy local code to the container image.
COPY ./api .
ENV PYTHONUNBUFFERED TRUE
Развертывание k8
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: api
name: api
spec:
replicas: 1
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
name: api
spec:
containers:
- name: api
image: gcr.io/xxxxx/django-api
ports:
- containerPort: 8080
protocol: TCP
imagePullPolicy: Always
command: [ "gunicorn", "--workers", "3", "--bind", ":8080",
"--log-level", "INFO", "--timeout", "90", "api.wsgi:application" ]
resources:
limits:
cpu: 50m
memory: 2048Mi
requests:
cpu: 50m
memory: 2048Mi
Служба k8
apiVersion: v1
kind: Service
metadata:
labels:
app: api
name: api
spec:
type: NodePort
selector:
app: api
ports:
- protocol: TCP
port: 8080
targetPort: 8080
Вход k8
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: core-ingress
spec:
rules:
- host: api.example.com
http:
paths:
- backend:
serviceName: api
servicePort: 8080
path: /*
Комментарии:
1. Не могли бы вы поделиться обоими файлами Dockerfile? Тот, который также работает.
2. Я поделился файлом Dockerfile в описании, я протестировал с помощью простого http-образа сервера из Google examples, и это сработало нормально.
Ответ №1:
Я только что столкнулся с той же проблемой. После некоторой отладки оказалось, что моя проблема заключалась в проверке работоспособности. Если URL-адреса ‘/’ и ‘/ healthz’ не возвращают HTTP 200, вход не разрешает трафик. Поэтому добавление простого ‘path (‘/ healthz’, index)’ к вашим URL-адресам сделало работу за меня. Очевидно, дайте ему некоторое время.