当前位置: 首页 > 知识库问答 >
问题:

Django/Google库伯内特斯间歇性111:拒绝与上游服务的连接

王飞英
2023-03-14

我做了很多搜索,似乎找不到任何能解决这个问题的人。

我的kubernetes群集上有间歇性的111个连接拒绝错误。似乎我的请求中有90%成功,另外10%失败。如果您“刷新”页面,以前失败的请求将会成功。我有两个不同的库伯内特斯群集,它们具有相同的完全设置,都显示了错误。

这看起来和我的经历非常接近。我确实在一个新集群上安装了我的安装程序,但同样的问题依然存在:Kubernetes ClusterIP间歇性502连接被拒绝

安装程序

  • 库伯内特斯集群版本:1.18.12-gke.1206
  • Django版本:3.1.4
  • 掌舵管理kubernetes图表

集群设置

Kubernetes nginx入口控制器,为进入集群的网络流量提供服务:https://kubernetes.github.io/ingress-nginx/deploy/#gce-gke

从那里我有2入口定义的路由流量基于引用URL。

  1. 舞台入口
  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定义的两个服务:

服务

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 }}

这两项服务是我为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: {}

这似乎很清楚,如果我的部署吊舱出现故障或显示错误,它们将“不可用”,服务将无法将它们路由到吊舱。为了尝试并调试它,我增加了部署资源和副本数。不过,该应用的网络流量非常低,大约有10个用户。

我试过的

  1. 我试过用完全不同的入口控制器https://github.com/kubernetes/ingress-nginx
  2. 增加部署资源/副本计数(似乎没有效果)
  3. 在一个全新的集群上安装我的整个设置(相同的结果)
  4. 重启入口控制器/删除并重新安装
  5. 听起来这可能是一个GUnicorn问题。为了测试我尝试用pythonmanage.pyrunserver启动我的pod,问题仍然存在。

使现代化

提高豆荚数量似乎有点帮助。

  • 部署副本:15个
  • cpu请求:200米
  • 内存请求:512Mi

有些请求仍然失败。

共有2个答案

澹台浩广
2023-03-14

我无法找出这些连接错误发生的原因,但我确实找到了一种解决用户问题的方法。

在入口配置中添加注释

nginx。进入。库伯内特斯。io/proxy下一个上行尝试:“10”

我把它设置为10只是为了确保它重试,因为我很有信心我们的服务是有效的。你可能会逃脱2或3。

这是我的全部入口。亚马尔

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"
#    nginx.ingress.kubernetes.io/service-upstream: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "100M"
    nginx.ingress.kubernetes.io/client-body-buffer-size: "100m"
    nginx.ingress.kubernetes.io/proxy-max-temp-file-size: "1024m"
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "10"
    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
后星河
2023-03-14

你找到解决办法了吗?我在minikube上看到了非常相似的设置。

在我的例子中,我相信我也看到nginx控制器在502之后重新启动。502是间歇性的,通常第一次访问失败,然后重新加载工作。

到目前为止,我发现最好的办法是增加Nginx timeout参数,但我还没有尝试过。仍在努力寻找所有选项。

 类似资料:
  • 我一直在尝试建立库伯内特斯星系团。 我在数字海洋上有两个UbuntuDrople,我用它们来做这件事。 我现在试图为我的docker凭据创建一个秘密,以便我可以在节点上拉私有映像,但是当我运行此命令(或任何其他kubectl命令,例如kubectl获取节点)时,我得到这个错误:到服务器的连接localhost:8080被拒绝-您指定正确的主机或端口吗? 然而,这一切都是因为kubectl本身显示了

  • 问题内容: 当我发表评论时,不要保存,崩溃(错误:[Errno 111]连接被拒绝),为什么? views.py models.py 管理员 问题答案: 为了进行调试,你可以使用以下命令设置本地smtpserver: 并相应地调整你的邮件设置:

  • 我是Kubernetes平台的新手,尝试启用部署在Kubernetes平台上的tomcat web app的HTTPS安全连接。我对舱单感到困惑。与部署、服务和入口控制器相关的yml。 那么,我是否也必须在部署(在端口:-containerPort:8080)服务(如端口:-端口:80 targetPort:8080协议:TCP名称:http)和入口(在后端:serviceName:tomcat

  • 我只是在本地mac上使用mini kube设置kubernetes。 创建了一个类型为NodePort的服务,并且能够使用url

  • 问题内容: 我有一台运行Ubuntu 12.04 LTS和MongoDB实例(服务正在运行并且可以在本地连接)的Linode服务器,我无法从外部来源连接到该服务器。 我已经将这两个规则添加到我的IP表中,其中 是我要连接FROM的服务器(如本 MongoDB参考中所述): 而且我在IP表中看到了一条规则,该规则允许27017与 之间的连接,但是当我尝试使用以下命令从 连接到我的mongo数据库时:

  • 问题内容: 我正在尝试将Redis用作我的使用Docker Compose的Django项目的Celery的代理。我无法弄清楚我到底做错了什么,但是尽管控制台日志消息告诉我Redis正在运行并接受连接(实际上,当我这样做时,我可以看到容器正在运行),但我仍然会收到有关拒绝连接的错误消息。我什至做到了 看到回应是。 这是my中的Celery设置: 这是my中的Redis容器设置: 我还记得将容器与我