【问题标题】:Kubernetes - Pod which encapsulates DB is crashingKubernetes - 封装 DB 的 Pod 崩溃
【发布时间】:2018-06-19 06:20:41
【问题描述】:

我在尝试将 Django 应用程序部署到 Kubernetes 集群时遇到问题。更具体地说,当我尝试部署 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: 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 命令时得到的结果:

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 部署的情况时,我得到了以下结果:

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 作为提供商。

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

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

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

    17.2.1。使用辅助文件系统

    许多安装在计算机的“根”卷之外的文件系统(卷)上创建它们的数据库集群。如果您选择这样做,建议不要尝试使用辅助卷的最顶层目录(安装点)作为数据目录。最佳实践是在 PostgreSQL 用户拥有的挂载点目录中创建一个目录,然后在其中创建数据目录。这样可以避免权限问题,尤其是对于 pg_upgrade 等操作,并且还可以确保在辅助卷脱机时彻底失败。

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

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

    请注意,用户名必须是“postgres”。我不知道你是否在报道这个......

    【讨论】:

    • 我有 secrets.yml 文件,只是忘记放了。顺便说一句,这行得通!太感谢了!您能否简要解释一下为什么我必须更改数据库路径以及为什么使用默认数据库?
    • 我更新了答案。挂载点是您的 data 文件夹。如果这样做会引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多