Kubernetes Pod Object封装了PostgreSQL docker图像崩溃的无限循环

时间:2018-05-28 08:27:52

标签: django postgresql docker kubernetes

我正在尝试在Kubernetes Google Cloud集群上运行我的Django + PostgreSQL应用程序。我已成功部署以下文件:

  1. Django App部署
  2. Django App Service
  3. Kubernetes数据库凭据的秘密对象
  4. PersistentVolumeClaim
  5. 但是我在将PostgreSQL数据库部署到集群时遇到了麻烦。这是我的.yml文件的定义:

    apiVersion: v1
    kind: Service
    metadata:
      name: postgres-service
    spec:
      selector:
        app: postgres-container
        tier: backend
      ports:
        - protocol: TCP
          port: 5432
          targetPort: 5432
      type: ClusterIP
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: postgres-pvc
      labels:
        type: local
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi
    ---
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      name: postgres
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: postgres-container
          tier: backend
      template:
        metadata:
          labels:
            app: postgres-container
            tier: backend
        spec:
          containers:
            - name: postgres-container
              image: postgres:9.6.6
              env:
                - name: POSTGRES_USER
                  valueFrom:
                    secretKeyRef:
                      name: postgres-credentials
                      key: user
    
                - name: POSTGRES_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: postgres-credentials
                      key: password
    
                - name: POSTGRES_DB
                  value: agent_technologies_db
              ports:
                - containerPort: 5432
              volumeMounts:
                - name: postgres-volume-mount
                  mountPath: /var/lib/postgresql/data
    
          volumes:
            - name: postgres-volume-mount
              persistentVolumeClaim:
                claimName: postgres-pvc
            - name: postgres-credentials
              secret:
                secretName: postgres-credentials
    

    这是我运行kubectl logs postgres-85c56dfb9b-95c74命令时出现的错误:

    initdb: directory "/var/lib/postgresql/data" exists but is not empty
    It contains a lost+found directory, perhaps due to it being a mount point.
    Using a mount point directly as the data directory is not recommended.
    Create a subdirectory under the mount point.
    The files belonging to this database system will be owned by user "postgres".
    This user must also own the server process.
    
    The database cluster will be initialized with locale "en_US.utf8".
    The default database encoding has accordingly been set to "UTF8".
    The default text search configuration will be set to "english".
    

    有人可以向我解释这个错误。提前谢谢!

    ***** UPDATE ******

    当我运行kubectl logs $pod时,我收到以下错误(即使容器在群集上正在运行):

    Host: 10.52.1.5
    Production - Using "POSTGRESQL" Database
    /usr/local/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
      """)
    Host: 10.52.1.5
    Production - Using "POSTGRESQL" Database
    /usr/local/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
      """)
    Performing system checks...
    
    System check identified no issues (0 silenced).
    Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f62f4c948c8>
    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
        self.connect()
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 194, in connect
        self.connection = self.get_new_connection(conn_params)
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/postgresql/base.py", line 168, in get_new_connection
        connection = Database.connect(**conn_params)
      File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
        conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
    psycopg2.OperationalError: could not connect to server: No such file or directory
            Is the server running locally and accepting
            connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
    
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/site-packages/django/utils/autoreload.py", line 225, in wrapper
        fn(*args, **kwargs)
      File "/usr/local/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 124, in inner_run
        self.check_migrations()
      File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 427, in check_migrations
        executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
      File "/usr/local/lib/python3.6/site-packages/django/db/migrations/executor.py", line 18, in __init__
        self.loader = MigrationLoader(self.connection)
      File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 49, in __init__
        self.build_graph()
      File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 206, in build_graph
        self.applied_migrations = recorder.applied_migrations()
      File "/usr/local/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 61, in applied_migrations
        if self.has_table():
      File "/usr/local/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 44, in has_table
        return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 255, in cursor
        return self._cursor()
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 232, in _cursor
        self.ensure_connection()
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
        self.connect()
      File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
        raise dj_exc_value.with_traceback(traceback) from exc_value
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
        self.connect()
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 194, in connect
        self.connection = self.get_new_connection(conn_params)
      File "/usr/local/lib/python3.6/site-packages/django/db/backends/postgresql/base.py", line 168, in get_new_connection
        connection = Database.connect(**conn_params)
      File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
        conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
    django.db.utils.OperationalError: could not connect to server: No such file or directory
            Is the server running locally and accepting
            connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
    

    这是来自我的settings.py文件:

    import socket
    
    print("Host: "+socket.gethostbyname(socket.gethostname()))
    
    
    if(os.getenv('POSTGRES_DB_HOST')==None):
        print('Development - Using "SQLITE3" Database')
        DATABASES = {
            'default':{
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR,'db.sqlite3'),
            }
        }
    else:
        print('Production - Using "POSTGRESQL" Database')
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.postgresql_psycopg2',
                'NAME': 'agent_technologies_db',
                'USER': 'stefan_radonjic',
                'PASSWORD': 'cepajecar995',
                'HOST': os.getenv('POSTGRES_HOST'),
                'PORT': os.getenv('POSTGRES_PORT'),
                }
        }
    

    当我运行kubectl logs $pod命令时,我得到的错误可能是因为PostgreSQL contianer没有运行而无法找到它或者?如果有人对我项目的其他文件感兴趣,请访问github链接:https://github.com/StefanCepa/agent-technologies-bachelor

1 个答案:

答案 0 :(得分:1)

对我来说这看起来不是一个错误,更像是一个警告。 PostgreSQL抱怨你应该为Postgres数据文件夹使用一个完全空的目录。应用程序告诉您要做的是在卷内创建一个空目录,并在该特定子目录中创建。这可以通过以下方式完成:

  • 在卷中创建一个子目录,您可以使用例如一个安装卷的initContainer并创建目录。

  • 现在您有一个创建目录的卷,然后您可以修改Postgres中的postgres-volume-mount并将subPath添加到新创建的目录中。

        - name: postgres-volume-mount
          mountPath: /var/lib/postgresql/data
          subPath: NAME_OF_YOUR_SUBDIRECTORY