【问题标题】:flask mongodb ServerSelectionTimeoutError running on kubernetes在 kubernetes 上运行的烧瓶 mongodb ServerSelectionTimeoutError
【发布时间】:2021-12-20 17:05:57
【问题描述】:

我有一个带有 mongodb 数据库的烧瓶应用程序,我正在尝试在 minikube 上部署。

我已将这两个应用程序容器化,并确定它们无需编排即可工作。

我确保在烧瓶之前启动 mongodb。

但是,在 kubernetes 中运行时出现以下错误。 kubectl 记录 flaskweb-deployment-7f6775bc8f-7q72j

Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import web_app, socketio
  File "/code/app/__init__.py", line 18, in <module>
    from .main import main as main_blueprint
  File "/code/app/main/__init__.py", line 5, in <module>
    from . import routes, events
  File "/code/app/main/routes.py", line 8, in <module>
    from .models import eInstance, eMessage
  File "/code/app/main/models.py", line 24, in <module>
    if eInstance.objects().first() is None:
  File "/usr/local/lib/python3.8/dist-packages/mongoengine/queryset/manager.py", line 38, in __get__
    queryset = queryset_class(owner, owner._get_collection())
  File "/usr/local/lib/python3.8/dist-packages/mongoengine/document.py", line 223, in _get_collection
    if cls._meta.get("auto_create_index", True) and db.client.is_primary:
  File "/usr/local/lib/python3.8/dist-packages/pymongo/mongo_client.py", line 1088, in is_primary
    return self._server_property('is_writable')
  File "/usr/local/lib/python3.8/dist-packages/pymongo/mongo_client.py", line 889, in _server_property
    server = self._topology.select_server(
  File "/usr/local/lib/python3.8/dist-packages/pymongo/topology.py", line 244, in select_server
    return random.choice(self.select_servers(selector,
  File "/usr/local/lib/python3.8/dist-packages/pymongo/topology.py", line 202, in select_servers
    server_descriptions = self._select_servers_loop(
  File "/usr/local/lib/python3.8/dist-packages/pymongo/topology.py", line 218, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: 10.97.8.16:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 6187e39295442839a2d95a49, topology_type: Single, servers: [<ServerDescription ('10.97.8.16', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('10.97.8.16:27017: [Errno 111] Connection refused')>]>

我查看了所有与此问题相关的帖子,但无法将这些问题与我的实施相匹配。

Dockerfiles mongodb

FROM ubuntu:18.04
RUN apt update; apt install -y gnupg2 
RUN apt install -y software-properties-common

# Installation
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

RUN add-apt-repository 'deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse'

RUN apt-get update && apt install -y mongodb-org

RUN mkdir /data

RUN mkdir /data/db


# Start db
#RUN mongod --bind_ip=0.0.0.0 &

EXPOSE 27017
# Set entrypoint
ENTRYPOINT ["usr/bin/mongod", "--bind_ip=0.0.0.0"]

蟒蛇烧瓶

FROM ubuntu:latest
RUN apt update; apt install -y gnupg2
WORKDIR /code
COPY . /code/
RUN apt install -y python3-pip
RUN pip3 install -r requirements.txt
ENV PYTHONPATH /code
EXPOSE 8080
ENTRYPOINT [ "python3" ]
CMD [ "run.py" ]

用于部署和服务的 yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-deployment
  labels:
    app: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - name: mongodb
        image: mongodb:v1
        imagePullPolicy: Never
        ports:
        - containerPort: 27017
      volumes:
            - name: mongo-persistent-storage
              mountPath: /data/db
      volumes:
        - name: mongo-persistent-storage

serviceDB.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    name: mongodb-service
  name: mongodb-service
spec:
  ports:
    - port: 27017
      targetPort: 27017
  selector:
    app: mongodb

webserver-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flaskweb-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: flaskweb
  template:
    metadata:
      labels:
        app: flaskweb
    spec:
      containers:
        - name: flaskweb
          image: flaskweb:v1
          ports:
            - containerPort: 8080

serviceWEB.yaml

apiVersion: v1
kind: Service
metadata:
  name: flaskweb-service
spec:
  selector:
        app: flaskweb
  type: NodePort
  ports:
    - protocol: "TCP"
      port: 8080
      targetPort: 8080
      nodePort: 30100

kubectl 获取 pod

NAME                                   READY   STATUS    RESTARTS      AGE
flaskweb-deployment-7f6775bc8f-7q72j   0/1     Error     1 (40s ago)   74s
flaskweb-deployment-7f6775bc8f-lpwlz   0/1     Error     1 (40s ago)   74s
flaskweb-deployment-7f6775bc8f-pvnjz   0/1     Error     1 (40s ago)   74s
mongodb-deployment-867998dcff-786tv    1/1     Running   0             6m29s

NAME                                   READY   STATUS             RESTARTS       AGE
flaskweb-deployment-7f6775bc8f-7q72j   0/1     CrashLoopBackOff   9 (94s ago)    27m
flaskweb-deployment-7f6775bc8f-lpwlz   0/1     CrashLoopBackOff   9 (85s ago)    27m
flaskweb-deployment-7f6775bc8f-pvnjz   0/1     CrashLoopBackOff   9 (111s ago)   27m
mongodb-deployment-867998dcff-786tv    1/1     Running            0              33m

kubectl 获取服务

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
flaskweb-service   NodePort    10.105.225.55   <none>        8080:30100/TCP   2s
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP          23h
mongodb-service    ClusterIP   10.97.8.16      <none>        27017/TCP        24m

config.py中的mongodb设置

MONGODB_SETTINGS = {'db': 'mongodb', 'host': '10.97.8.16', 'port': 27017} 

kubectl 描述 pod flaskweb-deployment-7f6775bc8f-7q72j

Name:         flaskweb-deployment-7f6775bc8f-7q72j
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Sun, 07 Nov 2021 14:31:31 +0000
Labels:       app=flaskweb
              pod-template-hash=7f6775bc8f
Annotations:  <none>
Status:       Running
IP:           172.17.0.6
IPs:
  IP:           172.17.0.6
Controlled By:  ReplicaSet/flaskweb-deployment-7f6775bc8f
Containers:
  flaskweb:
    Container ID:   docker://93d1a5c0dfb69feadb8b1c252a3ad4635342e5117c2814f838e651cf0e9f13d9
    Image:          flaskweb:v1
    Image ID:       docker://sha256:eaf719a9964b4de784f2a56951e9d058e41f7201a7db25d26a5100539841e25b
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Sun, 07 Nov 2021 14:57:17 +0000
      Finished:     Sun, 07 Nov 2021 14:57:49 +0000
    Ready:          False
    Restart Count:  9
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-hchq9 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  kube-api-access-hchq9:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  29m                   default-scheduler  Successfully assigned default/flaskweb-deployment-7f6775bc8f-7q72j to minikube
  Normal   Created    25m (x5 over 29m)     kubelet            Created container flaskweb
  Normal   Started    25m (x5 over 29m)     kubelet            Started container flaskweb
  Normal   Pulled     9m3s (x9 over 29m)    kubelet            Container image "flaskweb:v1" already present on machine
  Warning  BackOff    3m58s (x94 over 27m)  kubelet            Back-off restarting failed container

编辑: 我在服务 yaml 中使用 app 而不是 name 来匹配选择器。

仍然出现以下错误:

Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import web_app, socketio
  File "/code/app/__init__.py", line 18, in <module>
    from .main import main as main_blueprint
  File "/code/app/main/__init__.py", line 5, in <module>
    from . import routes, events
  File "/code/app/main/routes.py", line 8, in <module>
    from .models import eInstance, eMessage
  File "/code/app/main/models.py", line 24, in <module>
    if eInstance.objects().first() is None:
  File "/usr/local/lib/python3.8/dist-packages/mongoengine/queryset/manager.py", line 38, in __get__
    queryset = queryset_class(owner, owner._get_collection())
  File "/usr/local/lib/python3.8/dist-packages/mongoengine/document.py", line 223, in _get_collection
    if cls._meta.get("auto_create_index", True) and db.client.is_primary:
  File "/usr/local/lib/python3.8/dist-packages/pymongo/mongo_client.py", line 1088, in is_primary
    return self._server_property('is_writable')
  File "/usr/local/lib/python3.8/dist-packages/pymongo/mongo_client.py", line 889, in _server_property
    server = self._topology.select_server(
  File "/usr/local/lib/python3.8/dist-packages/pymongo/topology.py", line 244, in select_server
    return random.choice(self.select_servers(selector,
  File "/usr/local/lib/python3.8/dist-packages/pymongo/topology.py", line 202, in select_servers
    server_descriptions = self._select_servers_loop(
  File "/usr/local/lib/python3.8/dist-packages/pymongo/topology.py", line 218, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: 10.97.8.16:27017: timed out, Timeout: 30s, Topology Description: <TopologyDescription id: 61880d44d1e4d98ec7db8557, topology_type: Single, servers: [<ServerDescription ('10.97.8.16', 27017) server_type: Unknown, rtt: None, error=NetworkTimeout('10.97.8.16:27017: timed out')>]>

最终编辑: 系统资源不足。 docker system prune 有帮助。

【问题讨论】:

    标签: python mongodb flask kubernetes minikube


    【解决方案1】:

    这里的问题是你的服务配置为 mongodb。

    ~$ kubectl explain service.spec.selector
    KIND:     Service
    VERSION:  v1
    
    FIELD:    selector <map[string]string>
    
    DESCRIPTION:
         Route service traffic to pods with label keys and values matching this
         selector. If empty or not present, the service is assumed to have an
         external process managing its endpoints, which Kubernetes will not modify.
         Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if
         type is ExternalName. More info:
         https://kubernetes.io/docs/concepts/services-networking/service/
    

    从上面可以看出,选择器使用 pod 标签键和值来了解要服务的 pod。

    如果你运行命令

    ~$ kubectl get endpoints mongodb-service
    

    您应该看到您的服务背后没有端点。原因是您的服务没有正确选择 pod。目前你有这个选择器:

    selector:
      name: mongodb
    

    但您的 pod 的标签不同:

    labels:
      app: mongodb
    

    只需将 mongodb 服务清单中的 name 更改为 app 即可解决此问题。

    我想提请您注意的另一件事是,您在烧瓶中的 mongodb 配置中使用静态设置的服务 IP 地址。

    MONGODB_SETTINGS = {'db': 'mongodb', 'host': '10.97.8.16', 'port': 27017} 
    

    这不是一个好方法。更好的方法是使用服务名称并让 kubedns 负责名称解析。

    【讨论】:

    • 谢谢,我修复了选择器错误。不过,我仍然在烧瓶日志中遇到同样的错误。
    • @Ozixic 尝试执行到烧瓶 pod 中,看看您是否可以手动访问 mongodb 服务。您现在看到服务背后的端点了吗?
    • 我可以手动访问mongodb服务
    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多