Kubernetes-封装DB的Pod崩溃 [英] Kubernetes - Pod which encapsulates DB is crashing

查看:85
本文介绍了Kubernetes-封装DB的Pod崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试将Django应用程序部署到Kubernetes集群时遇到问题.更具体地说,当我尝试部署PostgreSQL时.

I am experiencing issues when I try to deploy my Django application to Kubernetes cluster. More specifically, when I try to deploy PostgreSQL.

.YML部署文件如下所示:

Here is what my .YML deployment file looks like:

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: PersistentVolume
metadata:
  name: postgres-pv
  labels:
      type: local
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 2Gi
  hostPath:
    path: /tmp/data/persistent-volume-1 #U okviru cvora n
  persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pv-claim
  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/db-files

      volumes:
        - name: postgres-volume-mount
          persistentVolumeClaim:
            claimName: postgres-pv-claim
        - name: postgres-credentials
          secret:
            secretName: postgres-credentials

这是我运行kubectl get pods命令时得到的:

Here is what I get when I run kubectl get pods command :

NAME                                             READY     STATUS             RESTARTS   AGE
agent-technologies-deployment-7c7c6676ff-8p49r   1/1       Running            0          2m
agent-technologies-deployment-7c7c6676ff-dht5h   1/1       Running            0          2m
agent-technologies-deployment-7c7c6676ff-gn8lp   1/1       Running            0          2m
agent-technologies-deployment-7c7c6676ff-n9qql   1/1       Running            0          2m
postgres-8676b745bf-8f7jv                        0/1       CrashLoopBackOff   4          3m

这是当我尝试使用kubectl logs $pod_name检查PostgreSQL部署的情况时得到的结果:

And here is what I get when I try to inspect what is going on with PostgreSQL deployment by using kubectl logs $pod_name:

initdb: directory "/var/lib/postgresql/data" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/var/lib/postgresql/data" or run initdb
with an argument other than "/var/lib/postgresql/data".
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".

Data page checksums are disabled.

注意:我正在使用Google Cloud作为提供程序.

Note: I am using Google Cloud as a provider.

推荐答案

您不能在/var/lib/postgres/data/whatever中拥有数据库.

You can't have your db in /var/lib/postgres/data/whatever.

通过/var/lib/postgres/whatever更改该路径,它将起作用.

Change that path by /var/lib/postgres/whatever and it will work.

17.2.1.辅助文件系统的使用

许多安装程序都在文件系统(卷)上创建其数据库集群,而不是计算机的根"目录.体积.如果选择执行此操作,建议不要尝试使用辅助卷的最顶层目录(装入点)作为数据目录.最佳实践是在PostgreSQL用户拥有的安装点目录中创建一个目录,然后在其中创建数据目录.这样可以避免权限问题,尤其是对于诸如pg_upgrade之类的操作,还可以确保在将辅助卷脱机后清除失败.

Many installations create their database clusters on file systems (volumes) other than the machine's "root" volume. If you choose to do this, it is not advisable to try to use the secondary volume's topmost directory (mount point) as the data directory. Best practice is to create a directory within the mount-point directory that is owned by the PostgreSQL user, and then create the data directory within that. This avoids permissions problems, particularly for operations such as pg_upgrade, and it also ensures clean failures if the secondary volume is taken offline.

而且,顺便说一下,我必须创建一个秘密,因为它不在帖子中:

And, by the way, I had to create a secret, as it is not in the post:

apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
type: Opaque
data:
  user: cG9zdGdyZXM=            #postgres
  password: cGFzc3dvcmQ=        #password

请注意,用户名必须为"postgres".我不知道你是否在报道...

Note that the username needs to be "postgres". I don't know if you are covering this...

这篇关于Kubernetes-封装DB的Pod崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆