【发布时间】:2021-05-27 01:35:30
【问题描述】:
我进行了相当多的搜索,但似乎找不到任何能解决此问题的人。
我的 kubernetes 集群上出现间歇性 111 Connection denied 错误。似乎我的请求中大约 90% 成功,另外 10% 失败。如果您“刷新”页面,则先前失败的请求将成功。我有 2 个不同的 Kubernetes 集群,它们的设置完全相同,都显示了错误。
这看起来与我所经历的非常接近。我确实将我的设置安装到了一个新的集群上,但同样的问题仍然存在: Kubernetes ClusterIP intermittent 502 connection refused
设置
- Kubernetes 集群版本:1.18.12-gke.1206
- Django 版本:3.1.4
- Helm 管理 Kubernetes 图表
集群设置
Kubernetes nginx 入口控制器,为集群提供网络流量: https://kubernetes.github.io/ingress-nginx/deploy/#gce-gke
从那里我有 2 个入口定义了基于引荐来源网址的路由流量。
- 舞台入口
- 产品入口
入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: potr-tms-ingress-{{ .Values.environment }}
namespace: {{ .Values.environment }}
labels:
app: potr-tms-{{ .Values.environment }}
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
# this line below doesn't seem to have an effect
# nginx.ingress.kubernetes.io/service-upstream: "true"
nginx.ingress.kubernetes.io/proxy-body-size: "100M"
cert-manager.io/cluster-issuer: "letsencrypt-{{ .Values.environment }}"
spec:
rules:
- host: {{ .Values.ingress_host }}
http:
paths:
- path: /
backend:
serviceName: potr-tms-service-{{ .Values.environment }}
servicePort: 8000
tls:
- hosts:
- {{ .Values.ingress_host }}
- www.{{ .Values.ingress_host }}
secretName: potr-tms-{{ .Values.environment }}-tls
这些入口路由到我为 prod 和 stage 定义的 2 个服务:
服务
apiVersion: v1
kind: Service
metadata:
name: potr-tms-service-{{ .Values.environment }}
namespace: {{ .Values.environment }}
labels:
app: potr-tms-{{ .Values.environment }}
spec:
type: ClusterIP
ports:
- name: potr-tms-service-{{ .Values.environment }}
port: 8000
protocol: TCP
targetPort: 8000
selector:
app: potr-tms-{{ .Values.environment }}
这 2 个服务路由到我对 prod 和 stage 的部署:
部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: potr-tms-deployment-{{ .Values.environment }}
namespace: {{ .Values.environment }}
labels:
app: potr-tms-{{ .Values.environment }}
spec:
replicas: {{ .Values.deployment_replicas }}
selector:
matchLabels:
app: potr-tms-{{ .Values.environment }}
strategy:
type: RollingUpdate
template:
metadata:
annotations:
rollme: {{ randAlphaNum 5 | quote }}
labels:
app: potr-tms-{{ .Values.environment }}
spec:
containers:
- command: ["gunicorn", "--bind", ":8000", "config.wsgi"]
# - command: ["python", "manage.py", "runserver", "0.0.0.0:8000"]
envFrom:
- secretRef:
name: potr-tms-secrets-{{ .Values.environment }}
image: gcr.io/potrtms/potr-tms-{{ .Values.environment }}:latest
name: potr-tms-{{ .Values.environment }}
ports:
- containerPort: 8000
resources:
requests:
cpu: 200m
memory: 512Mi
restartPolicy: Always
serviceAccountName: "potr-tms-service-account-{{ .Values.environment }}"
status: {}
这似乎很清楚,如果我的部署 pod 失败或显示错误,它们将“不可用”并且服务将无法将它们路由到 pod。为了尝试调试它,我确实增加了我的部署资源和副本数。不过,这个应用的网络流量非常低,大约 10 个用户。
我的尝试
- 我尝试使用完全不同的入口控制器https://github.com/kubernetes/ingress-nginx
- 增加部署资源/副本数(似乎没有效果)
- 在全新的集群上安装我的整个设置(结果相同)
- 重启入口控制器/删除并重新安装
- 这听起来可能是 Gunicorn 问题。为了测试,我尝试使用 python manage.py runserver 启动我的 pod,但问题仍然存在。
更新
增加 pod 数量似乎有所帮助。
- 部署副本:15
- cpu 请求:200m
- 内存请求:512Mi
有些请求仍然失败。
【问题讨论】:
标签: django docker nginx kubernetes