我已经在Amazon EKS(Kubernetes)上部署了Django Rest API容器,但是简单的HttpResponse花费了大约4-8秒。
def home(request):
return HttpResponse("Homepage")
这是我的堆栈:
容器:
NAME READY STATUS RESTARTS AGE
pod/djangoapi-65799dd6dc-gkpfp 1/1 Running 0 1h
pod/echoheaders-5cff747d7d-n4jnt 1/1 Running 0 1h
pod/redis-7d9fbf54cd-lpffv 1/1 Running 0 1h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/djangoapi-svc NodePort 10.100.41.163 <none> 8000:30327/TCP 11d
service/echoheaders NodePort 10.100.94.85 <none> 80:30317/TCP 12d
service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 35d
service/redis ClusterIP 10.100.210.207 <none> 6379/TCP 35d
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/djangoapi 1 1 1 1 11d
deployment.apps/echoheaders 1 1 1 1 12d
deployment.apps/redis 1 1 1 1 35d
将相同的DjangoAPI映像部署到我的本地设置(minikube)时,平均响应时间约为200ms。
适用于Django的Dockerfile:
FROM python:3.7
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade pip
RUN mkdir /app
WORKDIR /app
COPY . /app/
RUN pip install -r requirements.txt
Django部署和服务Yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: djangoapi
type: web
name: djangoapi
namespace: "default"
spec:
replicas: 1
template:
metadata:
labels:
app: djangoapi
type: web
spec:
containers:
- name: djangoapi
image: wbivan/app:speed
imagePullPolicy: Always
args:
- gunicorn
- api.wsgi
- --bind
- 0.0.0.0:8000
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
envFrom:
- configMapRef:
name: djangoapi-config
ports:
- containerPort: 8000
imagePullSecrets:
- name: regcred
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: djangoapi-svc
namespace: "default"
labels:
app: djangoapi
spec:
ports:
- port: 8000
protocol: TCP
targetPort: 8000
selector:
app: djangoapi
type: web
type: NodePort
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
但使用上述方法并没有太大区别
然后我怀疑是弹性负载均衡器。这就是为什么我部署了回显服务器(使用映像gcr.io/google_containers/echoserver:1.4)的原因。但是大多数请求只花了〜50ms 。
# This took ~50ms
- host: echo.mydomain.com
http:
paths:
- path: /*
backend:
serviceName: echoheaders
servicePort: 80
# This took ~ 8000ms!!!
- host: django.mydomain.com
http:
paths:
- path: /*
backend:
serviceName: djangoapi-svc
servicePort: 8000
kubectl port-forward deployment/djangoapi 7000:8000
仅对服务本身进行测试
我注意到的是,EKS部署的响应时间差异很大。大部分响应都需要4到8秒,但偶尔只需要150毫秒。
使用EC2监视器,所有3个节点的CPU利用率均为2.5%,峰值为8%。
在使用Kubernetes对项目进行docker化和部署之前,django代码托管在使用Nginx在ubuntu上运行的单个t2.meduim实例上。平均响应时间为〜300ms 。因此,我很确定Django API本身不应该导致速度下降。
我知道比较本地部署是不公平的,因为网络更简单,可用资源可能有所不同(2cpu 2.3GHz i5 Mac,2GB ram),但这是一个惊人的差异。
有人有类似的经历吗?对进一步调试情况有什么建议吗?