Сбой нездоровой службы GCP Kubernetes Ingress

#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-адресам сделало работу за меня. Очевидно, дайте ему некоторое время.